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

Dependencies:   FastPWM mbed FastIO MODSERIAL

Committer:
dzoni
Date:
Mon Mar 26 13:00:32 2018 +0000
Revision:
4:7cb8986200a7
Parent:
3:f6c30ada5370
Child:
5:ec4d6e435822
Compiles. No warning. Ready for module test (PWM, LED, Imp. sens.).

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 4:7cb8986200a7 9 static const PinName IMPULSE_SENSOR_PIN = PinName(10);
dzoni 4:7cb8986200a7 10
dzoni 1:70c514e10598 11 FastPWM mypwm(PWM_OUT);
dzoni 4:7cb8986200a7 12 FastIn<IMPULSE_SENSOR_PIN> pinImpulseSensorIn;
dzoni 0:bd186184ef2a 13
dzoni 0:bd186184ef2a 14 DigitalOut myled(LED1);
dzoni 0:bd186184ef2a 15
dzoni 4:7cb8986200a7 16 Timer myTimer;
dzoni 4:7cb8986200a7 17
dzoni 3:f6c30ada5370 18 //------------------------------------
dzoni 3:f6c30ada5370 19 // Hyperterminal configuration
dzoni 3:f6c30ada5370 20 // 9600 bauds, 8-bit data, no parity
dzoni 3:f6c30ada5370 21 //------------------------------------
dzoni 4:7cb8986200a7 22 MODSERIAL pcLink(SERIAL_TX, SERIAL_RX);
dzoni 4:7cb8986200a7 23
dzoni 4:7cb8986200a7 24 static const us_timestamp_t periodImpSens = 100000UL;
dzoni 4:7cb8986200a7 25 static const us_timestamp_t periodLEDBlink = 1000000UL;
dzoni 4:7cb8986200a7 26 static const us_timestamp_t periodPWMWrite = 10000000UL;
dzoni 4:7cb8986200a7 27
dzoni 4:7cb8986200a7 28 static us_timestamp_t tStampImpSens = 0UL;
dzoni 4:7cb8986200a7 29 static us_timestamp_t tStampLEDBlink = 0UL;
dzoni 4:7cb8986200a7 30 static us_timestamp_t tStampPWMWrite = 0UL;
dzoni 4:7cb8986200a7 31
dzoni 4:7cb8986200a7 32 static unsigned int uiImpSens = 0U;
dzoni 2:70918f7f8451 33
dzoni 0:bd186184ef2a 34 int main() {
dzoni 4:7cb8986200a7 35 unsigned int uiImpSensTemp = 0U;
dzoni 4:7cb8986200a7 36 int iImpSensLastState = 0;
dzoni 4:7cb8986200a7 37
dzoni 4:7cb8986200a7 38 pcLink.baud(115200);
dzoni 4:7cb8986200a7 39 pcLink.format(8, SerialBase::None, 1);
dzoni 4:7cb8986200a7 40
dzoni 1:70c514e10598 41 mypwm.period_us(100);
dzoni 1:70c514e10598 42 mypwm.write(0.0);
dzoni 0:bd186184ef2a 43
dzoni 4:7cb8986200a7 44 myTimer.start();
dzoni 4:7cb8986200a7 45
dzoni 0:bd186184ef2a 46 while(1) {
dzoni 1:70c514e10598 47 double dPwmDuty = 0.0;
dzoni 1:70c514e10598 48
dzoni 4:7cb8986200a7 49 us_timestamp_t tStamp;
dzoni 4:7cb8986200a7 50
dzoni 4:7cb8986200a7 51 tStamp = myTimer.read_high_resolution_us();
dzoni 4:7cb8986200a7 52
dzoni 4:7cb8986200a7 53 if (periodLEDBlink < (tStamp - tStampLEDBlink))
dzoni 4:7cb8986200a7 54 {
dzoni 4:7cb8986200a7 55 tStampLEDBlink = tStamp;
dzoni 4:7cb8986200a7 56
dzoni 4:7cb8986200a7 57 myled = !myled;
dzoni 4:7cb8986200a7 58 }
dzoni 4:7cb8986200a7 59
dzoni 4:7cb8986200a7 60 if (periodImpSens < (tStamp - tStampImpSens))
dzoni 4:7cb8986200a7 61 {
dzoni 4:7cb8986200a7 62 tStampImpSens = tStamp;
dzoni 1:70c514e10598 63
dzoni 4:7cb8986200a7 64 uiImpSens = uiImpSensTemp;
dzoni 4:7cb8986200a7 65 uiImpSensTemp = 0U;
dzoni 1:70c514e10598 66
dzoni 4:7cb8986200a7 67 pcLink.printf("IMP: %u imp.\n", uiImpSens);
dzoni 4:7cb8986200a7 68 }
dzoni 1:70c514e10598 69
dzoni 4:7cb8986200a7 70 if (periodPWMWrite < (tStamp - tStampPWMWrite))
dzoni 4:7cb8986200a7 71 {
dzoni 4:7cb8986200a7 72 tStampPWMWrite = tStamp;
dzoni 4:7cb8986200a7 73
dzoni 4:7cb8986200a7 74 mypwm.write(dPwmDuty);
dzoni 4:7cb8986200a7 75 pcLink.printf("PWM: %.2f %%\n", mypwm.read() * 100);
dzoni 4:7cb8986200a7 76
dzoni 4:7cb8986200a7 77 dPwmDuty += 0.1;
dzoni 4:7cb8986200a7 78
dzoni 4:7cb8986200a7 79 if (1.0 < dPwmDuty)
dzoni 4:7cb8986200a7 80 {
dzoni 1:70c514e10598 81 dPwmDuty = 0.0;
dzoni 1:70c514e10598 82 }
dzoni 1:70c514e10598 83 }
dzoni 4:7cb8986200a7 84
dzoni 4:7cb8986200a7 85 // Impulse sensor
dzoni 4:7cb8986200a7 86 int iTemp = pinImpulseSensorIn.read();
dzoni 4:7cb8986200a7 87 if (iTemp != iImpSensLastState)
dzoni 4:7cb8986200a7 88 {
dzoni 4:7cb8986200a7 89 iImpSensLastState = iTemp;
dzoni 4:7cb8986200a7 90 uiImpSensTemp++;
dzoni 4:7cb8986200a7 91 }
dzoni 0:bd186184ef2a 92 }
dzoni 0:bd186184ef2a 93 }