Bayley Wang
/
foc-ed_in_the_bot_compact
robot
PwmIn/PwmIn.cpp@138:7ff70cef8db3, 2017-05-01 (annotated)
- Committer:
- bwang
- Date:
- Mon May 01 11:23:37 2017 +0000
- Revision:
- 138:7ff70cef8db3
- Parent:
- 137:54c47ef47bbb
- Child:
- 140:170411d158b5
05/01/2017 07:21 - rising edge from disabled state now resets usec count in PwmIn
Who changed what in which revision?
User | Revision | Line number | New 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 | 138:7ff70cef8db3 | 32 | usecs = usec_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 |