Basic DC motor control test, rpm feedback by simple impulse signal, PID speed control.
Dependencies: FastPWM mbed FastIO MODSERIAL
main.cpp
- Committer:
- dzoni
- Date:
- 2018-03-27
- Revision:
- 6:cc38171e6a4b
- Parent:
- 5:ec4d6e435822
- Child:
- 7:1aba48efb1c3
File content as of revision 6:cc38171e6a4b:
#include "mbed.h" #include "FastPWM.h" #include "FastIO.h" #define MODSERIAL_DEFAULT_RX_BUFFER_SIZE 16 #define MODSERIAL_DEFAULT_TX_BUFFER_SIZE 64 #include "MODSERIAL.h" #define IMPULSE_SENSOR_R_PIN (PA_9) #define PWM_OUT_R_PIN (PA_6) FastPWM mypwm(PWM_OUT_R_PIN); FastIn<IMPULSE_SENSOR_R_PIN> pinImpulseSensorIn; FastIn<USER_BUTTON> pinUserButtonIn; DigitalOut myled(LED1); Timer myTimer; //------------------------------------ // Hyperterminal configuration // 9600 bauds, 8-bit data, no parity //------------------------------------ MODSERIAL pcLink(SERIAL_TX, SERIAL_RX); static const us_timestamp_t periodImpSens = 125000; // 125 msec static const us_timestamp_t periodLEDBlink = 100000; // 100 msec static const us_timestamp_t periodPWMWrite = 5000000; // 5 sec static us_timestamp_t tStampImpSens = 0; static us_timestamp_t tStampLEDBlink = 0; static us_timestamp_t tStampPWMWrite = 0; static us_timestamp_t tStamp = 0; static unsigned int uiImpSens = 0U; static unsigned int uiImpSensTemp = 0U; static int iImpSensLastState = 0; static double dPwmDuty = 0.0; static void setup(void); static void tskImpSens(void); static void tskLEDBlink(void); static void tskPWMWrite(void); static void tskBackground(void); static inline void DO_TASK(us_timestamp_t tskPeriod, us_timestamp_t &tskTimer, us_timestamp_t timeStamp, void (*tskFunction)(void)) { if (tskPeriod < (timeStamp - tskTimer)) { tskTimer = timeStamp; (*tskFunction)(); } } static inline void BACKGROUND(void (*tskFunction)(void)) { (*tskFunction)(); } int main(void) { setup(); while(1) { tStamp = myTimer.read_high_resolution_us(); DO_TASK(periodLEDBlink, tStampLEDBlink, tStamp, &tskLEDBlink); DO_TASK(periodPWMWrite, tStampPWMWrite, tStamp, &tskPWMWrite); DO_TASK(periodImpSens, tStampImpSens, tStamp, &tskImpSens); BACKGROUND(&tskBackground); } } void setup(void) { pcLink.baud(115200); pcLink.format(8, SerialBase::None, 1); mypwm.period_us(2000); mypwm.write(0.5); myTimer.start(); } void tskImpSens(void) { uiImpSens = uiImpSensTemp; uiImpSensTemp = 0U; pcLink.printf("IMP: %u imp. \r", uiImpSens); } void tskLEDBlink(void) { myled = !myled; } void tskPWMWrite(void) { dPwmDuty = dPwmDuty + 0.1; if (1.0 < dPwmDuty) { dPwmDuty = 0.0; } mypwm.write(dPwmDuty); pcLink.printf("\r\nPWM: %.2f %% \r\n", mypwm.read() * 100); } void tskBackground(void) { // Impulse sensor - pulse counting int iTemp = pinImpulseSensorIn.read(); if (iTemp != iImpSensLastState) { iImpSensLastState = iTemp; uiImpSensTemp++; } }