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.
Dependencies: mbed
main.cpp@2:01372422b0c7, 2021-03-05 (annotated)
- Committer:
- benjaminstone
- Date:
- Fri Mar 05 17:17:41 2021 +0000
- Revision:
- 2:01372422b0c7
- Parent:
- 1:128dc77d025a
code from drive team for lab 3;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| benjaminstone | 0:bd04e6ac5a2c | 1 | // open-loop control of the servo motor |
| benjaminstone | 0:bd04e6ac5a2c | 2 | // reads analog input and converts it to a pwm signal |
| benjaminstone | 0:bd04e6ac5a2c | 3 | |
| benjaminstone | 0:bd04e6ac5a2c | 4 | #include "mbed.h" |
| benjaminstone | 0:bd04e6ac5a2c | 5 | #include <iostream> |
| benjaminstone | 0:bd04e6ac5a2c | 6 | |
| benjaminstone | 0:bd04e6ac5a2c | 7 | AnalogIn input(PTB0); |
| benjaminstone | 0:bd04e6ac5a2c | 8 | PwmOut output(PTE21); |
| benjaminstone | 0:bd04e6ac5a2c | 9 | Ticker updater; |
| benjaminstone | 1:128dc77d025a | 10 | |
| benjaminstone | 1:128dc77d025a | 11 | float v = 0.0; |
| benjaminstone | 1:128dc77d025a | 12 | float d = 0.0; |
| benjaminstone | 2:01372422b0c7 | 13 | float prevArea = 0.0; |
| benjaminstone | 2:01372422b0c7 | 14 | float area = 0.0: |
| benjaminstone | 2:01372422b0c7 | 15 | float feedback = 0.0; |
| benjaminstone | 2:01372422b0c7 | 16 | |
| benjaminstone | 2:01372422b0c7 | 17 | float KP =-0.0058; |
| benjaminstone | 2:01372422b0c7 | 18 | float KI =1.0223; |
| benjaminstone | 2:01372422b0c7 | 19 | float TI = .001f; |
| benjaminstone | 2:01372422b0c7 | 20 | int sat = 99999; |
| benjaminstone | 0:bd04e6ac5a2c | 21 | void pwmUpdate() |
| benjaminstone | 0:bd04e6ac5a2c | 22 | { |
| benjaminstone | 0:bd04e6ac5a2c | 23 | v = input.read(); |
| benjaminstone | 1:128dc77d025a | 24 | d = v; // sets DC to voltage |
| benjaminstone | 0:bd04e6ac5a2c | 25 | if( abs(d - output.read()) > 0.001) //only updates the duty cycle if there is a change in the duty cycle greater than 0.3% |
| benjaminstone | 0:bd04e6ac5a2c | 26 | output.write(d); |
| benjaminstone | 0:bd04e6ac5a2c | 27 | } |
| benjaminstone | 2:01372422b0c7 | 28 | void piUpdate(){ |
| benjaminstone | 2:01372422b0c7 | 29 | feedback = input.read();//inputs frequency of motor |
| benjaminstone | 2:01372422b0c7 | 30 | area= TI*feedback + prevArea; //PI integration |
| benjaminstone | 2:01372422b0c7 | 31 | d = KP*error(i)+ KI*errorArea(i); //PI integration |
| benjaminstone | 2:01372422b0c7 | 32 | output.write(d); //changing speed from PI |
| benjaminstone | 2:01372422b0c7 | 33 | prevArea = area; //storing value |
| benjaminstone | 2:01372422b0c7 | 34 | } |
| benjaminstone | 2:01372422b0c7 | 35 | void realUpdate(float x){ |
| benjaminstone | 2:01372422b0c7 | 36 | feedback = input.read(); |
| benjaminstone | 2:01372422b0c7 | 37 | area= TI*feedback + prevArea; |
| benjaminstone | 2:01372422b0c7 | 38 | d = KP*error(i)+ KI*errorArea(i); |
| benjaminstone | 2:01372422b0c7 | 39 | output.write(x-d); |
| benjaminstone | 2:01372422b0c7 | 40 | prevArea = area; |
| benjaminstone | 2:01372422b0c7 | 41 | } |
| benjaminstone | 2:01372422b0c7 | 42 | void step(){ |
| benjaminstone | 2:01372422b0c7 | 43 | for(float s = 0; s < SAT; s+= TI){ |
| benjaminstone | 2:01372422b0c7 | 44 | v = (-1.277e-18*s^4 - 1.61e-14*s^3 + 2.789e-12*s^2 + 1.23e-11*s)/(5.759e-21*s^6 + 1.472e-16*s^5 + 9.414e-13*s^4 + 8.078e-12*s^3 + 2.02e-11*s^2 + 1.23e-11*s)//TF from gclose |
| benjaminstone | 2:01372422b0c7 | 45 | realUpdate(val); |
| benjaminstone | 2:01372422b0c7 | 46 | } |
| benjaminstone | 2:01372422b0c7 | 47 | } |
| benjaminstone | 0:bd04e6ac5a2c | 48 | int main(void) |
| benjaminstone | 0:bd04e6ac5a2c | 49 | { |
| benjaminstone | 0:bd04e6ac5a2c | 50 | output.period(0.00005f); // 20 kHz control signal |
| benjaminstone | 0:bd04e6ac5a2c | 51 | // attaches pwmUpdate function to the ticker with a period of 20ms |
| benjaminstone | 2:01372422b0c7 | 52 | //updater.attach(&pwmUpdate,0.00005f); |
| benjaminstone | 2:01372422b0c7 | 53 | updater.attach(&piUpdate,TI); |
| benjaminstone | 0:bd04e6ac5a2c | 54 | std::cout << "AnalogIn: " << v << " Duty Cycle: " << d << std::endl; |
| benjaminstone | 0:bd04e6ac5a2c | 55 | while(1) {} // do nothing |
| benjaminstone | 0:bd04e6ac5a2c | 56 | } |