Rachel Ireland-Jones / Mbed OS FinalYear0

main.cpp

Committer:
Mikebob
Date:
2019-11-19
Revision:
12:3abb17739c2e
Parent:
11:475b412bbc3c
Child:
13:29a994566dc5

File content as of revision 12:3abb17739c2e:

/*
Our version
*/
#include "mbed.h"
 
//Status LED
DigitalOut led(LED1);
 
//Motor PWM (speed)
PwmOut PWMA(PA_8);
PwmOut PWMB(PB_4);
 
//Motor Direction
DigitalOut DIRA(PA_9);
DigitalOut DIRB(PB_10);
 
//Hall-Effect Sensor Inputs
DigitalIn HEA1(PB_2);
DigitalIn HEA2(PB_1);
DigitalIn HEB1(PB_15);
DigitalIn HEB2(PB_14);

 
//On board switch
DigitalIn SW1(USER_BUTTON);
 
//Use the serial object so we can use higher speeds
Serial terminal(USBTX, USBRX);
 
//Timer used for measuring speeds
Timer timer;
Timer timer1;
 
//Enumerated types
enum DIRECTION   {FORWARD=0, REVERSE};
enum PULSE       {NOPULSE=0, PULSE};
enum SWITCHSTATE {PRESSED=0, RELEASED};
 
//Debug GPIO
DigitalOut probe(D10);
 
//Duty cycles
float dutyA = 1.0f; //100%
float dutyB = 1.0f; //100%
//Array of sensor data
int tA1[2];
int tA2[2];
float dis;
float trav =0;

void time()
        {
            //Reset timer and Start
        timer.reset();
        timer.start();
        //*********************************************************************
        //FIRST TIME - SYNCHRONISE (YOU SHOULD NOT NEED THIS ONCE IT's RUNNING)
        //*********************************************************************
        
        //Wait for rising edge of A1 and log time
        while (HEA1 == NOPULSE);
        //Wait for rising edge of A2 and log time (30 degrees?)
        while (HEA2 == NOPULSE);
        //Wait for falling edge of A1
        while (HEA1 == PULSE);
        //Wait for falling edge of A2
        while (HEA2 == PULSE);
 
        //**********************
        //TIME THE FULL SEQUENCE
        //**********************
        
        //Wait for rising edge of A1 and log time
        while (HEA1 == NOPULSE);
        tA1[0] = timer.read_us();
 
        //Wait for rising edge of A2 and log time (30 degrees?)
        while (HEA2 == NOPULSE);
        tA2[0] = timer.read_us();
 
        //Wait for falling edge of A1
        while (HEA1 == PULSE);
        tA1[1] = timer.read_us();
                
        //Wait for falling edge of A2
        while (HEA2 == PULSE);
        tA2[1] = timer.read_us();
 
 
        terminal.printf("tA1(0) = %d\n", tA1[0]);
        terminal.printf("tA1(1) = %d\n", tA1[1]);
        terminal.printf("tA2(0) = %d\n", tA2[0]);
        terminal.printf("tA2(1) = %d\n", tA2[1]);
 
        //Calculate the frequency of rotation
        float TA1 = 2.0f * (tA1[1]-tA1[0]);
        float TA2 = 2.0f * (tA2[1]-tA2[0]);
        float TA = (TA1 + TA2) * 0.5f;

        dis = timer1.read_us();
        float mm = ((TA*3)*20.8)/175.9;
        trav = dis/mm;
        float fA = 1.0f/ (TA *(float)3.0E-6);
        terminal.printf("Average A2 Shaft: %6.2fHz \t Wheel: %6.2f \t trav: %6.2f\n", fA, fA/20.8f, trav);
        }
         
void reset()
{
    timer1.reset();
    time();
}
         
int main()
{
    
    //Configure the terminal to high speed
    terminal.baud(115200);
 
    //Set initial motor direction
    DIRA = FORWARD;
    DIRB = FORWARD;
 
    //Set motor period to 100Hz
    PWMA.period_ms(10);
    PWMB.period_ms(10);
 
    //Set initial motor speed to stop
    PWMA.write(0.0f);           //0% duty cycle
    PWMB.write(0.0f);           //0% duty cycle
 
    //Wait for USER button (blue pull-down switch) to start
    terminal.puts("Press USER button to start");
    led = 0;
    while (SW1 == RELEASED);
    led = 1;
 
    //Set initial motor speed to stop
    PWMA.write(0.0f);          //Set duty cycle (%)
    PWMB.write(0.0f);          //Set duty cycle (%)
 
    //Wait - give time to start running
    wait(1.0);
    timer1.reset();
    timer1.start();
    //Main polling loop
    while(1)
    {
        while(trav <= 1250)  
            {  
               PWMA.write(dutyA);          //Set duty cycle y  
               PWMB.write(dutyB);
               time();
            } 
        reset();
        while(trav <= 330)  
            {  
               PWMA.write(dutyA);           
               PWMB.write(0.0f);
               time();
            }
        reset();
        while(trav <= 1457)  
            {  
               PWMA.write(dutyA);           
               PWMB.write(dutyB);
               time();
            }
        reset();
        while(trav <= 268)  
            {  
               PWMA.write(dutyA);           
               PWMB.write(0.0f);
               time();
            }
        reset();
        while(trav <= 750)  
            {  
               PWMA.write(dutyA);           
               PWMB.write(dutyB);
               time();
            }
        reset();
        while(trav <= 200)  
            {  
               PWMA.write(dutyA);           
               PWMB.write(0.0f);
               time();
            }  
        timer.stop();   
        break;
    }
    PWMA.write(0.0f);    
    PWMB.write(0.0f);
}