Basic DC motor control test, rpm feedback by simple impulse signal, PID speed control.

Dependencies:   FastPWM mbed FastIO MODSERIAL

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?

UserRevisionLine numberNew 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 }