Basic DC motor control test, rpm feedback by simple impulse signal, PID speed control.
Dependencies: FastPWM mbed FastIO MODSERIAL
main.cpp@6:cc38171e6a4b, 2018-03-27 (annotated)
- Committer:
- dzoni
- Date:
- Tue Mar 27 21:24:35 2018 +0000
- Revision:
- 6:cc38171e6a4b
- Parent:
- 5:ec4d6e435822
- Child:
- 7:1aba48efb1c3
Tested - PWM generation & RPM measurement works without problems for a single motor. PWM and RPM count transmitted via serial link. LED flashing task.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dzoni | 0:bd186184ef2a | 1 | #include "mbed.h" |
dzoni | 1:70c514e10598 | 2 | #include "FastPWM.h" |
dzoni | 2:70918f7f8451 | 3 | #include "FastIO.h" |
dzoni | 0:bd186184ef2a | 4 | |
dzoni | 4:7cb8986200a7 | 5 | #define MODSERIAL_DEFAULT_RX_BUFFER_SIZE 16 |
dzoni | 4:7cb8986200a7 | 6 | #define MODSERIAL_DEFAULT_TX_BUFFER_SIZE 64 |
dzoni | 4:7cb8986200a7 | 7 | #include "MODSERIAL.h" |
dzoni | 4:7cb8986200a7 | 8 | |
dzoni | 5:ec4d6e435822 | 9 | #define IMPULSE_SENSOR_R_PIN (PA_9) |
dzoni | 5:ec4d6e435822 | 10 | #define PWM_OUT_R_PIN (PA_6) |
dzoni | 4:7cb8986200a7 | 11 | |
dzoni | 5:ec4d6e435822 | 12 | FastPWM mypwm(PWM_OUT_R_PIN); |
dzoni | 5:ec4d6e435822 | 13 | |
dzoni | 5:ec4d6e435822 | 14 | FastIn<IMPULSE_SENSOR_R_PIN> pinImpulseSensorIn; |
dzoni | 5:ec4d6e435822 | 15 | FastIn<USER_BUTTON> pinUserButtonIn; |
dzoni | 0:bd186184ef2a | 16 | |
dzoni | 0:bd186184ef2a | 17 | DigitalOut myled(LED1); |
dzoni | 0:bd186184ef2a | 18 | |
dzoni | 4:7cb8986200a7 | 19 | Timer myTimer; |
dzoni | 4:7cb8986200a7 | 20 | |
dzoni | 3:f6c30ada5370 | 21 | //------------------------------------ |
dzoni | 3:f6c30ada5370 | 22 | // Hyperterminal configuration |
dzoni | 3:f6c30ada5370 | 23 | // 9600 bauds, 8-bit data, no parity |
dzoni | 3:f6c30ada5370 | 24 | //------------------------------------ |
dzoni | 4:7cb8986200a7 | 25 | MODSERIAL pcLink(SERIAL_TX, SERIAL_RX); |
dzoni | 4:7cb8986200a7 | 26 | |
dzoni | 6:cc38171e6a4b | 27 | static const us_timestamp_t periodImpSens = 125000; // 125 msec |
dzoni | 5:ec4d6e435822 | 28 | static const us_timestamp_t periodLEDBlink = 100000; // 100 msec |
dzoni | 5:ec4d6e435822 | 29 | static const us_timestamp_t periodPWMWrite = 5000000; // 5 sec |
dzoni | 4:7cb8986200a7 | 30 | |
dzoni | 5:ec4d6e435822 | 31 | static us_timestamp_t tStampImpSens = 0; |
dzoni | 5:ec4d6e435822 | 32 | static us_timestamp_t tStampLEDBlink = 0; |
dzoni | 5:ec4d6e435822 | 33 | static us_timestamp_t tStampPWMWrite = 0; |
dzoni | 5:ec4d6e435822 | 34 | static us_timestamp_t tStamp = 0; |
dzoni | 4:7cb8986200a7 | 35 | |
dzoni | 4:7cb8986200a7 | 36 | static unsigned int uiImpSens = 0U; |
dzoni | 5:ec4d6e435822 | 37 | static unsigned int uiImpSensTemp = 0U; |
dzoni | 5:ec4d6e435822 | 38 | static int iImpSensLastState = 0; |
dzoni | 5:ec4d6e435822 | 39 | static double dPwmDuty = 0.0; |
dzoni | 2:70918f7f8451 | 40 | |
dzoni | 5:ec4d6e435822 | 41 | static void setup(void); |
dzoni | 5:ec4d6e435822 | 42 | static void tskImpSens(void); |
dzoni | 5:ec4d6e435822 | 43 | static void tskLEDBlink(void); |
dzoni | 5:ec4d6e435822 | 44 | static void tskPWMWrite(void); |
dzoni | 5:ec4d6e435822 | 45 | static void tskBackground(void); |
dzoni | 5:ec4d6e435822 | 46 | |
dzoni | 5:ec4d6e435822 | 47 | static inline void DO_TASK(us_timestamp_t tskPeriod, us_timestamp_t &tskTimer, us_timestamp_t timeStamp, void (*tskFunction)(void)) |
dzoni | 5:ec4d6e435822 | 48 | { |
dzoni | 5:ec4d6e435822 | 49 | if (tskPeriod < (timeStamp - tskTimer)) |
dzoni | 5:ec4d6e435822 | 50 | { |
dzoni | 5:ec4d6e435822 | 51 | tskTimer = timeStamp; |
dzoni | 5:ec4d6e435822 | 52 | (*tskFunction)(); |
dzoni | 5:ec4d6e435822 | 53 | } |
dzoni | 5:ec4d6e435822 | 54 | } |
dzoni | 5:ec4d6e435822 | 55 | |
dzoni | 5:ec4d6e435822 | 56 | static inline void BACKGROUND(void (*tskFunction)(void)) |
dzoni | 5:ec4d6e435822 | 57 | { |
dzoni | 5:ec4d6e435822 | 58 | (*tskFunction)(); |
dzoni | 5:ec4d6e435822 | 59 | } |
dzoni | 4:7cb8986200a7 | 60 | |
dzoni | 5:ec4d6e435822 | 61 | |
dzoni | 5:ec4d6e435822 | 62 | int main(void) |
dzoni | 5:ec4d6e435822 | 63 | { |
dzoni | 5:ec4d6e435822 | 64 | setup(); |
dzoni | 5:ec4d6e435822 | 65 | |
dzoni | 5:ec4d6e435822 | 66 | while(1) |
dzoni | 5:ec4d6e435822 | 67 | { |
dzoni | 5:ec4d6e435822 | 68 | tStamp = myTimer.read_high_resolution_us(); |
dzoni | 5:ec4d6e435822 | 69 | |
dzoni | 5:ec4d6e435822 | 70 | DO_TASK(periodLEDBlink, tStampLEDBlink, tStamp, &tskLEDBlink); |
dzoni | 5:ec4d6e435822 | 71 | DO_TASK(periodPWMWrite, tStampPWMWrite, tStamp, &tskPWMWrite); |
dzoni | 5:ec4d6e435822 | 72 | DO_TASK(periodImpSens, tStampImpSens, tStamp, &tskImpSens); |
dzoni | 5:ec4d6e435822 | 73 | |
dzoni | 5:ec4d6e435822 | 74 | BACKGROUND(&tskBackground); |
dzoni | 5:ec4d6e435822 | 75 | } |
dzoni | 5:ec4d6e435822 | 76 | } |
dzoni | 5:ec4d6e435822 | 77 | |
dzoni | 5:ec4d6e435822 | 78 | |
dzoni | 5:ec4d6e435822 | 79 | void setup(void) |
dzoni | 5:ec4d6e435822 | 80 | { |
dzoni | 4:7cb8986200a7 | 81 | pcLink.baud(115200); |
dzoni | 4:7cb8986200a7 | 82 | pcLink.format(8, SerialBase::None, 1); |
dzoni | 4:7cb8986200a7 | 83 | |
dzoni | 5:ec4d6e435822 | 84 | mypwm.period_us(2000); |
dzoni | 5:ec4d6e435822 | 85 | mypwm.write(0.5); |
dzoni | 0:bd186184ef2a | 86 | |
dzoni | 4:7cb8986200a7 | 87 | myTimer.start(); |
dzoni | 5:ec4d6e435822 | 88 | } |
dzoni | 5:ec4d6e435822 | 89 | |
dzoni | 5:ec4d6e435822 | 90 | void tskImpSens(void) |
dzoni | 5:ec4d6e435822 | 91 | { |
dzoni | 5:ec4d6e435822 | 92 | uiImpSens = uiImpSensTemp; |
dzoni | 5:ec4d6e435822 | 93 | uiImpSensTemp = 0U; |
dzoni | 4:7cb8986200a7 | 94 | |
dzoni | 6:cc38171e6a4b | 95 | pcLink.printf("IMP: %u imp. \r", uiImpSens); |
dzoni | 5:ec4d6e435822 | 96 | } |
dzoni | 4:7cb8986200a7 | 97 | |
dzoni | 5:ec4d6e435822 | 98 | void tskLEDBlink(void) |
dzoni | 5:ec4d6e435822 | 99 | { |
dzoni | 5:ec4d6e435822 | 100 | myled = !myled; |
dzoni | 5:ec4d6e435822 | 101 | } |
dzoni | 1:70c514e10598 | 102 | |
dzoni | 5:ec4d6e435822 | 103 | void tskPWMWrite(void) |
dzoni | 5:ec4d6e435822 | 104 | { |
dzoni | 5:ec4d6e435822 | 105 | dPwmDuty = dPwmDuty + 0.1; |
dzoni | 4:7cb8986200a7 | 106 | |
dzoni | 5:ec4d6e435822 | 107 | if (1.0 < dPwmDuty) |
dzoni | 5:ec4d6e435822 | 108 | { |
dzoni | 6:cc38171e6a4b | 109 | dPwmDuty = 0.0; |
dzoni | 0:bd186184ef2a | 110 | } |
dzoni | 5:ec4d6e435822 | 111 | |
dzoni | 5:ec4d6e435822 | 112 | mypwm.write(dPwmDuty); |
dzoni | 5:ec4d6e435822 | 113 | |
dzoni | 6:cc38171e6a4b | 114 | pcLink.printf("\r\nPWM: %.2f %% \r\n", mypwm.read() * 100); |
dzoni | 0:bd186184ef2a | 115 | } |
dzoni | 5:ec4d6e435822 | 116 | |
dzoni | 5:ec4d6e435822 | 117 | void tskBackground(void) |
dzoni | 5:ec4d6e435822 | 118 | { |
dzoni | 5:ec4d6e435822 | 119 | // Impulse sensor - pulse counting |
dzoni | 5:ec4d6e435822 | 120 | int iTemp = pinImpulseSensorIn.read(); |
dzoni | 5:ec4d6e435822 | 121 | if (iTemp != iImpSensLastState) |
dzoni | 5:ec4d6e435822 | 122 | { |
dzoni | 5:ec4d6e435822 | 123 | iImpSensLastState = iTemp; |
dzoni | 5:ec4d6e435822 | 124 | uiImpSensTemp++; |
dzoni | 5:ec4d6e435822 | 125 | } |
dzoni | 5:ec4d6e435822 | 126 | } |