Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 5:fdc550ee3b6e
- Parent:
- 4:4aa46b70064a
- Child:
- 6:c23ecdd1a581
--- a/main.cpp Tue Nov 05 14:29:05 2019 +0000 +++ b/main.cpp Tue Nov 05 14:59:44 2019 +0000 @@ -1,63 +1,69 @@ /* - Version 5 – Mike's edit + Version 6 – All edit */ #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 timer; + //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% + int main() { - //Configure the terminal to high speed + //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; + while (SW1 == RELEASED); + //Set initial motor speed to stop { - for(float ramp = 0.0f; ramp <= 1.0f ; ramp += 0.1) + for(float ramp = 0.0f; ramp <= 1.0f ; ramp += 0.2) { PWMA.write(ramp); //Set duty cycle y PWMB.write(ramp); //Set duty cycle y wait(1); } - PWMA.write(dutyA); //Set duty cycle hyp - PWMB.write(dutyB); //Set duty cycle hyp + + PWMA.write(dutyA); //Set duty cycle y + PWMB.write(dutyB); //Set duty cycle y wait(0.6); PWMB.write(0.2f); //turn 31deg wait(1.6); @@ -69,93 +75,9 @@ PWMA.write(dutyA); //Set duty cycle x PWMB.write(dutyB); //Set duty cycle x wait(2.3); - PWMB.write(0.2f); //turn 45deg + PWMB.write(0.2f); //turn 90deg wait(0.7); - //Array of sensor data - int tA1[2]; - int tA2[2]; + PWMA.write(0.0f); - PWMB.write(0.0f); - //Instructions to user - terminal.puts("Press USER button repeatedly to adapt duty (to convernge on 1 rotation/s)"); - //Main polling loop - while(1) { - //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; - float fA = 1.0f/ (TA *(float)3.0E-6); - terminal.printf("Average A2 Shaft: %6.2fHz \t Wheel: %6.2f\n", fA, fA/20.2f); - //Reset timers - timer.stop(); - //Wait for button press - while (SW1 == 1); - wait(0.2); - while (SW1 == 0); - wait(0.1); - //****************************************** - - //Adapt duty to meet 1 revolution per second - - //****************************************** - float wA = fA/20.2f; //Wheel speed - float deltaA = 1.0f-wA; //Error - dutyA = dutyA + deltaA*0.1f; //Increase duty in proportion to the error - //Clamp the max and min values of duty and 0.0 and 1.0 respectively - dutyA = (dutyA>1.0f) ? 1.0f : dutyA; - dutyA = (dutyA<0.05f) ? 0.05f : dutyA; - //Update duty cycle to correct in the first direction - PWMA.write(dutyA); - //Echo to the terminal - terminal.printf("Adapting duty cycle to %6.2f\n", dutyA); - } -} - - - - - - - - - - - - \ No newline at end of file + PWMB.write(0.0f); +} \ No newline at end of file