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@3:3f7eb3ad23d4, 2019-06-21 (annotated)
- 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?
User | Revision | Line number | New 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 | } |