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.
main.cpp
- Committer:
- Mikebob
- Date:
- 2019-11-19
- Revision:
- 9:45ae94cf5e23
- Parent:
- 8:f2b6ef8c5eb8
- Child:
- 10:1637fce7ef1e
File content as of revision 9:45ae94cf5e23:
/* ** ELEC143 Coursework Sample Code ** Author: Dr Nicholas Outram Date: 09-10-2015 Version: 1.0 This sample code demonstrates the following: - How to control the motor speed and direction - How to measure motor speed using software polling (assuming a forward direction) Notes: 1. This code is very monolithic. I have made no attempt to factor this into meaningful and reuseable functions. I will be looking to see you factor your code into different functions, and maybe even into seperate C (or CPP) files. 2. This code is only lightly commented. The commenting is sufficient to explain the purpose of each step in the code. Do not assume this is always sufficient. You may adapt this code for your own purposes. However, you may be questioned about any of the code you use. Your answers will affect your grade to some extent. */ #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(); timer1.reset(); timer1.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); } 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); //Main polling loop while(1) { while(trav <= 1250) { PWMA.write(dutyA); //Set duty cycle y PWMB.write(dutyB); time(); } while(trav <= 330) { PWMA.write(dutyA); PWMB.write(0.0f); time(); } while(trav <= 1457) { PWMA.write(dutyA); PWMB.write(dutyB); time(); } while(trav <= 268) { PWMA.write(dutyA); PWMB.write(0.0f); time(); } while(trav <= 750) { PWMA.write(dutyA); PWMB.write(dutyB); time(); } while(trav <= 200) { PWMA.write(dutyA); PWMB.write(0.0f); time(); } PWMA.write(0.0f); PWMB.write(0.0f); timer.stop(); break; } wait(500); }