Very simple class to give slow speed PWM using timers and digital out.

Example use...

#include "SlowPWM.h"
SlowPWM MyTimer1(LED1);
SlowPWM MyTimer2(LED2);
SlowPWM MyTimer3(LED3);

main()
{
    MyTimer1.setPeriod(4);
    MyTimer1.setHighTime(2);
    MyTimer1.start();
    MyTimer2.setPeriod(2);
    MyTimer2.setHighTime(1.5);
    MyTimer2.start();
    MyTimer3.setPeriod(3.8);
    MyTimer3.setHighTime(1.5);
    MyTimer3.start();
    while(true) {
        wait(1);
    }
}

SlowPWM.cpp

Committer:
AndyA
Date:
2019-06-18
Revision:
0:76861123625b
Child:
1:386d04fe1e37

File content as of revision 0:76861123625b:

#include "slowPWM.h"
 
slowPWM::slowPWM(const PinName pin ):DigitalOut(pin)
{
    _repeatTime=1;
    _timeOn=0.5f;
}
 
slowPWM::slowPWM( float period, float highTime, const PinName pin ):DigitalOut(pin)
{
    setPeriod(period);
    setHighTime(highTime);
    start();
}
 
void slowPWM::setPeriod(float period)
{
    _repeatTime = period;
    if (_repeatTime <= 0)   // check it's not 0 or negative
        _repeatTime = 1;
    setHighTime(_timeOn);  // perform sanity check on high time
}
 
void slowPWM::setHighTime(float highTime)
{
    _timeOn = highTime;
    if (_timeOn >= _repeatTime)  // check it's not more than the cycle time.
        _timeOn = _repeatTime/2; // set to 50% if invalid 
}
 
void slowPWM::setDutyCycle(float cycle) {
        if ((cycle >=0) && (cycle <=1)) {
        _timeOn = _repeatTime*cycle; 
        } else
        _timeOn = _repeatTime/2; // set to 50% if invalid 
}
 
void slowPWM::stop()
{
    cycleTimer.detach();
}
 
// start things.
void slowPWM::start()
{
    cycleTimer.attach(callback(this,&slowPWM::onCycleStart),_repeatTime);
    onCycleStart();
}
 
void slowPWM::onTurnOff(void)
{
    write(0);
}
 
void slowPWM::onCycleStart(void)
{
    offTimer.attach(callback(this,&slowPWM::onTurnOff),_timeOn);
    write(1);
}