Dydaktyka
Dependencies: FastPWM mbed-src
Fork of 2015_04_17_quadro_bez_sterowania by
main.cpp
- Committer:
- Michu90
- Date:
- 2015-04-17
- Revision:
- 12:e955cc086c42
- Parent:
- 11:38db3ed41f13
File content as of revision 12:e955cc086c42:
#include "mbed.h" #include "FastPWM.h" #include "kalman.h" #include "Offsets.h" #include "stdio.h" #include "IMU.h" #define PWM_period 2500 #define M_PI 3.141592 #define M_PI2 1.570796 #define dt 0.005 #define filtrWymiar 5 #define filtrSygnal roll #define filtr2Wymiar 5 #define filtr2Sygnal pitch #define filtr3Wymiar 100 #define filtr3Sygnal d[5] #define zad 1 //kalman // Structs for containing filter data kalman_data pitch_data; kalman_data roll_data; kalman_data pitch_data2; kalman_data roll_data2; DigitalOut myled(PTA2); DigitalOut myled2(PTA1); Serial pc(USBTX, USBRX); Serial bluetooth(D1, D0); IMU imu(PTE25,PTE24); Offsets off; InterruptIn event(PTB23); FastPWM M1(D10); FastPWM M2(D11); FastPWM M3(D12); FastPWM M4(D13); Ticker triger1; //przerwanie filtracji //Ticker triger2; //kalibracja accelero //Ticker triger3; //kalibracja zyro Ticker tachometer; float d[9]; double D[9]; float o[3]; float O[3]; char buff[160]; float r,katx,katy,katz,katzyro; float rbut,katxbut,katybut; float pitch, roll, yaw; float pitch2, roll2; float pitchma, rollma; double i; float offsetGyro[3]; float offsetMagneto; float yawOff; char odczyt[20]; char znak; char znak2; int impulsA; double PWM1zad; double PWM2zad; double PWM3zad; double PWM4zad; //zmienne tymczasowe float katxzyro,katyzyro,katzzyro; float fkompl; float filtrBufor[filtrWymiar]; int filtrZmienna=0; float filtrSuma=0; float filtrWynik; float filtr2Bufor[filtrWymiar]; int filtr2Zmienna=0; float filtr2Suma=0; float filtr2Wynik; float filtr3Bufor[filtrWymiar]; int filtr3Zmienna=0; float filtr3Suma=0; float filtr3Wynik; float kalmanpitchzyro; float kalmanpitchzyrobut; float kalmanrollzyro; float kalmanrollzyrobut; float kalmanpitchdryf; int RPMtach; int zadanie; /* float PWM4zadBuf[5]; float PWM4zadPoprz; float PWM4zadWyn; float RPMtachBuf[5]; int RPMtachPoprz; int RPMtachAktualny; float RPMtachWyn; int RPMtachWynPoprz; */ int iTach; bool TachFlaga; bool FlagaPom; bool flagaster; void rise(void) { if(TachFlaga==1)impulsA++; } void task1() { imu.readData(d); imu.filterData(d, D); off.offsetData(d,offsetGyro,o); off.offsetData2(D,offsetGyro,O); 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; 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; } if(yawOff > 2 * M_PI){ yawOff-= 2 * M_PI; }*/ //Filtr Kalmana kalman_innovate(&pitch_data, katx, o[0]); kalman_innovate(&roll_data, -katy, o[1]); pitch = -pitch_data.x1; kalmanpitchzyro = pitch_data.x2; roll = roll_data.x1; kalmanrollzyro = roll_data.x2; //moving avarage 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; } rollma = 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; } pitchma=filtr2Wynik; } /* void task2() { } void task3() { } */ void task_tachometer() { TachFlaga=0; //RPMtach=impulsA*10; // dla T=3s RPMtach=impulsA*6; //dla T=5s //RPMtach=impulsA*3; //dla T=10s sprintf(buff, "%f,%i\n\r", PWM1zad,RPMtach); pc.printf(buff); 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); sprintf(buff, "Hello: \n\r"); pc.printf(buff); off.setOffsets(offsetGyro,&offsetMagneto, pc, imu); i=1000; PWM1zad=10000; PWM2zad=10000; PWM3zad=10000; PWM4zad=10000; M1.period_us(PWM_period); M1.pulsewidth_us(PWM1zad); M2.period_us(PWM_period); M2.pulsewidth_us(PWM2zad); M3.period_us(PWM_period); M3.pulsewidth_us(PWM3zad); M4.period_us(PWM_period); M4.pulsewidth_us(PWM4zad); /*rollE=0; katxzyro = 0; katyzyro = 0; katzzyro = 0;*/ iTach=0; TachFlaga=0; 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 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()){ znak=pc.getc(); switch (znak){ case 'r': break; case 't': PWM1zad+=50; if(PWM1zad>=20000){ PWM1zad=20000; } M1.pulsewidth_us(PWM1zad); break; case 'g': PWM1zad-=50; if(PWM1zad<10000){ PWM1zad=10000; } M1.pulsewidth_us(PWM1zad); break; case 'y': break; case 'h': break; case 'u': break; case 'j': break; case 's': break; case 'b': break; case 'z': 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 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': break; case 'd': break; case 'e': break; case 'f': break; case 'g': break; case 'h': break; } if(flagaster==1){ if(PWM1zad<10000){ PWM1zad=10000; } if(PWM1zad>=20000){ PWM1zad=20000; } M1.pulsewidth_us(PWM1zad); flagaster=0; } }//switch //myled2 = !myled2; }//while(1) }//main