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:
5:ec4d6e435822
Parent:
4:7cb8986200a7
Child:
6:cc38171e6a4b

File content as of revision 5:ec4d6e435822:

#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  = 250000;   // 250 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.1;
    }

    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++;
    }
}