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: FastPWM mbed-src
Fork of 2015_04_17_quadro_bez_sterowania by
Revision 12:e955cc086c42, committed 2015-04-17
- Comitter:
- Michu90
- Date:
- Fri Apr 17 14:25:25 2015 +0000
- Parent:
- 11:38db3ed41f13
- Commit message:
- Dydaktyka
Changed in this revision
--- a/Offsets.cpp Fri Apr 17 07:48:05 2015 +0000
+++ b/Offsets.cpp Fri Apr 17 14:25:25 2015 +0000
@@ -31,7 +31,7 @@
float d[9];
float yaw;
- sprintf(buff, "Hello!\n\rPlace Qudrocopter motionlessly and press o\n\r");
+ sprintf(buff, "Hello!\n\rPlace Qudrocopter motionlessly and press a\n\r");
serial.printf(buff);
do{
if(serial.readable()){
@@ -56,10 +56,6 @@
offsetGyr[2]/=1000;
yaw = yaw/1000;
- //o[0] = offsetGyr[0];
- //o[1] = offsetGyr[1];
- //o[2] = offsetGyr[2];
- // lub tak:
*(o+0) = offsetGyr[0];
*(o+1) = offsetGyr[1];
*(o+2) = offsetGyr[2];
@@ -87,9 +83,6 @@
void Offsets::offsetData(float *d, float *D, float *O)
{
- /*for (int i=0; i<3; i++) {
- O[i] = d[i]-D[i];
- }*/
O[0] = d[0]-D[0];
O[1] = d[1]-D[1];
O[2] = d[2]-D[2];
@@ -97,9 +90,6 @@
void Offsets::offsetData2(double *d, float *D, float *O)
{
- /*for (int i=0; i<3; i++) {
- O[i] = d[i]-D[i];
- }*/
O[0] = d[0]-D[0];
O[1] = d[1]-D[1];
O[2] = d[2]-D[2];
@@ -107,8 +97,5 @@
void Offsets::offsetMagneto(float *d, float *D, float *O)
{
- /*for (int i=0; i<3; i++) {
- O[i] = d[i]-D[i];
- }*/
O[0] = d[0]-D[0];
}
\ No newline at end of file
--- a/Offsets.h Fri Apr 17 07:48:05 2015 +0000 +++ b/Offsets.h Fri Apr 17 14:25:25 2015 +0000 @@ -1,3 +1,9 @@ +/* +2014_12_15 +Author: Michał Szewc +Free to use +*/ + #ifndef OFFSETS_H #define OFFSETS_H
--- a/kalman.h Fri Apr 17 07:48:05 2015 +0000
+++ b/kalman.h Fri Apr 17 14:25:25 2015 +0000
@@ -16,13 +16,13 @@
//#define DT 0.002472 //klaman2 + filtr dolno x2
//#define DT 0.00223 //klaman2 + filtr dolno x2 bez kompl
// Q matrix elements
-#define Q1 0.2f //0.2f //5 //10
-#define Q2 2.0f //2.0f //80 //120
-#define Q3 0.01 //0.01f
+#define Q1 0.2f //0.2f //5 //10
+#define Q2 2.0f //2.0f //80 //120
+#define Q3 0.01 //0.01f
// R matrix elements
-#define R1 120 //500.0f //900.0f //90 //tu duzo //10000 //500
-#define R2 150 //600.0f //1500.0f //150 //tu mniej //12000 //600
+#define R1 120 //500.0f //900.0f //90 //tu duzo //10000 //500
+#define R2 150 //600.0f //1500.0f //150 //tu mniej //12000 //600
struct _kalman_data
{
@@ -36,6 +36,4 @@
void kalman_innovate(kalman_data *data, float z1, float z2);
void kalman_init(kalman_data *data);
-
-
#endif /* KALMAN_H_ */
--- a/main.cpp Fri Apr 17 07:48:05 2015 +0000
+++ b/main.cpp Fri Apr 17 14:25:25 2015 +0000
@@ -17,6 +17,10 @@
#define filtr3Sygnal d[5]
+
+#define zad 1
+
+
//kalman
// Structs for containing filter data
kalman_data pitch_data;
@@ -29,8 +33,11 @@
DigitalOut myled2(PTA1);
Serial pc(USBTX, USBRX);
Serial bluetooth(D1, D0);
+
IMU imu(PTE25,PTE24);
+
Offsets off;
+
InterruptIn event(PTB23);
FastPWM M1(D10);
@@ -39,8 +46,8 @@
FastPWM M4(D13);
Ticker triger1; //przerwanie filtracji
-Ticker triger2; //kalibracja accelero
-Ticker triger3; //kalibracja zyro
+//Ticker triger2; //kalibracja accelero
+//Ticker triger3; //kalibracja zyro
Ticker tachometer;
float d[9];
@@ -48,39 +55,33 @@
float o[3];
float O[3];
char buff[160];
-float r,katx,katy,katz;
+float r,katx,katy,katz,katzyro;
float rbut,katxbut,katybut;
float pitch, roll, yaw;
float pitch2, roll2;
-float pitchE, rollE, yawE;
+float pitchma, rollma;
+
double i;
float offsetGyro[3];
float offsetMagneto;
float yawOff;
char odczyt[20];
+
+
char znak;
char znak2;
-float Kp1,Td1,Kd1,Kp2,Td2,Kd2,Kp3,Td3,Kd3,Ti1,Ki1,Ti2,Ki2,Ti3,Ki3,T;
-float U1,U2,U3;
-float Om1,Om2,Om3,Om4;
-float wyp1,wyp2,wyp3,wyp4;
+
int impulsA;
-
double PWM1zad;
double PWM2zad;
double PWM3zad;
double PWM4zad;
-double valPWM1;
-double valPWM2;
-double valPWM3;
-double valPWM4;
-float T1zad,T2zad,T3zad,T4zad;
+
//zmienne tymczasowe
float katxzyro,katyzyro,katzzyro;
float fkompl;
-float xmin, ymin, zmin;
-float xmax, ymax, zmax;
+
float filtrBufor[filtrWymiar];
int filtrZmienna=0;
float filtrSuma=0;
@@ -101,6 +102,8 @@
float kalmanpitchdryf;
int RPMtach;
+int zadanie;
+/*
float PWM4zadBuf[5];
float PWM4zadPoprz;
float PWM4zadWyn;
@@ -109,31 +112,24 @@
int RPMtachAktualny;
float RPMtachWyn;
int RPMtachWynPoprz;
+*/
+
int iTach;
bool TachFlaga;
bool FlagaPom;
-int Omegazad[4];
-int Omegamax[4][9];
-float a1buf[4][9];
-float a2buf[4][9];
-int ister;
-int jster;
bool flagaster;
-float a1[4];
-float a2[4];
void rise(void)
{
- //myled = !myled;
if(TachFlaga==1)impulsA++;
}
-
void task1()
{
- //myled = !myled;
imu.readData(d);
+
+
imu.filterData(d, D);
off.offsetData(d,offsetGyro,o);
off.offsetData2(D,offsetGyro,O);
@@ -144,7 +140,11 @@
yaw = atan2(d[7],d[6])+4.98333*M_PI/180;
katz = katz+(o[2]*dt);
+
+ katzyro=katzyro+o[4]*dt;
+
off.offsetMagneto(&yaw,&offsetMagneto,&yawOff);
+
// Correct for heading < 0deg and heading > 360deg
/*if(yawOff < 0){
yawOff+= 2 * M_PI;
@@ -153,14 +153,7 @@
if(yawOff > 2 * M_PI){
yawOff-= 2 * M_PI;
}*/
-
- /*rbut = sqrt(pow(D[3],2) + pow(D[4],2) + pow(D[5],2));
- katxbut = acos(D[4]/rbut)-M_PI2;
- katybut = acos(D[3]/rbut)-M_PI2;*/
-
- //katxzyro = katxzyro + o[0]*dt;
- //fkompl = katyzyro*0.95+ (-katy)*0.05;
-
+
//Filtr Kalmana
kalman_innovate(&pitch_data, katx, o[0]);
kalman_innovate(&roll_data, -katy, o[1]);
@@ -168,17 +161,10 @@
kalmanpitchzyro = pitch_data.x2;
roll = roll_data.x1;
kalmanrollzyro = roll_data.x2;
-
- /*
- //Filtr Kalmana butterworth 2nd
- kalman_innovate(&pitch_data2, katxbut, O[0]);
- kalman_innovate(&roll_data2, -katybut, O[1]);
- pitch2 = pitch_data2.x1;
- kalmanpitchzyrobut = pitch_data2.x2;
- roll2 = roll_data2.x1;
- kalmanrollzyrobut = roll_data2.x2;*/
+
- if (filtrZmienna < 0) {
+ //moving avarage
+ if (filtrZmienna < 0) {
filtrWynik = filtrSygnal;
filtrBufor[filtrZmienna + filtrWymiar] = filtrSygnal;
filtrSuma = filtrSuma + filtrBufor[filtrZmienna + filtrWymiar];
@@ -199,220 +185,7 @@
if (filtrZmienna == filtrWymiar) {
filtrZmienna = 0;
}
-
- roll = filtrWynik;
-
- if (filtr2Zmienna < 0) {
- filtr2Wynik = filtr2Sygnal;
- filtr2Bufor[filtr2Zmienna + filtr2Wymiar] = filtr2Sygnal;
- filtr2Suma = filtr2Suma + filtr2Bufor[filtr2Zmienna + filtr2Wymiar];
- } else {
- if (filtr2Zmienna == filtr2Wymiar - 1) {
- filtr2Suma = filtr2Suma - filtr2Bufor[filtr2Zmienna];
- filtr2Bufor[filtr2Zmienna] = filtr2Sygnal;
- filtr2Suma = filtr2Suma + filtr2Bufor[filtr2Zmienna];
- filtr2Wynik = filtr2Suma / filtr2Wymiar;
- } else {
- filtr2Suma = filtr2Suma - filtr2Bufor[filtr2Zmienna];
- filtr2Bufor[filtr2Zmienna] = filtr2Sygnal;
- filtr2Suma = filtr2Suma + filtr2Bufor[filtr2Zmienna];
- filtr2Wynik = filtr2Suma / filtr2Wymiar;
- }
- }
- filtr2Zmienna++;
- if (filtr2Zmienna == filtr2Wymiar) {
- filtr2Zmienna = 0;
- }
- pitch=filtr2Wynik;
-
- //U1 = 0.0173*(Kp1*(-pitch2)+Kd1*(0-O[0]));
- //U2 = 0.0169*(Kp2*((-20*M_PI/180)-roll2)+Kd2*(0-O[1]));
- //U3 = 0.0333*(/*Kp3*((105*M_PI/180)-fYaw)+*/Kd3*(0-O[2])*180/M_PI);
-
- //Om1 = 0.00576066*pow((PWM1zad-10000),2) - U2/0.000024768 + U3/0.000132 ; //kwadraty
- //Om2 = 0.00576066*pow((PWM2zad-10000),2) + U1/0.000024768 - U3/0.000132 ;
- //Om3 = 0.00576066*pow((PWM3zad-10000),2) + U2/0.000024768 + U3/0.000132 ;
- //Om4 = 0.00576066*pow((PWM4zad-10000),2) - U1/0.000024768 - U3/0.000132 ;
-
- /*wyp1 = sqrt(Om1)*13.17523+10000;
- wyp2 = sqrt(Om2)*13.17523+10000;
- wyp3 = sqrt(Om3)*13.17523+10000;
- wyp4 = sqrt(Om4)*13.17523+10000;*/
-
-
- // *********************** DISCRETE PID CONTROLLER **********************
- //stale
- //b=0.000015
- //B1=0.000776646
- //C1=-0.334958973
- //l=0.3
- //d=0.000033
- //4d=0.000132
-
- //B1/b1=50.22498189
- //C1/b1=-21611.4954
- //b1/B1=0.01991041
- //C1/B1=-431.2892625
- //1/B1=1287.588322
-
- //2b2l=0.000009424
- //B2/b2=51.130533
- //C2/b2=-30717.00651
- //b2/B2=0.019557786
- //C2/B2=-600.7566265
-
- //2b3l=0.000009139
- //B3/b3=50.66613192
- //C3/b3=-26072.99576
- //b3/B3=0.01973705
- //C3/B3=-514.6040317
-
- //2b4l=0.000009276
- //B4/b4=50.95680893
- //C4/b4=-28979.76588
- //b4/B4=0.019624463
- //C4/B4=-568.7123367
-
- //stare 2b*l
- //0.0000092780
- //0.000009424
- //0.000009139
- //0.000009276
-
- //2b1l=0.000000096789585
- //2b2l=0.000000095889323
- //2b3l=0.000000097529031
- //2b4l=0.000000093579744
-
- // U1=Ixx*(Kp1*(katzad-kat)+Kd1*(omegazad-omega)+Ki1*sumauchyb)
- // U2=Iyy*(Kp2*(katzad-kat)+Kd2*(omegazad-omega)+Ki2*sumauchyb)
- // U3=Izz*(Kp3*(katzad-kat)+Kd3*(omegazad-omega)+Ki3*sumauchyb)
- //omega1^2=(B1/b1*PWM1zad+C1/b1)-U2/2b1l+U3/4d
- //omega2^2=(B2/b2*PWM2zad+C2/b2)+U1/2b2l-U3/4d
- //omega3^2=(B3/b3*PWM3zad+C3/b3)+U2/2b3l+U3/4d
- //omega4^2=(B4/b4*PWM4zad+C4/b4)-U1/2b4l-U3/4d
- //wyp1=b/B1*omega1^2-C1/B1
- //wyp2=b/B*omega2^2-C/B
- //wyp3=b/B3*omega3^2-C3/B3
- //wyp4=b/B*omega4^2-C/B
-
- //B*PWMzad+C=T
- //PWMzad=1/B*T-C/B
- /*
- PWMzad1=1287.588322*T1zad-(-431.2892625);
- PWMzad2=1245.207965*T2zad-(-600.7566265);
- PWMzad3=1295.740776*T3zad-(-514.6040317);
- PWMzad4=1269.412072*T4zad-(-568.7123367);*/
- /*
- wyp1=0.01991041*Om1-(-431.2892625)+PWM1zad;
- wyp2=0.019557786*Om2-(-600.7566265)+PWM2zad;
- wyp3=0.01973705*Om3-(-514.6040317)+PWM3zad;
- wyp4=0.019624463*Om4-(-568.7123367)+PWM4zad;
- */
-
- pitchE=pitchE+(0-pitch);
- if(pitchE>3) pitchE=3;
- if(pitchE<-3) pitchE=-3;
- //Kd1=Kp1*Td1/T;
- //if(Ti1==0){Ki1=0;}else Ki1=Kp1*T/Ti1;
-
- rollE=rollE+(0-roll2);
- if(rollE>5) rollE=5;
- if(rollE<-5) rollE=-5;
- //Kd2=Kp2*Td2/T;
- //if(Ti2==0){Ki2=0;}else Ki2=Kp2*T/Ti2;
-
- /* yawE=yawE+(0-roll2);
- if(yawE>3) yawE=3;*/
- Kd3=Kp3*Td3/T;
- //if(Ti3==0){Ki3=0;}else Ki3=Kp3*T/Ti3;
-
- //U1 = 0.0346*(Kp1*(0-pitch)+Kd1*(0-(-kalmanpitchzyro))+Ki1*pitchE);
- //U2 = 0.0338*(Kp2*(0-roll)+Kd2*(0-o[1])+Ki2*rollE);
- //U3 = 0.0666*(/*Kp3*((105*M_PI/180)-fYaw)+*/Kd3*(0-O[2]));//+Ki3*rollE);
-
- U1 = 0.0173*(Kp1*(0-pitch)+Kd1*(0+kalmanpitchzyro)+Ki1*pitchE);
- U2 = 0.0169*(Kp2*(0-roll)+Kd2*(0-kalmanrollzyro)+Ki2*rollE);
- U3 = 0.0333*(/*Kp3*((105*M_PI/180)-fYaw)+*/Kd3*(0-o[2]));//+Ki3*rollE);
-
- Om1 = Omegazad[0]*Omegazad[0]-U2/0.000000096789585 + U3/0.000132 ; //kwadraty
- Om2 = Omegazad[1]*Omegazad[1]+U1/0.000000095889323 - U3/0.000132 ;
- Om3 = Omegazad[2]*Omegazad[2]+U2/0.000000097529031 + U3/0.000132 ;
- Om4 = Omegazad[3]*Omegazad[3]-U1/0.000000093579744 - U3/0.000132 ;
-
- wyp1=(sqrt(Om1)-a2[0])/a1[0];
- wyp2=(sqrt(Om2)-a2[1])/a1[1];
- wyp3=(sqrt(Om3)-a2[2])/a1[2];
- wyp4=(sqrt(Om4)-a2[3])/a1[3];
-
- if(wyp1<=10001 || wyp1>40001) valPWM1=10000;
- if(wyp1>=20000 && wyp1<40000) valPWM1=20000;
- if(wyp1>10001 && wyp1<20000) valPWM1=(int)wyp1;
-
- if(wyp2<=10001 || wyp2>40001) valPWM2=10000;
- if(wyp2>=20000 && wyp2<40000) valPWM2=20000;
- if(wyp2>10001 && wyp2<20000) valPWM2=(int)wyp2;
-
- if(wyp3<=10001 || wyp3>40001) valPWM3=10000;
- if(wyp3>=20000 && wyp3<40000) valPWM3=20000;
- if(wyp3>10001 && wyp3<20000) valPWM3=(int)wyp3;
-
- if(wyp4<=10001 || wyp4>40001) valPWM4=10000;
- if(wyp4>=20000 && wyp4<40000) valPWM4=20000;
- if(wyp4>10001 && wyp4<20000) valPWM4=(int)wyp4;
-
-
- //sprintf(buff, "%f,%f,%f,%f\n\r", -katy*180/M_PI, roll*180/M_PI, -katybut*180/M_PI, roll2*180/M_PI);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", -katy, roll, -katybut, roll2, (d[0]*180/M_PI),(D[0]*180/M_PI),(d[1]*180/M_PI),(D[1]*180/M_PI),(o[0]*180/M_PI),(O[0]*180/M_PI),(o[1]*180/M_PI),(O[1]*180/M_PI));
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", offsetGyro[0]*180/M_PI, offsetGyro[1]*180/M_PI, offsetGyro[2]*180/M_PI, roll2, (d[0]*180/M_PI),(D[0]*180/M_PI),(d[1]*180/M_PI),(D[1]*180/M_PI),(o[0]*180/M_PI),(O[0]*180/M_PI),(o[1]*180/M_PI),(O[1]*180/M_PI));
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", -katy, roll, -katybut, roll2, (d[0]*180/M_PI),(D[0]*180/M_PI),(d[1]*180/M_PI),(D[1]*180/M_PI),(o[0]*180/M_PI),(O[0]*180/M_PI),(o[1]*180/M_PI),(O[1]*180/M_PI));
- //pc.printf(buff);
-
- M1.pulsewidth_us(valPWM1);
- M2.pulsewidth_us(valPWM2);
- M3.pulsewidth_us(valPWM3);
- M4.pulsewidth_us(valPWM4);
-
- //myled = !myled;
-}
-
-/*
-void task2()
-{
-
- sprintf(buff, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", -katy*180/M_PI, roll*180/M_PI, -katybut*180/M_PI, roll2*180/M_PI, katx*180/M_PI, pitch*180/M_PI, katxbut*180/M_PI, pitch2*180/M_PI,(o[0]*180/M_PI),(O[0]*180/M_PI),(o[1]*180/M_PI),(O[1]*180/M_PI));
- pc.printf(buff);
- myled2 = !myled2;
- imu.readData(d);
-
- if (filtrZmienna < 0) {
- filtrWynik = filtrSygnal;
- filtrBufor[filtrZmienna + filtrWymiar] = filtrSygnal;
- filtrSuma = filtrSuma + filtrBufor[filtrZmienna + filtrWymiar];
- } else {
- if (filtrZmienna == filtrWymiar - 1) {
- filtrSuma = filtrSuma - filtrBufor[filtrZmienna];
- filtrBufor[filtrZmienna] = filtrSygnal;
- filtrSuma = filtrSuma + filtrBufor[filtrZmienna];
- filtrWynik = filtrSuma / filtrWymiar;
- } else {
- filtrSuma = filtrSuma - filtrBufor[filtrZmienna];
- filtrBufor[filtrZmienna] = filtrSygnal;
- filtrSuma = filtrSuma + filtrBufor[filtrZmienna];
- filtrWynik = filtrSuma / filtrWymiar;
- }
- }
- filtrZmienna++;
- if (filtrZmienna == filtrWymiar) {
- filtrZmienna = 0;
- }
-
- if (filtrWynik < xmin) xmin=filtrWynik;
- if (filtrWynik > xmax) xmax=filtrWynik;
-
+ rollma = filtrWynik;
if (filtr2Zmienna < 0) {
filtr2Wynik = filtr2Sygnal;
@@ -435,132 +208,64 @@
if (filtr2Zmienna == filtr2Wymiar) {
filtr2Zmienna = 0;
}
-
- if (filtr2Wynik < ymin) ymin=filtr2Wynik;
- if (filtr2Wynik > ymax) ymax=filtr2Wynik;
+ pitchma=filtr2Wynik;
+
+}
+
+/*
+void task2()
+{
- if (filtr3Zmienna < 0) {
- filtr3Wynik = filtr3Sygnal;
- filtr3Bufor[filtr3Zmienna + filtr3Wymiar] = filtr3Sygnal;
- filtr3Suma = filtr3Suma + filtr3Bufor[filtr3Zmienna + filtr3Wymiar];
- } else {
- if (filtr3Zmienna == filtr3Wymiar - 1) {
- filtr3Suma = filtr3Suma - filtr3Bufor[filtr3Zmienna];
- filtr3Bufor[filtr3Zmienna] = filtr3Sygnal;
- filtr3Suma = filtr3Suma + filtr3Bufor[filtr3Zmienna];
- filtr3Wynik = filtr3Suma / filtr3Wymiar;
- } else {
- filtr3Suma = filtr3Suma - filtr3Bufor[filtr3Zmienna];
- filtr3Bufor[filtr3Zmienna] = filtr3Sygnal;
- filtr3Suma = filtr3Suma + filtr3Bufor[filtr3Zmienna];
- filtr3Wynik = filtr3Suma / filtr3Wymiar;
- }
- }
- filtr3Zmienna++;
- if (filtr3Zmienna == filtr3Wymiar) {
- filtr3Zmienna = 0;
- }
-
- if (filtr3Wynik < zmin) zmin=filtr3Wynik;
- if (filtr3Wynik > zmax) zmax=filtr3Wynik;
-
- //sprintf(buff, "%f,%f,%f,%f\n\r", d[4],filtrWynik,ymin,ymax);
- //pc.printf(buff);
}
void task3()
{
- imu.readData(d);
- off.offsetData(d,offsetGyro,o);
- katxzyro = katxzyro + o[0]*dt;
- katyzyro = katyzyro + o[1]*dt;
- katzzyro = katzzyro + o[2]*dt;
- r = sqrt(pow(d[3],2) + pow(d[4],2) + pow(d[5],2));
- katx = acos(d[4]/r)-M_PI2;
- katy = acos(d[3]/r)-M_PI2;
-
- kalman_innovate(&pitch_data, katx, o[0]);
- kalman_innovate(&roll_data, -katy, o[1]);
- pitch = pitch_data.x1;
- kalmanpitchzyro = pitch_data.x2;
- kalmanpitchdryf = pitch_data.x3;
- roll = roll_data.x1;
}
*/
+
+
void task_tachometer()
{
TachFlaga=0;
- if(FlagaPom==1){
- PWM4zad+=5;
- M3.pulsewidth_us(PWM4zad);
- }
- wait(0.5f);
- TachFlaga=1;
- //myled2=!myled2;
- RPMtach=impulsA*10; // dla T=3s
- //RPMtach=impulsA*6; //dla T=5s
+
+ //RPMtach=impulsA*10; // dla T=3s
+ RPMtach=impulsA*6; //dla T=5s
//RPMtach=impulsA*3; //dla T=10s
- //RPMtachAktualny=impulsA*3;
- /*
- if (TachFlaga==1){
- RPMtachBuf[iTach]=RPMtachAktualny;
- iTach++;
- if (iTach>3){
- RPMtachWyn=(RPMtachBuf[iTach-1]+RPMtachBuf[iTach-2]+RPMtachBuf[iTach-3])/3;
- RPMtachWynPoprz=RPMtachWyn;
- PWM4zadWyn=PWM4zad;
- TachFlaga=0;
- iTach=0;
- RPMtach=RPMtachAktualny;
- }
- }else{
- if(abs(PWM4zadPoprz-PWM4zad)>0 && abs(RPMtachAktualny-RPMtachWynPoprz)>20){
- TachFlaga=1;
- }
- //RPMtach=RPMtachAktualny;
- PWM4zadPoprz=PWM4zad;
- PWM4zad+=1;
- M4.pulsewidth_us(PWM4zad);
- //if(PWM4zad>14000)PWM4zad=10000;
- }
- sprintf(buff, "%f,%i,%f,%f\n\r", PWM4zad,RPMtachAktualny,PWM4zadWyn,RPMtachWyn);
+
+ sprintf(buff, "%f,%i\n\r", PWM1zad,RPMtach);
pc.printf(buff);
- */
- sprintf(buff, "%f,%i\n\r", PWM4zad,RPMtach);
- pc.printf(buff);
- //iTach++;
- //if(iTach%2>0)PWM4zad+=1;
- //M4.pulsewidth_us(PWM4zad);
- //RPMtachWyn=0;
- //PWM4zadWyn=0;
impulsA=0;
+ TachFlaga=1;
}
+
int main() {
+ zadanie=zad;
+
pc.baud(115200);
bluetooth.baud(19200);
imu.init();
+
+
kalman_init(&pitch_data);
kalman_init(&roll_data);
kalman_init(&pitch_data2);
kalman_init(&roll_data2);
- //event.rise(&rise);
- //event.mode(PullUp);
- //event.enable_irq();
+
sprintf(buff, "Hello: \n\r");
pc.printf(buff);
- off.setOffsets(offsetGyro,&offsetMagneto, bluetooth, imu);
+ off.setOffsets(offsetGyro,&offsetMagneto, pc, imu);
i=1000;
-
+
PWM1zad=10000;
PWM2zad=10000;
PWM3zad=10000;
@@ -575,212 +280,42 @@
M4.period_us(PWM_period);
M4.pulsewidth_us(PWM4zad);
- /*Kp1=10;
- Kp2=8;
- Kp3=0;
- Kd1=8;
- Kd2=16;
- Kd3=5000;
- Ki1=0.1;
- Ki2=0.2;
- Ki3=0;
- Td1=0;
- Td2=0;
- Td3=0;
- Ti1=0;
- Ti2=0;
- Ti3=0;
- T=0.005;*/
- Kp1=12;
- Kp2=12;
- Kp3=0;
- Kd1=2;
- Kd2=2;
- Kd3=0;
- Ki1=0;
- Ki2=0;
- Ki3=0;
- Td1=0;
- Td2=0;
- Td3=0;
- Ti1=0;
- Ti2=0;
- Ti3=0;
- T=0.005;
-
- rollE=0;
-
+ /*rollE=0;
katxzyro = 0;
katyzyro = 0;
- katzzyro = 0;
+ katzzyro = 0;*/
iTach=0;
TachFlaga=0;
-
-a1buf[0][0]= 1.438602213;
-a1buf[0][1]= 1.130064065;
-a1buf[0][2]= 0.958928363;
-a1buf[0][3]= 0.836156086;
-a1buf[0][4]= 0.735165987;
-a1buf[0][5]= 0.619988352;
-a1buf[0][6]= 0.580966803;
-a1buf[0][7]= 0.580966803;
-a1buf[0][8]= 0.580966803;
-a1buf[1][0]= 1.55790332;
-a1buf[1][1]= 1.181479324;
-a1buf[1][2]= 1.001071637;
-a1buf[1][3]= 0.872754805;
-a1buf[1][4]= 0.699592312;
-a1buf[1][5]= 0.644682586;
-a1buf[1][6]= 0.596575422;
-a1buf[1][7]= 0.596575422;
-a1buf[1][8]= 0.596575422;
-a1buf[2][0]= 1.475317414;
-a1buf[2][1]= 1.159883518;
-a1buf[2][2]= 0.965894001;
-a1buf[2][3]= 0.85553873;
-a1buf[2][4]= 0.738311008;
-a1buf[2][5]= 0.627093768;
-a1buf[2][6]= 0.627093768;
-a1buf[2][7]= 0.627093768;
-a1buf[2][8]= 0.627093768;
-a1buf[3][0]= 1.40570763;
-a1buf[3][1]= 1.143366337;
-a1buf[3][2]= 0.953383809;
-a1buf[3][3]= 0.850413512;
-a1buf[3][4]= 0.734304019;
-a1buf[3][5]= 0.634804892;
-a1buf[3][6]= 0.588398369;
-a1buf[3][7]= 0.588305183;
-a1buf[3][8]= 0.588305183;
+
-a2buf[0][0]= -14020.22132;
-a2buf[0][1]= -10629.35935;
-a2buf[0][2]= -8667.80431;
-a2buf[0][3]= -7195.189284;
-a2buf[0][4]= -5935.445545;
-a2buf[0][5]= -4432.964473;
-a2buf[0][6]= -3899.481654;
-a2buf[0][7]= -3899.481654;
-a2buf[0][8]= -3899.481654;
-a2buf[1][0]= -15394.5894;
-a2buf[1][1]= -11261.14735;
-a2buf[1][2]= -9187.344205;
-a2buf[1][3]= -7648.375073;
-a2buf[1][4]= -5478.811881;
-a2buf[1][5]= -4780.460105;
-a2buf[1][6]= -4131.426907;
-a2buf[1][7]= -4131.426907;
-a2buf[1][8]= -4131.426907;
-a2buf[2][0]= -14446.09785;
-a2buf[2][1]= -10984.43215;
-a2buf[2][2]= -8760.145603;
-a2buf[2][3]= -7434.705882;
-a2buf[2][4]= -5971.980198;
-a2buf[2][5]= -4525.428072;
-a2buf[2][6]= -4525.428072;
-a2buf[2][7]= -4525.428072;
-a2buf[2][8]= -4525.428072;
-a2buf[3][0]= -13645.61444;
-a2buf[3][1]= -10761.08911;
-a2buf[3][2]= -8579.586488;
-a2buf[3][3]= -7342.912056;
-a2buf[3][4]= -5896.039604;
-a2buf[3][5]= -4603.83809;
-a2buf[3][6]= -3978.10134;
-a2buf[3][7]= -3976.928363;
-a2buf[3][8]= -3976.928363;
-
-Omegamax[0][0]= 1790;
-Omegamax[0][1]= 2360;
-Omegamax[0][2]= 2830;
-Omegamax[0][3]= 3250;
-Omegamax[0][4]= 3620;
-Omegamax[0][5]= 3950;
-Omegamax[0][6]= 4230;
-Omegamax[0][7]= 4270;
-Omegamax[0][8]= 20000;
-Omegamax[1][0]= 1710;
-Omegamax[1][1]= 2300;
-Omegamax[1][2]= 2820;
-Omegamax[1][3]= 3260;
-Omegamax[1][4]= 3590;
-Omegamax[1][5]= 3920;
-Omegamax[1][6]= 4220;
-Omegamax[1][7]= 4240;
-Omegamax[1][8]= 20000;
-Omegamax[2][0]= 1760;
-Omegamax[2][1]= 2360;
-Omegamax[2][2]= 2810;
-Omegamax[2][3]= 3250;
-Omegamax[2][4]= 3630;
-Omegamax[2][5]= 3940;
-Omegamax[2][6]= 4110;
-Omegamax[2][7]= 4110;
-Omegamax[2][8]= 20000;
-Omegamax[3][0]= 1790;
-Omegamax[3][1]= 2380;
-Omegamax[3][2]= 2880;
-Omegamax[3][3]= 3270;
-Omegamax[3][4]= 3650;
-Omegamax[3][5]= 3970;
-Omegamax[3][6]= 4250;
-Omegamax[3][7]= 4300;
-Omegamax[3][8]= 20000;
-
- a1[0]=a1buf[0][0];
- a2[0]=a2buf[0][0];
- a1[1]=a1buf[1][0];
- a2[1]=a2buf[1][0];
- a1[2]=a1buf[2][0];
- a2[2]=a2buf[2][0];
- a1[3]=a1buf[3][0];
- a2[3]=a2buf[3][0];
-
- triger1.attach(&task1, 0.005);
- //triger2.attach(&task2, 0.005);
- //triger3.attach(&task3, 0.005);
- //tachometer.attach(&task_tachometer, 3.5);
+ switch (zadanie){
+ case 1:
+ triger1.attach(&task1, 0.005);
+ break;
+
+ case 2:
+ event.rise(&rise);
+ event.mode(PullUp);
+ event.enable_irq();
+ tachometer.attach(&task_tachometer, 5);
+ break;
+ };
while(1) {
+//WYSYLANIE DANYCH PO PC UART
- //myled2 = !myled2;
- //sprintf(buff, "%f,%f,%f,0,%f,%f,%f,%f,%f,%f,\n\r", -katybut*180/M_PI, roll2*180/M_PI, (O[1]*180/M_PI),valPWM1,valPWM3,Kp2,Kd2,Ki2,rollE);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f,%f,%f\n\r", -katybut*180/M_PI, roll2*180/M_PI, (O[1]*180/M_PI), -katy*180/M_PI, roll*180/M_PI, o[1]*180/M_PI,valPWM3);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f\n\r", -katy*180/M_PI, roll*180/M_PI, katzyro*180/M_PI, fkompl*180/M_PI,roll2*180/M_PI);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", d[3],d[4],d[5],xmin,xmax,ymin,ymax,zmin,zmax);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", d[3],filtrWynik,d[4],filtr2Wynik,d[5],filtr3Wynik,xmin,xmax,ymin,ymax,zmin,zmax);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f\n\r", d[0],d[1],d[2]);
- //pc.printf(buff);
- //sprintf(buff, "0,%f,%f,%f,%f,%f,%f,\n\r", -katy*180/M_PI,roll*180/M_PI,-katybut*180/M_PI,roll2*180/M_PI,kalmanrollzyro*180/M_PI,kalmanrollzyrobut*180/M_PI);
- //pc.printf(buff);
- //sprintf(buff, "0,%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", pitch*180/M_PI,pitch2*180/M_PI,o[0]*180/M_PI,valPWM2,valPWM4,Kp1,Kd1,Ki1,pitchE*180/M_PI);
- //pc.printf(buff);
- //sprintf(buff, "0,%f,%f,%f,%f,%f,%f,%f\n\r", katx*180/M_PI,pitch*180/M_PI,o[0]*180/M_PI,PWM2zad,valPWM2,PWM4zad,valPWM4);
- //pc.printf(buff);
- //sprintf(buff, "0,%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", pitch*180/M_PI, -kalmanpitchzyro*180/M_PI,Kd1,Kp1,Ki1);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f\n\r", valPWM4,RPMtach,valPWM3,valPWM2,valPWM1);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f,%f\n\r", katx*180/M_PI,pitch*180/M_PI,katxzyro*180/M_PI,o[0]*180/M_PI,kalmanpitchzyro*180/M_PI,kalmanpitchdryf*180/M_PI);
- //pc.printf(buff);
- //sprintf(buff, "%f,%f,%f,%f,%f,%f,%f\n\r", yaw*180/M_PI,yawOff*180/M_PI,d[6],d[7],d[8],o[2]*180/M_PI,katz*180/M_PI);
- //pc.printf(buff);
- //myled2 = !myled2;
- //sprintf(buff, "%i,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n\r", Omegazad[0],PWM1zad,PWM2zad,PWM3zad,PWM4zad,a1[0],a1[1],a1[2],a1[3],a2[0],a2[1],a2[2],a2[3]);
- //pc.printf(buff);
-
-
-
- sprintf(buff, "%f,%f,%f,%f,%f,%f,%f,%f\n\r", roll*180/M_PI,valPWM1,valPWM2,valPWM3,valPWM4,Kp1,Kd1,Ki1);
- pc.printf(buff);
+ switch (zadanie){
+ case 1:
+ sprintf(buff, "0,%f,%f,%f,%f\n\r", -katy*180/M_PI, katzyro*180/M_PI, roll*180/M_PI);
+ pc.printf(buff);
+ break;
+
+ case 2:
+ break;
+ };
if(pc.readable()){
@@ -788,166 +323,48 @@
switch (znak){
case 'r':
- sprintf(buff, "Resetuje zmienne %c\n\r",znak);
- pc.printf(buff);
- xmin=0;
- ymin=0;
- zmin=0;
- xmax=0;
- ymax=0;
- zmax=0;
break;
case 't':
- PWM4zad++;
- M3.pulsewidth_us(PWM4zad);
- break;
- case 'g':
- PWM4zad--;
- M3.pulsewidth_us(PWM4zad);
- break;
- case 'y':
- PWM4zad+=10;
- M3.pulsewidth_us(PWM4zad);
- break;
- case 'h':
- PWM4zad-=10;
- M3.pulsewidth_us(PWM4zad);
- break;
- case 'u':
- PWM4zad+=100;
- M3.pulsewidth_us(PWM4zad);
- break;
- case 'j':
- PWM4zad-=100;
- M3.pulsewidth_us(PWM4zad);
- break;
- case 's':
- PWM4zad=10000;
- M3.pulsewidth_us(PWM4zad);
- break;
- case 'b':
- PWM4zad=10000;
- M3.pulsewidth_us(PWM4zad);
- break;
- case 'z':
- FlagaPom=1;
- break;
- case 'x':
- FlagaPom=0;
+ PWM1zad+=50;
+ if(PWM1zad>=20000){
+ PWM1zad=20000;
+ }
+ M1.pulsewidth_us(PWM1zad);
break;
- /*case 'u':
- PWM1zad+=10;
+ case 'g':
+ PWM1zad-=50;
+ if(PWM1zad<10000){
+ PWM1zad=10000;
+ }
M1.pulsewidth_us(PWM1zad);
break;
- case 'j':
- PWM1zad-=10;
- M1.pulsewidth_us(PWM1zad);
- break;*/
- }
- znak=0;
- }
-
-
- if(bluetooth.readable()){
-
- znak2=bluetooth.getc();
-
- switch (znak2){
+ case 'y':
+ break;
+ case 'h':
+ break;
- case 'a':
- for(jster=0;jster<4;jster++){
- Omegazad[jster]-=50;
- }
- flagaster=1;
-
- /*T1zad-=0.05;
- T2zad-=0.05;
- T3zad-=0.05;
- T4zad-=0.05;
- PWM1zad=1287.588322*T1zad-(-431.2892625)+10000;
- PWM2zad=1245.207965*T2zad-(-600.7566265)+10000;
- PWM3zad=1295.740776*T3zad-(-514.6040317)+10000;
- PWM4zad=1269.412072*T4zad-(-568.7123367)+10000;*/
+ case 'u':
+ break;
- /*
- //PWM3zad-=50;
- PWM4zad-=50;
- //PWM2zad=1.045*(PWM4zad-10000)+10000;
- //PWM1zad=1.026*(PWM3zad-10000)+10000;
+ case 'j':
+ break;
- //PWM1zad=1.026*(PWM3zad-10000)+10000;
- //PWM1zad-=50;
- if(PWM1zad<10000){
- PWM1zad=10000;
- PWM2zad=10000;
- PWM3zad=10000;
- PWM4zad=10000;
- }
- //ustawianie
- M1.pulsewidth_us(PWM1zad);
- M2.pulsewidth_us(PWM2zad);
- M3.pulsewidth_us(PWM3zad);
- M4.pulsewidth_us(PWM4zad);
- */
- znak2=0;
-
+ case 's':
break;
case 'b':
- for(jster=0;jster<4;jster++){
- Omegazad[jster]+=50;
- }
- flagaster=1;
- /*T1zad+=0.05;
- T2zad+=0.05;
- T3zad+=0.05;
- T4zad+=0.05;
- PWM1zad=1287.588322*T1zad-(-431.2892625)+10000;
- PWM2zad=1245.207965*T2zad-(-600.7566265)+10000;
- PWM3zad=1295.740776*T3zad-(-514.6040317)+10000;
- PWM4zad=1269.412072*T4zad-(-568.7123367)+10000;*/
- /*
- //PWM3zad+=50;
- PWM4zad+=50;
- //PWM2zad=1.045*(PWM4zad-10000)+10000;
- //PWM3zad+=50;
- //PWM1zad=1.026*(PWM3zad-10000)+10000;
+ break;
- //PWM1zad+=50;
- if(PWM1zad>=20000){
- PWM1zad=20000;
- PWM2zad=20000;
- PWM3zad=20000;
- PWM4zad=20000;
- }
- //ustawianie
- M1.pulsewidth_us(PWM1zad);
- M2.pulsewidth_us(PWM2zad);
- M3.pulsewidth_us(PWM3zad);
- M4.pulsewidth_us(PWM4zad);
- */
- znak2=0;
+ case 'z':
break;
case 'x':
- //sprintf(buff,"Nastawy: %f,%f\n\r",Kp2,Kd2);
- //pc.printf(buff);
- //wait(1.0f);
- for(jster=0;jster<4;jster++){
- Omegazad[jster]=0;
- }
PWM1zad=10000;
- PWM2zad=10000;
- PWM3zad=10000;
- PWM4zad=10000;
M1.pulsewidth_us(PWM1zad);
- M2.pulsewidth_us(PWM2zad);
- M3.pulsewidth_us(PWM3zad);
- M4.pulsewidth_us(PWM4zad);
sprintf(buff,"Odlacz silniki\n\r");
pc.printf(buff);
wait(1.0f);
@@ -970,66 +387,116 @@
pc.printf(buff);
break;
+ case 0x20:
+ PWM1zad=10000;
+ M1.pulsewidth_us(PWM1zad);
+ sprintf(buff,"Odlacz silniki\n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"5 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"4 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"3 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"2 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"1 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"GO! \n\r");
+ pc.printf(buff);
+ break;
+
+ }
+
+ znak=0;
+ }
+
+
+ if(bluetooth.readable()){
+
+ znak2=bluetooth.getc();
+
+ switch (znak2){
+
+ case 'a':
+ PWM1zad-=50;
+ flagaster=1;
+ znak2=0;
+ break;
+
+ case 'b':
+ PWM1zad+=50;
+ flagaster=1;
+ znak2=0;
+ break;
+
+ case 'x':
+ PWM1zad=10000;
+ M1.pulsewidth_us(PWM1zad);
+
+ sprintf(buff,"Odlacz silniki\n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"5 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"4 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"3 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"2 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"1 \n\r");
+ pc.printf(buff);
+ wait(1.0f);
+ sprintf(buff,"GO! \n\r");
+ pc.printf(buff);
+ break;
+
+
case 'c':
- Kd1-=0.5;
- Kd2-=0.5;
+
break;
case 'd':
- Kd1+=0.5;
- Kd2+=0.5;
+
break;
case 'e':
- Kp1-=0.5;
- Kp2-=0.5;
+
break;
case 'f':
- Kp1+=0.5;
- Kp2+=0.5;
+
break;
case 'g':
- Ki1-=0.1;
- Ki2-=0.1;
+
break;
case 'h':
- Ki1+=0.1;
- Ki2+=0.1;
+
break;
}
if(flagaster==1){
- for(int jster=0;jster<4;jster++){
- ister=-1;
- do{
- ister++;
- }while(Omegazad[jster] > Omegamax[jster][ister]);
- a1[jster]=a1buf[jster][ister];
- a2[jster]=a2buf[jster][ister];
- }
- PWM1zad=(Omegazad[0]-a2[0])/a1[0];
- PWM2zad=(Omegazad[1]-a2[1])/a1[1];
- PWM3zad=(Omegazad[2]-a2[2])/a1[2];
- PWM4zad=(Omegazad[3]-a2[3])/a1[3];
if(PWM1zad<10000){
PWM1zad=10000;
- }
- if(PWM2zad<10000){
- PWM2zad=10000;
- }
- if(PWM3zad<10000){
- PWM3zad=10000;
- }
- if(PWM4zad<10000){
- PWM4zad=10000;
- }
- M1.pulsewidth_us(PWM1zad);
- M2.pulsewidth_us(PWM2zad);
- M3.pulsewidth_us(PWM3zad);
- M4.pulsewidth_us(PWM4zad);
-
+ }
+
+ if(PWM1zad>=20000){
+ PWM1zad=20000;
+ }
+
+ M1.pulsewidth_us(PWM1zad);
flagaster=0;
}
