robot

Dependencies:   FastPWM3 mbed

Committer:
bwang
Date:
Mon May 01 11:21:42 2017 +0000
Revision:
137:54c47ef47bbb
Parent:
92:a9dac72d8cac
Child:
138:7ff70cef8db3
05/01/2017 07:21 - rising edge from disabled state now resets usec count in PwmIn

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bwang 19:a6cf15f89f3d 1 #include "mbed.h"
bwang 18:3863ca45cf26 2 #include "PwmIn.h"
bwang 19:a6cf15f89f3d 3 #include "MathHelpers.h"
dicarloj 13:41d102a53caf 4
bwang 92:a9dac72d8cac 5 PwmIn::PwmIn(PinName pin, int usec_min, int usec_max, int usec_crazy_low, int usec_crazy_hi)
dicarloj 13:41d102a53caf 6 {
dicarloj 13:41d102a53caf 7 int_in = new InterruptIn(pin);
dicarloj 13:41d102a53caf 8 dig_in = new DigitalIn(pin);
bwang 16:f283d6032fe5 9 int_in->rise(this, &PwmIn::handle_rise);
bwang 16:f283d6032fe5 10 int_in->fall(this, &PwmIn::handle_fall);
dicarloj 13:41d102a53caf 11 this->usec_min = usec_min;
dicarloj 13:41d102a53caf 12 this->usec_max = usec_max;
bwang 92:a9dac72d8cac 13 this->usec_crazy_low = usec_crazy_low;
bwang 92:a9dac72d8cac 14 this->usec_crazy_hi = usec_crazy_hi;
bwang 75:591556ce033d 15
bwang 75:591556ce033d 16 usecs = usec_min;
bwang 75:591556ce033d 17 blocked = false;
bwang 75:591556ce033d 18 enabled = false;
bwang 92:a9dac72d8cac 19 risen = false;
dicarloj 13:41d102a53caf 20 }
dicarloj 13:41d102a53caf 21
dicarloj 13:41d102a53caf 22
bwang 16:f283d6032fe5 23 bool PwmIn::get_enabled()
dicarloj 13:41d102a53caf 24 {
dicarloj 13:41d102a53caf 25 return enabled;
dicarloj 13:41d102a53caf 26 }
dicarloj 13:41d102a53caf 27
bwang 16:f283d6032fe5 28 void PwmIn::handle_rise()
dicarloj 13:41d102a53caf 29 {
bwang 137:54c47ef47bbb 30 if (!enabled) {
bwang 137:54c47ef47bbb 31 enabled = true;
bwang 137:54c47ef47bbb 32 usecs = usecs_min;
bwang 137:54c47ef47bbb 33 }
bwang 92:a9dac72d8cac 34 risen = true;
bwang 75:591556ce033d 35
dicarloj 13:41d102a53caf 36 timer.stop();
dicarloj 13:41d102a53caf 37 timer.reset();
dicarloj 13:41d102a53caf 38 timer.start();
dicarloj 13:41d102a53caf 39 }
dicarloj 13:41d102a53caf 40
bwang 16:f283d6032fe5 41 void PwmIn::handle_fall()
dicarloj 13:41d102a53caf 42 {
bwang 75:591556ce033d 43 int usecs_new = timer.read_us();
dicarloj 13:41d102a53caf 44 timer.stop();
dicarloj 13:41d102a53caf 45 timer.reset();
dicarloj 13:41d102a53caf 46 timer.start();
bwang 75:591556ce033d 47
bwang 75:591556ce033d 48 if (blocked) {
bwang 75:591556ce033d 49 blocked = false;
bwang 92:a9dac72d8cac 50 risen = false;
bwang 75:591556ce033d 51 return;
bwang 75:591556ce033d 52 }
bwang 75:591556ce033d 53
bwang 92:a9dac72d8cac 54 if (usecs_new <= usec_crazy_hi && usecs_new >= usec_crazy_low && risen) usecs = usecs_new;
bwang 92:a9dac72d8cac 55 risen = false;
dicarloj 13:41d102a53caf 56 }
dicarloj 13:41d102a53caf 57
bwang 16:f283d6032fe5 58 float PwmIn::get_throttle()
dicarloj 13:41d102a53caf 59 {
dicarloj 13:41d102a53caf 60 if(timer.read_us() > 40000) enabled = false;
dicarloj 13:41d102a53caf 61 if(!enabled) return -1;
dicarloj 13:41d102a53caf 62 return constrain(map((float)usecs, usec_min, usec_max, 0, 1), 0, 1);
dicarloj 13:41d102a53caf 63 }
dicarloj 13:41d102a53caf 64