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: HIDScope MODSERIAL QEI biquadFilter mbed
Revision 3:56f31420abac, committed 2016-11-03
- Comitter:
- sivuu
- Date:
- Thu Nov 03 14:31:56 2016 +0000
- Parent:
- 2:ca645c585a03
- Child:
- 4:61d9325d7f2e
- Commit message:
- hopelijk met 2 PID controllers;
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed Nov 02 16:58:55 2016 +0000
+++ b/main.cpp Thu Nov 03 14:31:56 2016 +0000
@@ -5,7 +5,7 @@
#include "HIDScope.h"
#include "math.h"
-InterruptIn sw3(SW3);
+DigitalIn sw3(SW3);
DigitalIn sw2(SW2);
DigitalIn encoder1A(D13);
DigitalIn encoder1B(D12);
@@ -19,6 +19,7 @@
DigitalOut richting_motor2(D7);
PwmOut pwm_motor2(D6);
BiQuad PID_controller;
+BiQuad PID_controller2; // maakt een biquad aan voor PID controler 2
//HIDScope Scope(1);
//constanten voor de encoder
@@ -42,69 +43,127 @@
volatile float d_ref = 0;
+volatile float d_ref2 = 0;
volatile float d_ref_new;
const float w_ref = 3;
+const float w_ref2 = 4.5;
const double Ts = 0.001;
const double Kp = 0.3823;
const double Ki = 0.127875;
const double Kd = 0.2519;
const double N = 100;
+const double Ts2 = 0.001;
+const double Kp2 = 0.3823;
+const double Ki2 = 0.127875;
+const double Kd2 = 0.2519;
+const double N2 = 100;
Ticker tick;
-Ticker controllerticker;
+Ticker controllerticker;
+Ticker tick2; // ticker voor reverence voor motor 2
+Ticker controllerticker2; //ticker voor controler voor motor 2
float rev_counts_motor1_rad;
+float rev_counts_motor2_rad;
volatile float voltage_motor1=0.5;
+volatile float voltage_motor2=0.5; // pwm motor 2 aansturing
volatile double error1;
-volatile double ctrlOutput;
+volatile double error2; // error voor tweede motor
+volatile double ctrlOutput1;
+volatile double ctrlOutput2; // control output voor motor 2
volatile double d_ref_const_cw = 0;
volatile double d_ref_const_ccw = 0;
+volatile int n = 0;
+void SwitchN() { // maakt simpele functie die 1 bij n optelt voor de switch naar motor 2
+ n++;
+ }
+
void reference(){
- if (button_cw == 0 ){
- d_ref = d_ref + w_ref * Ts;
+ if(n%2== 0){
+ if (button_cw == 0){
+ d_ref = d_ref + w_ref * Ts;
+ }
+ if (d_ref > 21.36){
+ d_ref = 21.36;
+ //d_ref_const_cw = 1;
+ }
+ else{
+ d_ref = d_ref;
+ }
+
+ if (button_ccw == 0){
+ d_ref = d_ref - w_ref * Ts;
+ }
+ if (d_ref < -21.36){
+ d_ref = -21.36;
+
+ }
+ else{
+ d_ref = d_ref;
+ }
+ } // haakje sluit voor if loop voor n%==0
+}
+
+void reference2(){ // maakt reference aan voor motor2
+if(n%2 != 0){
+ if (button_cw == 0){
+ d_ref2 = d_ref2 + w_ref2 * Ts;
}
- if (d_ref > 21.36 ){
- d_ref = 21.36;
+ if (d_ref2 > 21.36){
+ d_ref2 = 21.36;
//d_ref_const_cw = 1;
}
else{
- d_ref = d_ref;
+ d_ref2 = d_ref2;
}
if (button_ccw == 0){
- d_ref = d_ref - w_ref * Ts;
+ d_ref2 = d_ref2 - w_ref2 * Ts;
}
- if (d_ref < -21.36){
- d_ref = -21.36;
+ if (d_ref2 < -21.36){
+ d_ref2 = -21.36;
}
else{
- d_ref = d_ref;
+ d_ref2 = d_ref2;
}
-
+ } // haakje sluit voor if loop met n%!=0)
}
void m1_controller(){
error1 = d_ref-rev_counts_motor1_rad;
- ctrlOutput = PID_controller.step(error1);
+ ctrlOutput1 = PID_controller.step(error1);
}
+void m2_controller(){ // void voor tweede controller
+ error2 = d_ref2-rev_counts_motor2_rad;
+ ctrlOutput2 = PID_controller.step(error2);
+ }
-void tickerfunctie() // maakt een ticker functie aan
-{
-tickerflag = 1; // het enige wat deze functie doet is zorgen dat tickerflag 1 is
-}
+//void tickerfunctie() // maakt een ticker functie aan
+//{
+//tickerflag = 1; // het enige wat deze functie doet is zorgen dat tickerflag 1 is
+//}
int main()
{
pc.baud(115200);
-QEI Encoder1(D10,D11, NC, rev_rond,QEI::X4_ENCODING);
+QEI Encoder2(D10,D11, NC, rev_rond,QEI::X4_ENCODING);
+QEI Encoder1(D13,D12, NC, rev_rond,QEI::X4_ENCODING); //encoder motor 2
int counts_encoder1; //variabele counts aanmaken
+int counts_encoder2; // variabele counts voor motor2
float rev_counts_motor1;
-t.attach(&tickerfunctie,ticker_TS);
+float rev_counts_motor2; // variabele coutns voor motor2
+//t.attach(&tickerfunctie,ticker_TS);
+sw3.attach(&SwitchN,Ts);
tick.attach(&reference,Ts);
+tick2.attach(&reference2,Ts); // ticker voor reference2 attach
controllerticker.attach(&m1_controller,Ts);
+controllerticker2.attach(&m2_controller,Ts); // ticker voor controller2 attach
+
+
PID_controller.PIDF(Kp,Ki,Kd,N,Ts);
+PID_controller2.PIDF(Kp2,Ki2,Kd2,N2,Ts2);
while (true) {
// if (button_cw == 0){
@@ -115,48 +174,31 @@
//pc.printf("pwm_motor is %f\r\n", pwm_motor1);
counts_encoder1 = Encoder1.getPulses(); // zorgt er voor dat het aantal rondjes geteld worden
+ counts_encoder2 = Encoder2.getPulses();
rev_counts_motor1=(float)counts_encoder1/(gearboxratio*rev_rond);
rev_counts_motor1_rad=rev_counts_motor1*6.28318530718;
- voltage_motor1=ctrlOutput;
+ rev_counts_motor2=(float)counts_encoder2/(gearboxratio*rev_rond);
+ rev_counts_motor2_rad=rev_counts_motor2*6.28318530718;
+ voltage_motor1=ctrlOutput1;
+ voltage_motor2=ctrlOutput2;
if (voltage_motor1<0){
richting_motor1 = 0;
}
else {
richting_motor1 = 1;
}
+ if (voltage_motor2<0){
+ richting_motor2 = 0;
+ }
+ else {
+ richting_motor2 = 1;
+ }
pwm_motor1 = fabs(voltage_motor1);
-
- pc.printf("%f", pwm_motor1.read());
- pc.printf(" %f", d_ref);
- pc.printf(" %f \r\n", rev_counts_motor1_rad);
- //Scope.set(0, rev_counts_motor1_rad);
- //Scope.send();
- //tickerflag = 0;
- // d_ref_const_ccw = 0;
- //}
- // }
- // else if (button_ccw == 0){
-
- /* richting_motor1 = 0;
- pwm_motor1 = voltage_motor1;
- //pc.printf("pwm_motor is %f\r\n", pwm_motor1);
+ pwm_motor2 = fabs(voltage_motor2);
- counts_encoder1 = Encoder1.getPulses(); // zorgt er voor dat het aantal rondjes geteld worden
- rev_counts_motor1=(float)counts_encoder1/(gearboxratio*rev_rond);
- rev_counts_motor1_rad=rev_counts_motor1*6.28318530718;
- voltage_motor1=ctrlOutput;
- pc.printf("%f", pwm_motor1);
- pc.printf(" %f", d_ref);
- pc.printf(" %f \r\n", rev_counts_motor1_rad);
- //Scope.set(0, rev_counts_motor1_rad);
- //Scope.send();
- //tickerflag = 0;
- d_ref_const_cw = 0; */
- // }
-
- // else{
- // pwm_motor1=0;
-
- //}
+ pc.printf("%f", pwm_motor2.read());
+ pc.printf(" %f", d_ref2);
+ pc.printf(" %f \r\n", rev_counts_motor2_rad);
+
}
}
\ No newline at end of file