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); } }
Diff: SlowPWM.cpp
- Revision:
- 1:386d04fe1e37
- Parent:
- 0:76861123625b
- Child:
- 2:c90e2d2f52aa
--- a/SlowPWM.cpp Tue Jun 18 10:52:51 2019 +0000 +++ b/SlowPWM.cpp Tue Jun 18 16:22:56 2019 +0000 @@ -1,19 +1,19 @@ -#include "slowPWM.h" +#include "SlowPWM.h" -slowPWM::slowPWM(const PinName pin ):DigitalOut(pin) +SlowPWM::SlowPWM(const PinName pin ):DigitalOut(pin) { _repeatTime=1; _timeOn=0.5f; } -slowPWM::slowPWM( float period, float highTime, const PinName pin ):DigitalOut(pin) +SlowPWM::SlowPWM( float period, float highTime, const PinName pin ):DigitalOut(pin) { setPeriod(period); setHighTime(highTime); start(); } -void slowPWM::setPeriod(float period) +void SlowPWM::setPeriod(float period) { _repeatTime = period; if (_repeatTime <= 0) // check it's not 0 or negative @@ -21,39 +21,39 @@ setHighTime(_timeOn); // perform sanity check on high time } -void slowPWM::setHighTime(float highTime) +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) { +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() +void SlowPWM::stop() { cycleTimer.detach(); } // start things. -void slowPWM::start() +void SlowPWM::start() { - cycleTimer.attach(callback(this,&slowPWM::onCycleStart),_repeatTime); + cycleTimer.attach(callback(this,&SlowPWM::onCycleStart),_repeatTime); onCycleStart(); } -void slowPWM::onTurnOff(void) +void SlowPWM::onTurnOff(void) { write(0); } -void slowPWM::onCycleStart(void) +void SlowPWM::onCycleStart(void) { - offTimer.attach(callback(this,&slowPWM::onTurnOff),_timeOn); + offTimer.attach(callback(this,&SlowPWM::onTurnOff),_timeOn); write(1); }