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);
    }
}
Committer:
AndyA
Date:
Fri Jun 21 09:45:08 2019 +0000
Revision:
3:3f7eb3ad23d4
Parent:
2:c90e2d2f52aa
Added auto start stop to setHighTime;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 1:386d04fe1e37 1 #include "SlowPWM.h"
AndyA 3:3f7eb3ad23d4 2
AndyA 1:386d04fe1e37 3 SlowPWM::SlowPWM(const PinName pin ):DigitalOut(pin)
AndyA 0:76861123625b 4 {
AndyA 0:76861123625b 5 _repeatTime=1;
AndyA 0:76861123625b 6 _timeOn=0.5f;
AndyA 0:76861123625b 7 }
AndyA 3:3f7eb3ad23d4 8
AndyA 2:c90e2d2f52aa 9 SlowPWM::SlowPWM( const PinName pin, const float period, const float highTime ):DigitalOut(pin)
AndyA 0:76861123625b 10 {
AndyA 0:76861123625b 11 setPeriod(period);
AndyA 0:76861123625b 12 setHighTime(highTime);
AndyA 0:76861123625b 13 start();
AndyA 0:76861123625b 14 }
AndyA 3:3f7eb3ad23d4 15
AndyA 2:c90e2d2f52aa 16 void SlowPWM::setPeriod(const float period)
AndyA 0:76861123625b 17 {
AndyA 0:76861123625b 18 _repeatTime = period;
AndyA 0:76861123625b 19 if (_repeatTime <= 0) // check it's not 0 or negative
AndyA 0:76861123625b 20 _repeatTime = 1;
AndyA 0:76861123625b 21 setHighTime(_timeOn); // perform sanity check on high time
AndyA 0:76861123625b 22 }
AndyA 3:3f7eb3ad23d4 23
AndyA 2:c90e2d2f52aa 24 void SlowPWM::setHighTime(const float highTime)
AndyA 0:76861123625b 25 {
AndyA 3:3f7eb3ad23d4 26 if (highTime == 0) {
AndyA 3:3f7eb3ad23d4 27 stop();
AndyA 3:3f7eb3ad23d4 28 write(0);
AndyA 3:3f7eb3ad23d4 29 } else if (highTime >= _repeatTime) {
AndyA 3:3f7eb3ad23d4 30 stop();
AndyA 3:3f7eb3ad23d4 31 write(1);
AndyA 3:3f7eb3ad23d4 32 } else {
AndyA 3:3f7eb3ad23d4 33 _timeOn = highTime;
AndyA 3:3f7eb3ad23d4 34 start();
AndyA 3:3f7eb3ad23d4 35 }
AndyA 0:76861123625b 36 }
AndyA 3:3f7eb3ad23d4 37
AndyA 3:3f7eb3ad23d4 38 void SlowPWM::setDutyCycle(const float cycle)
AndyA 3:3f7eb3ad23d4 39 {
AndyA 3:3f7eb3ad23d4 40 if (cycle == 1) {
AndyA 3:3f7eb3ad23d4 41 stop();
AndyA 3:3f7eb3ad23d4 42 write(1);
AndyA 3:3f7eb3ad23d4 43 } else if (cycle == 0) {
AndyA 3:3f7eb3ad23d4 44 stop();
AndyA 3:3f7eb3ad23d4 45 write(0);
AndyA 3:3f7eb3ad23d4 46 } else if ((cycle >0) && (cycle <1)) {
AndyA 3:3f7eb3ad23d4 47 _timeOn = _repeatTime*cycle;
AndyA 2:c90e2d2f52aa 48 start();
AndyA 3:3f7eb3ad23d4 49 } else
AndyA 3:3f7eb3ad23d4 50 _timeOn = _repeatTime/2; // set to 50% if invalid
AndyA 0:76861123625b 51 }
AndyA 3:3f7eb3ad23d4 52
AndyA 1:386d04fe1e37 53 void SlowPWM::stop()
AndyA 0:76861123625b 54 {
AndyA 2:c90e2d2f52aa 55 offTimer.detach();
AndyA 0:76861123625b 56 cycleTimer.detach();
AndyA 0:76861123625b 57 }
AndyA 3:3f7eb3ad23d4 58
AndyA 0:76861123625b 59 // start things.
AndyA 1:386d04fe1e37 60 void SlowPWM::start()
AndyA 0:76861123625b 61 {
AndyA 1:386d04fe1e37 62 cycleTimer.attach(callback(this,&SlowPWM::onCycleStart),_repeatTime);
AndyA 0:76861123625b 63 onCycleStart();
AndyA 0:76861123625b 64 }
AndyA 3:3f7eb3ad23d4 65
AndyA 1:386d04fe1e37 66 void SlowPWM::onTurnOff(void)
AndyA 0:76861123625b 67 {
AndyA 0:76861123625b 68 write(0);
AndyA 0:76861123625b 69 }
AndyA 3:3f7eb3ad23d4 70
AndyA 1:386d04fe1e37 71 void SlowPWM::onCycleStart(void)
AndyA 0:76861123625b 72 {
AndyA 1:386d04fe1e37 73 offTimer.attach(callback(this,&SlowPWM::onTurnOff),_timeOn);
AndyA 0:76861123625b 74 write(1);
AndyA 0:76861123625b 75 }