STM3 ESC dual brushless motor controller. 10-60v, motor power rating tiny to kW. Ganged or independent motor control As used in 'The Brute' locomotive - www.jons-workshop.com
Dependencies: mbed BufferedSerial Servo FastPWM
Radio_Control_In.cpp@12:d1d21a2941ef, 2019-03-04 (annotated)
- Committer:
- JonFreeman
- Date:
- Mon Mar 04 17:51:08 2019 +0000
- Revision:
- 12:d1d21a2941ef
- Parent:
- 11:bfb73f083009
STM3 ESC dual motor controller boards. Always 'Work In Progress', working snapshot March 2019
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JonFreeman | 11:bfb73f083009 | 1 | #include "mbed.h" |
JonFreeman | 11:bfb73f083009 | 2 | #include "BufferedSerial.h" |
JonFreeman | 11:bfb73f083009 | 3 | #include "Radio_Control_In.h" |
JonFreeman | 11:bfb73f083009 | 4 | /**class RControl_In |
JonFreeman | 11:bfb73f083009 | 5 | Jon Freeman |
JonFreeman | 11:bfb73f083009 | 6 | Jan 2019 |
JonFreeman | 11:bfb73f083009 | 7 | |
JonFreeman | 11:bfb73f083009 | 8 | Checks for __-__ duration 800-2200us |
JonFreeman | 11:bfb73f083009 | 9 | Checks repetition rate in range 5-25ms |
JonFreeman | 11:bfb73f083009 | 10 | */ |
JonFreeman | 11:bfb73f083009 | 11 | extern BufferedSerial pc; |
JonFreeman | 11:bfb73f083009 | 12 | |
JonFreeman | 11:bfb73f083009 | 13 | // RControl_In::RControl_In () { // Default Constructor |
JonFreeman | 11:bfb73f083009 | 14 | // pulse_width_us = period_us = pulse_count = 0; |
JonFreeman | 11:bfb73f083009 | 15 | // lost_chan_return_value = 0.0; |
JonFreeman | 11:bfb73f083009 | 16 | // } ; |
JonFreeman | 11:bfb73f083009 | 17 | // RControl_In::RControl_In (PinName inp) : pulse_in(inp) { // Default Constructor |
JonFreeman | 11:bfb73f083009 | 18 | // pulse_width_us = period_us = pulse_count = 0; |
JonFreeman | 11:bfb73f083009 | 19 | // lost_chan_return_value = 0.0; |
JonFreeman | 11:bfb73f083009 | 20 | // } ; |
JonFreeman | 11:bfb73f083009 | 21 | /** |
JonFreeman | 11:bfb73f083009 | 22 | */ |
JonFreeman | 11:bfb73f083009 | 23 | void RControl_In::set_lost_chan_return_value (double d) { |
JonFreeman | 11:bfb73f083009 | 24 | lost_chan_return_value = d; |
JonFreeman | 11:bfb73f083009 | 25 | } |
JonFreeman | 11:bfb73f083009 | 26 | |
JonFreeman | 11:bfb73f083009 | 27 | uint32_t RControl_In::pulsewidth () |
JonFreeman | 11:bfb73f083009 | 28 | { |
JonFreeman | 11:bfb73f083009 | 29 | return pulse_width_us; |
JonFreeman | 11:bfb73f083009 | 30 | } |
JonFreeman | 11:bfb73f083009 | 31 | |
JonFreeman | 11:bfb73f083009 | 32 | uint32_t RControl_In::pulsecount () |
JonFreeman | 11:bfb73f083009 | 33 | { |
JonFreeman | 11:bfb73f083009 | 34 | return pulse_count; |
JonFreeman | 11:bfb73f083009 | 35 | } |
JonFreeman | 11:bfb73f083009 | 36 | |
JonFreeman | 11:bfb73f083009 | 37 | uint32_t RControl_In::period () |
JonFreeman | 11:bfb73f083009 | 38 | { |
JonFreeman | 11:bfb73f083009 | 39 | return period_us; |
JonFreeman | 11:bfb73f083009 | 40 | } |
JonFreeman | 11:bfb73f083009 | 41 | |
JonFreeman | 12:d1d21a2941ef | 42 | void RControl_In::reset () |
JonFreeman | 12:d1d21a2941ef | 43 | { |
JonFreeman | 12:d1d21a2941ef | 44 | pulse_width_us = period_us = pulse_count = 0; |
JonFreeman | 12:d1d21a2941ef | 45 | t.reset (); |
JonFreeman | 12:d1d21a2941ef | 46 | } |
JonFreeman | 12:d1d21a2941ef | 47 | |
JonFreeman | 11:bfb73f083009 | 48 | bool RControl_In::validate_rx () |
JonFreeman | 11:bfb73f083009 | 49 | { // Tests for pulse width and repetition rates being believable |
JonFreeman | 11:bfb73f083009 | 50 | return !((period_us < 5000) || (period_us > 25000) || (pulse_width_us < 800) || (pulse_width_us > 2200)); |
JonFreeman | 11:bfb73f083009 | 51 | } |
JonFreeman | 11:bfb73f083009 | 52 | |
JonFreeman | 11:bfb73f083009 | 53 | double RControl_In::normalised () { |
JonFreeman | 11:bfb73f083009 | 54 | if (!validate_rx()) { |
JonFreeman | 11:bfb73f083009 | 55 | pc.printf ("Invalid RCin\r\n"); |
JonFreeman | 11:bfb73f083009 | 56 | return lost_chan_return_value; // ** WHAT TO RETURN WHEN RC NOT ACTIVE ? ** This is now user settable |
JonFreeman | 11:bfb73f083009 | 57 | } // Defaults to returning 0.0, user should call set_lost_chan_value (value) to alter |
JonFreeman | 11:bfb73f083009 | 58 | double norm = (double) (pulse_width_us - 1000); // left with -200 to + 1200 allowing for some margin |
JonFreeman | 11:bfb73f083009 | 59 | norm /= 1000.0; |
JonFreeman | 11:bfb73f083009 | 60 | if (norm > 1.0) |
JonFreeman | 11:bfb73f083009 | 61 | norm = 1.0; |
JonFreeman | 11:bfb73f083009 | 62 | if (norm < 0.0) |
JonFreeman | 11:bfb73f083009 | 63 | norm = 0.0; |
JonFreeman | 11:bfb73f083009 | 64 | return norm; |
JonFreeman | 11:bfb73f083009 | 65 | } |
JonFreeman | 11:bfb73f083009 | 66 | |
JonFreeman | 11:bfb73f083009 | 67 | void RControl_In::RadC_rise () // December 2018 - Could not make Servo port bidirectional, fix by using PC_14 and 15 as inputs |
JonFreeman | 11:bfb73f083009 | 68 | { |
JonFreeman | 11:bfb73f083009 | 69 | period_us = t.read_us (); |
JonFreeman | 11:bfb73f083009 | 70 | t.reset (); |
JonFreeman | 11:bfb73f083009 | 71 | t.start (); |
JonFreeman | 11:bfb73f083009 | 72 | } |
JonFreeman | 11:bfb73f083009 | 73 | |
JonFreeman | 11:bfb73f083009 | 74 | void RControl_In::RadC_fall () |
JonFreeman | 11:bfb73f083009 | 75 | { |
JonFreeman | 11:bfb73f083009 | 76 | pulse_width_us = t.read_us (); |
JonFreeman | 11:bfb73f083009 | 77 | pulse_count++; |
JonFreeman | 11:bfb73f083009 | 78 | } |
JonFreeman | 11:bfb73f083009 | 79 | // end of RControl_In class |