Output PWM on any pin. Partly based on SoftPWM with some improvements
SoftPwmOut.cpp
- Committer:
- gagarcr
- Date:
- 2015-09-03
- Revision:
- 0:813ee8141cdd
File content as of revision 0:813ee8141cdd:
#include "mbed.h" #include "InterruptIn.h" #include "SoftPwmOut.h" SoftPwmOut::SoftPwmOut(PinName pin) : _outPin(pin) // Constructor definition. Assign _out { _interval = 0.1; // Default fequency _width = 0; start(); } float SoftPwmOut::read() { return _width / _interval; } void SoftPwmOut::write(float duty) { _width = _interval * duty; if ( duty <= 0.0 ) _width = 0.0; if ( duty > 1.0 ) _width = _interval; } void SoftPwmOut::start() { _ticker.attach(this,&SoftPwmOut::TickerInterrupt,_interval); } void SoftPwmOut::stop() { _ticker.detach(); //wait(width); } void SoftPwmOut::period(float period) { _interval = period; start(); } void SoftPwmOut::period_ms(int period) { SoftPwmOut::period((float)period / 1000); start(); } void SoftPwmOut::period_us(int period) { SoftPwmOut::period((float)period / 1000000); start(); } void SoftPwmOut::pulsewidth(float width) { _width = width; if ( _width < 0.0 ) _width = 0.0; if ( _width > _interval) _width = _interval; } void SoftPwmOut::pulsewidth_ms(int width) { SoftPwmOut::pulsewidth((float)width / 1000); } void SoftPwmOut::pulsewidth_us(int width) { SoftPwmOut::pulsewidth((float)width / 1000000); } void SoftPwmOut::TickerInterrupt() { _outPin = 0; if ( _width <= 0 ) return; _timeout.attach(this,&SoftPwmOut::end,_width); } void SoftPwmOut::end() { _outPin = 1; // _timeout.detach(); } ;