Dependencies:   IAP

Committer:
komaida424
Date:
Fri Nov 15 20:53:36 2013 +0000
Revision:
2:59ac9df97701
Child:
4:4060309b9cc0
ver.1.25

Who changed what in which revision?

UserRevisionLine numberNew contents of line
komaida424 2:59ac9df97701 1 #include "mbed.h"
komaida424 2:59ac9df97701 2 #include "InterruptIn.h"
komaida424 2:59ac9df97701 3 #include "SoftPWM.h"
komaida424 2:59ac9df97701 4
komaida424 2:59ac9df97701 5 SoftPWM::SoftPWM(PinName _outpin,bool _positive) : pulse(_outpin) //constructa
komaida424 2:59ac9df97701 6 {
komaida424 2:59ac9df97701 7 if ( _positive )
komaida424 2:59ac9df97701 8 pulse = 0;
komaida424 2:59ac9df97701 9 else
komaida424 2:59ac9df97701 10 pulse = 1;
komaida424 2:59ac9df97701 11 positive = _positive;
komaida424 2:59ac9df97701 12 interval = 0.02;
komaida424 2:59ac9df97701 13 width = 0;
komaida424 2:59ac9df97701 14 start();
komaida424 2:59ac9df97701 15 }
komaida424 2:59ac9df97701 16
komaida424 2:59ac9df97701 17 float SoftPWM::read()
komaida424 2:59ac9df97701 18 {
komaida424 2:59ac9df97701 19 if ( width <= 0.0 ) return 0.0;
komaida424 2:59ac9df97701 20 if ( width > 1.0 ) return 1.0;
komaida424 2:59ac9df97701 21 return width / interval;
komaida424 2:59ac9df97701 22 }
komaida424 2:59ac9df97701 23
komaida424 2:59ac9df97701 24 void SoftPWM::write(float duty)
komaida424 2:59ac9df97701 25 {
komaida424 2:59ac9df97701 26 width = interval * duty;
komaida424 2:59ac9df97701 27 if ( duty <= 0.0 ) width = 0.0;
komaida424 2:59ac9df97701 28 if ( duty > 1.0 ) width = interval;
komaida424 2:59ac9df97701 29 }
komaida424 2:59ac9df97701 30
komaida424 2:59ac9df97701 31 void SoftPWM::start()
komaida424 2:59ac9df97701 32 {
komaida424 2:59ac9df97701 33 _ticker.attach(this,&SoftPWM::TickerInterrapt,interval);
komaida424 2:59ac9df97701 34 }
komaida424 2:59ac9df97701 35
komaida424 2:59ac9df97701 36 void SoftPWM::stop()
komaida424 2:59ac9df97701 37 {
komaida424 2:59ac9df97701 38 _ticker.detach();
komaida424 2:59ac9df97701 39 if ( positive )
komaida424 2:59ac9df97701 40 pulse = 0;
komaida424 2:59ac9df97701 41 else
komaida424 2:59ac9df97701 42 pulse = 1;
komaida424 2:59ac9df97701 43 wait(width);
komaida424 2:59ac9df97701 44 }
komaida424 2:59ac9df97701 45
komaida424 2:59ac9df97701 46 void SoftPWM::period(float _period)
komaida424 2:59ac9df97701 47 {
komaida424 2:59ac9df97701 48 interval = _period;
komaida424 2:59ac9df97701 49 start();
komaida424 2:59ac9df97701 50 }
komaida424 2:59ac9df97701 51
komaida424 2:59ac9df97701 52 void SoftPWM::period_ms(int _period)
komaida424 2:59ac9df97701 53 {
komaida424 2:59ac9df97701 54 period((float)_period / 1000);
komaida424 2:59ac9df97701 55 start();
komaida424 2:59ac9df97701 56 }
komaida424 2:59ac9df97701 57
komaida424 2:59ac9df97701 58 void SoftPWM::period_us(int _period)
komaida424 2:59ac9df97701 59 {
komaida424 2:59ac9df97701 60 period((float)_period / 1000000);
komaida424 2:59ac9df97701 61 start();
komaida424 2:59ac9df97701 62 }
komaida424 2:59ac9df97701 63
komaida424 2:59ac9df97701 64 void SoftPWM::pulsewidth(float _width)
komaida424 2:59ac9df97701 65 {
komaida424 2:59ac9df97701 66 width = _width;
komaida424 2:59ac9df97701 67 if ( width < 0.0 ) width = 0.0;
komaida424 2:59ac9df97701 68 }
komaida424 2:59ac9df97701 69
komaida424 2:59ac9df97701 70 void SoftPWM::pulsewidth_ms(int _width)
komaida424 2:59ac9df97701 71 {
komaida424 2:59ac9df97701 72 pulsewidth((float)_width / 1000);
komaida424 2:59ac9df97701 73 }
komaida424 2:59ac9df97701 74
komaida424 2:59ac9df97701 75 void SoftPWM::pulsewidth_us(int _width)
komaida424 2:59ac9df97701 76 {
komaida424 2:59ac9df97701 77 pulsewidth((float)_width / 1000000);
komaida424 2:59ac9df97701 78 }
komaida424 2:59ac9df97701 79
komaida424 2:59ac9df97701 80 void SoftPWM::TickerInterrapt()
komaida424 2:59ac9df97701 81 {
komaida424 2:59ac9df97701 82 if ( width <= 0 ) return;
komaida424 2:59ac9df97701 83 _timeout.attach(this,&SoftPWM::end,width);
komaida424 2:59ac9df97701 84 if ( positive )
komaida424 2:59ac9df97701 85 pulse = 1;
komaida424 2:59ac9df97701 86 else
komaida424 2:59ac9df97701 87 pulse = 0;
komaida424 2:59ac9df97701 88 }
komaida424 2:59ac9df97701 89
komaida424 2:59ac9df97701 90 void SoftPWM::end()
komaida424 2:59ac9df97701 91 {
komaida424 2:59ac9df97701 92 if ( positive )
komaida424 2:59ac9df97701 93 pulse = 0;
komaida424 2:59ac9df97701 94 else
komaida424 2:59ac9df97701 95 pulse = 1;
komaida424 2:59ac9df97701 96 // _timeout.detach();
komaida424 2:59ac9df97701 97 }
komaida424 2:59ac9df97701 98 ;
komaida424 2:59ac9df97701 99