![](/media/cache/profiles/1a2bcdaeda20bb9a5fdb6e7f5ceb9902.jpg.50x50_q85.jpg)
motor dc driver with lcd nextion nx8048t050_011
Dependencies: mbed QEI_hw NVIC_set_all_priorities SoftPWM
Diff: main.cpp
- Revision:
- 0:ea04a1655f3b
- Child:
- 1:2fe82be93e80
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Sep 27 12:46:15 2019 +0000 @@ -0,0 +1,1094 @@ +//////////////////////////////////////////////////////////////////////////// +//rajout du spi1(p5, p6, p7, p8)--------( 14 / 11 / 2017 ) task5 +//rajout de la conversion AD p20--------( 15 / 11 / 2017 ) task6 +//rajout fonction generation trajectoire a tester "il y as un probleme de position final lorsque on change "slope_time" +//rajout en task2 visualisation des pulses avec "telemetry viewer v0.4" + +#include "mbed.h" +#include "qeihw.h" +#include "NVIC_set_all_priorities.h" + +// déclaration du hardware +Serial pc(USBTX, USBRX);//utilisation de la liaison usb + +QEIHW qei(QEI_DIRINV_NONE, QEI_SIGNALMODE_QUAD, QEI_CAPMODE_4X, QEI_INVINX_NONE ); + +Serial device(p9, p10);// tx, rx.//definition de la liaison rs232 + +DigitalOut frein_moteur1(p15); //changement momentané pour le projet r2d de p5 a p15 + +DigitalOut sens_rotation_moteur1(p13); + +PwmOut PWM1(p21); + +SPISlave spi1(p5, p6, p7, p8); // mosi, miso, sclk, ssel + +AnalogIn Ain(p20); + +// définition des timers. +Timer timer1; +Timer timer2; + +//definition spi1 +int reply = 0xAAAA;// en bin "1010101010101010" +int valueFromMaster; + +int Spi_val_RX[10]={0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};//buffer reception données SPI +int Spi_val_TX[10]={0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};//buffer transmission données SPI + +// définition des sorties leds +DigitalOut led1(LED1); +DigitalOut led3(LED3); + +char c ; +int t ; +int x=0 ; + +float PI=3.141592653589793; + +//vitesse moteur +int vitesse_actuelle; + +//position codeur en pulses 2000pulses/rotation +int position_actuelle;//position du codeur +int position_actuelle_n1;//position du codeur a n-1 + +//données mecanique & moteur +float J=3.375*1e-5;//0.005;//inertie en kg.m² +float K=0.05;//2;//constante de couple N.m/v +float R=5;//K;//resistance du moteur en Ohms +float Umax=24;//24vdc tension max en volts + +//parametres reglage +float dt_vit(5*1e-4); +float Ki=12;//default value=10; +float Kp; +float Kv; +float K_sw(K); +float tau; +float taud=(10*dt_vit); +float r1=3;//default value=2.5;derniere valeur =3 +float r2=r1;//default value=2.5; + +//variables generateur de consigne/////////////////////////////////////////////////////////////////////////////////////////// +float Teta_debut, Teta_fin, Teta_diff; +float delta_Teta; +float consigne;//en pulse +float slope_time(1.);//en seconde +bool start_slope(false);//flag debut de montee +int ticks_total; +int count_ticks; +int count_slope(0); +int count_max(0); + +//variables calcul de l'asservissement en vitesse et position +float Tetaco; //valeur de la consigne position en radians +float Tetam;//valeur mesuree de la position en radians + +float dTetam; +float integ; +float A; + +float dTetam_n1; +float Tetaco_n1; +float Tetam_n1; +float integ_n1; +float cyclic; +int signe_rot; + +//variable ADC +float ADCdata; +float imax=1.8; + +//declaration des differantes taches +void task1_switch(void); +void task2_switch(void); +void task3_switch(void); +void task4_switch(void); +void task5_switch(void); +void task6_switch(void); +void task7_switch(void); +void task8_switch(void); + +//declaration des differantes interuption timer +Ticker time_up1; //definition du Ticker, avec le nom “time_up1” +Ticker time_up2; //definition du Ticker, avec le nom “time_up2” +Ticker time_up3; //definition du Ticker, avec le nom “time_up3” +Ticker time_up4; //definition du Ticker, avec le nom “time_up4” +Ticker time_up5; //definition du Ticker, avec le nom_up5” +Ticker time_up6; //definition du Ticker, avec le nom_up6” +Ticker time_up7; //definition du Ticker, avec le nom “time_up7” +Ticker time_up8; //definition du Ticker, avec le nom “time_up8” + +//declaration des leds visuelle utiliser pour mesurer le temps des taches +DigitalOut myled1(LED1); +DigitalOut myled3(LED3); + +//declaration des variables afficheur +char mRxMsg[40]; +int mRxIdx; +char charac; +bool mTouch; +int mTouchX, mTouchY; + +int val_temp;//valleur temporaire +int val_temp1;//valleur temporaire + +//////////////////////////////////////////////////////////// +// fonction affichage sur nextion // +//////////////////////////////////////////////////////////// + +bool Touch(void) { + return mTouch; +} + +int TouchX(void) { + return mTouchX; +} + +int TouchY(void) { + return mTouchY; +} + + bool lectureRSlcd(void) +{ + if(device.readable()) + { + charac = device.getc(); + mRxMsg[mRxIdx] = charac; + mRxIdx++; + if ((mRxIdx >= 3) && (mRxMsg[mRxIdx-1] == 0xff) && (mRxMsg[mRxIdx-2] == 0xff) && (mRxMsg[mRxIdx-3] == 0xff)) //valid rx message + { + mRxIdx=0; + + if(mRxMsg[0] == 0x67) //Touch coordinate data return + { mTouchX = (mRxMsg[1]*256) + mRxMsg[2]; + mTouchY = (mRxMsg[3]*256) + mRxMsg[4]; + if(mRxMsg[5] == 0x01) + mTouch = true; + else + mTouch = false; + } + } + } + return mTouch; + } + +//lecture de la donnée val d une reponse de sliders + int lecture_slider_RS_lcd(void) +{ + if(device.readable()) + { + charac = device.getc(); + mRxMsg[mRxIdx] = charac; + mRxIdx++; + if ((mRxIdx >= 3) && (mRxMsg[mRxIdx-1] == 0xff) && (mRxMsg[mRxIdx-2] == 0xff) && (mRxMsg[mRxIdx-3] == 0xff)) //valid rx message + { + mRxIdx=0; + + if(mRxMsg[0] == 0x71) //sliders data return + { + val_temp=mRxMsg[1]; + + } + } + } + return val_temp; + } + +//recuperation de la valeur val du sliders h0 +// example : get_val(0); +void get_val(int n) +{ + device.printf("get h%d.val %c%c%c",n, 0xff, 0xff, 0xff);//recuperation de la valeur val du sliders h0 +} +//fonction general recuperation de la valeur val de h0 +void get_val_h0() +{ + device.printf("get h0.val %c%c%c", 0xff, 0xff, 0xff);//recuperation de la valeur val du sliders h0 +} + +//////////////////////////////////////// +// Convertion pulses to radians // +//////////////////////////////////////// + +//PI =3.141592653589793 =1000 pulses codeurs +float pulsesToRadians(int pulses) +{ + float radians_VAL; + radians_VAL=(pulses*PI)/1000.; + return radians_VAL; +}; + +//////////////////////////////////////// +// calcule de la vitesse angulaire // +//////////////////////////////////////// + +// ici le code du calcule pas encore fait !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +// Convert ASCII string to unsigned 32-bit decimal "string is null-terminated" + unsigned long Str2UDec(unsigned char string[]){ + unsigned long i = 0; // index + unsigned long n = 0; // number + while(string[i] != 0){ + n = 10*n +(string[i]-0x30); + i++; + } + return n; +} + + +///////////////////////////////////////////////////////////////////////////// +// declaration de la fonction moteur1 // +///////////////////////////////////////////////////////////////////////////// + +void motor1_mouve(int position1,int T1,int position2,int T2,int position3,int T3) +{ + +///////////////////////////////////////////////////////////////////// +// mouvement trapezoide non tésté // +///////////////////////////////////////////////////////////////////// + + timer1.start(); // déclenchement du timer1 + timer2.start(); // déclenchement du timer2 +//ACC + consigne=position1 ; + slope_time=T1; + start_slope=true; + //do{} while (timer1.read_ms()!=T1); + do{} while (timer1.read_ms()<T1); + if (timer1.read_ms()>T1) // lecture du temps du timer1 en ms + { + //device.printf("TIME out T1 ms \r\n"); + device.printf("t0.txt=\"time1out\"%c%c%c", 0xff, 0xff, 0xff); + } + + timer1.reset(); // remise à zéro du timer1 +//vmax + timer1.start(); // déclenchement du timer1 + consigne=position2 ; + slope_time=T2; + start_slope=true; + //do{} while (timer1.read_ms()!=T2); + do{} while (timer1.read_ms()<T2); + if (timer1.read_ms()>T2) // lecture du temps du timer1 en ms + { + //device.printf("TIME out T2 ms \r\n"); + device.printf("t0.txt=\"time2out\"%c%c%c", 0xff, 0xff, 0xff); + } + timer1.reset(); // remise à zéro du timer1 +//DCC + timer1.start(); // déclenchement du timer1 + consigne=position3 ; + slope_time=T3; + start_slope=true; + //do{} while (timer1.read_ms()!=T3); + do{} while (timer1.read_ms()<T3); + if (timer1.read_ms()>T3) // lecture du temps du timer1 en ms + { + //device.printf("TIME out T3 ms \r\n"); + device.printf("t0.txt=\"time3out\"%c%c%c", 0xff, 0xff, 0xff); + } + timer1.reset(); // remise à zéro du timer1 + + if (timer2.read_ms()>(T1+T2+T3)) // lecture du temps du timer1 en ms + { + //device.printf("TIME out motor \r\n"); + device.printf("t0.txt=\"timeMout\"%c%c%c", 0xff, 0xff, 0xff); + } + +timer2.reset(); // remise à zéro du timer2 +}; + + + + +////////////////////////////////////////////////////////////////////////////////////////// +// declaration des differantes pages // +////////////////////////////////////////////////////////////////////////////////////////// + +void page0()//code de la page : 6600ffffff +{ + +//device.printf("cls RED %c%c%c", 0xff, 0xff, 0xff); //clear screen color red fonnctionne pas ?? +//device.printf("rest%c%c%c", 0xff, 0xff, 0xff);//y as un bug toute les commande prochine fonctionne plus ??? +//wait_ms(10); + +//device.printf("page %d%c%c%c",0x0, 0xff, 0xff, 0xff);// saut a la page0------sy +//wait_ms(10); +device.printf("t6.txt=\"soft V0.01\"%c%c%c", 0xff, 0xff, 0xff);//affiche la version soft -------sy +wait_ms(5); +device.printf("b13.txt=\"flyready\"%c%c%c", 0xff, 0xff, 0xff);//affiche la version soft -------sy +wait_ms(5); +device.printf("b12.txt=\"BREAK\"%c%c%c", 0xff, 0xff, 0xff);//affiche la version soft -------sy +wait_ms(5); +device.printf("b11.txt=\"LANDING\"%c%c%c", 0xff, 0xff, 0xff);//affiche la version soft -------sy +wait_ms(5); +device.printf("b21.txt=\"Quantum\"%c%c%c", 0xff, 0xff, 0xff);//affiche la version soft -------sy +wait_ms(5); + +device.printf("b18.txt=\"Speed M\"%c%c%c", 0xff, 0xff, 0xff);//affiche la version soft -------sy +wait_ms(5); +device.printf("b19.txt=\"couple M\"%c%c%c", 0xff, 0xff, 0xff);//affiche la version soft -------sy +wait_ms(5); +device.printf("b20.txt=\"Afterburner\"%c%c%c", 0xff, 0xff, 0xff);//affiche la version soft -------sy +wait_ms(5); + +//device.printf("b0.pic=17%c%c%c", 0xff, 0xff, 0xff);//chager l image du bouton b0 par l image n°17------sy +//wait_ms(10); +//device.printf("ref b0%c%c%c", 0xff, 0xff, 0xff);//rafrechir b0--------------sy + +//wait_ms(10); + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //FLY READY switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x19)&&(mRxMsg[3] == 0x01)) + { + //keyboard.printf("r");//flight ready + }//uniquement le bouton allumeras la led 1 en release ---------------SY +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //space break switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x18)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + //keyboard.printf("x");//spacebreak + //wait(0.5); + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("x");//spacebreak + //wait(0.035); + } + }//uniquement le bouton allumeras la led 2 en press event ---------------SY +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //LANDING switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x17)&&(mRxMsg[3] == 0x01)) + { + //keyboard.printf("n");//landing mode + }//uniquement le bouton home allumeras la led 3 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //strafe up switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x13)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + //keyboard.printf(" ");//strafe up + //wait(0.5); + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf(" ");//strafe up + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //strafe down switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x14)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + //keyboard.keyCode(KEY_CTRL);//strafe down + //wait(0.5); + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.keyCode(KEY_CTRL);//strafe down + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //forward switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x02)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + //keyboard.printf("w");//vers l'avant + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("w");//vers l'avant + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //rearward switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x01)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + //keyboard.printf("s");//vers l arriere + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("s");//vers l arriere + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //Right switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x03)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + //keyboard.printf("d");//vers la droite + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("d");//vers la droite + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //Left switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x04)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + + //keyboard.printf("a");//vers la gauche + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("a");//vers la gauche + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //roll left switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x1a)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + //keyboard.printf("e");//rouli gauche + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("e");//rouli gauche + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //roll Right switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x05)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + + //keyboard.printf("q");//rouli droit + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("q");//rouli droit + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //tangage vers le bas switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x1b)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + + //keyboard.printf("");//touche non affecté + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("");//touche non affecté la touche non connue + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //tangage vers le haut switch + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x1b)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + + //keyboard.printf("");//touche non affecté la touche non connue + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("");//touche non affecté + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //quantum drive + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x1f)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + + //keyboard.printf("b");//touche non affecté la touche non connue + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("b");//touche non affecté + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //Speed M + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x1c)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + + //keyboard.printf("c");//touche non affecté la touche non connue + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("c");//touche non affecté + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //Speed M + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x1c)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + + //keyboard.printf("b");//touche non affecté la touche non connue + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.printf("c");//touche non affecté + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //Afterburner + if((mRxMsg[0] == 0x65)&&(mRxMsg[1] == 0x00)&&(mRxMsg[2] == 0x1c)&&(mRxMsg[3] == 0x01))//press + {myled3=1; + + //keyboard.keyCode(KEY_SHIFT); + //wait(0.5); + + while (mRxMsg[3]!=0x00) + { + //lectureRSlcd(); + //keyboard.keyCode(KEY_SHIFT); + //wait(0.035); + } + + }//uniquement le bouton allumeras la led 4 en release ---------------SY + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//ici il faut completer le code pour pouvoir detecter le bon bouton en press event et release event +//example le bouton start press event 65 01 01 01 ff ff ff et en release event 65 01 01 00 ff ff ff . rem:code touche repris par simulation avec le soft nextion + +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//******************************************************************page1******************************************************************// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void page1()//code de la page : 6601ffffff +{ +device.printf("bt0.txt=\"BREAK1\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton bt0 -------sy +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//******************************************************************page2******************************************************************// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void page2()//code de la page : 6602ffffff +{ +device.printf("b0.txt=\"BREAK2\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton b0 -------sy +get_val(3);//donner l'ordre d envoyer la valeur val de h3 +int valeur_val=lecture_slider_RS_lcd();//recuperation de la valeur val de h3 +device.printf("n3.val=%d %c%c%c", valeur_val, 0xff, 0xff, 0xff);//affiche le nombre sur n1 -------sy +device.printf("z0.val=%d %c%c%c", valeur_val, 0xff, 0xff, 0xff);//affiche le nombre sur z0 gauge -------sy +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//******************************************************************page3******************************************************************// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void page3()//code de la page : 6603ffffff +{ +device.printf("b19.txt=\"BREAK3\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton b19 -------sy +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//******************************************************************page4******************************************************************// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void page4()//code de la page : 6604ffffff +{ +device.printf("t0.txt=\"BREAK4\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton bt0 -------sy + + get_val_h0(); + val_temp1=lecture_slider_RS_lcd();//recuperation de la valeur du sliders h0 dans val_temp + device.printf("n1.val=%d %c%c%c", val_temp1, 0xff, 0xff, 0xff);//affiche le nombre sur n1 -------sy + +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//******************************************************************page5******************************************************************// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void page5()//code de la page : 6605ffffff +{ +device.printf("t0.txt=\"BREAK5\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton bt0 -------sy +device.printf("t1.txt=\"500ms/div\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton bt0 -------sy + +device.printf("g0.txt=\"position M\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton bt0 -------sy +device.printf("add 1,0,%d%c%c%c", (position_actuelle/500), 0xff, 0xff, 0xff);// pour la fonction waveform add id1,chanel0,position actu + +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//******************************************************************page6******************************************************************// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void page6()//code de la page : 6606ffffff +{ + +device.printf("t1.txt=\"courant\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton bt0 -------sy +device.printf("t0.txt=\"position\"%c%c%c", 0xff, 0xff, 0xff);//affiche break sur bouton bt0 -------sy +device.printf("add 2,0,%d%c%c%c", (position_actuelle/500), 0xff, 0xff, 0xff);// pour la fonction waveform add id1,chanel0,position actu + +} + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//******************************************************************LES TASKS**************************************************************// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////// +// TASKS1 // +//////////////////////////////////////// +void task1_switch() +{ + +//lecture valeur codeur et conversion en radians +position_actuelle=qei.GetPosition();//lecture valeur codeur et affectation a la variable globale +Tetam=pulsesToRadians(position_actuelle);//conversion valeur impulsionel en radians + +//Calcul de la nouvelle consigne: + +//Etape1:derivee filtree +dTetam=1./(1.+taud*2./dt_vit)*(-dTetam_n1*(1.-taud*2./dt_vit)+2./dt_vit*(Tetam-Tetam_n1)); + +//Etape2:calcul de integ non saturee +integ=integ_n1+dt_vit/2.*((Tetaco-Tetam)+(Tetaco_n1-Tetam_n1)); + +//Etape3:Calcul de A non saturee +A=Kv*K_sw/Umax*(-dTetam+Kp*Ki*integ-Kp*Tetam); + +//Etape 4 et 5 : calcul de integ saturee +if (A>1) + { + integ=1./Kp/Ki*(Umax/Kv/K_sw+dTetam+Kp*Tetam); + A=1; + } +if(A<-1) + { + integ=1./Kp/Ki*(-Umax/Kv/K_sw+dTetam+Kp*Tetam); + A=-1; + } + +//Etape 6:affectation du signe de rotation a l'etage de puissance +if (A>0) +{ + signe_rot=1; + sens_rotation_moteur1.write(signe_rot); //affectation du sens de rotation moteur1 + cyclic=A; +} +else +{ + signe_rot=0; + sens_rotation_moteur1.write(signe_rot); //affectation du sens de rotation moteur1 + cyclic=-A;//peut etre une erreur ici sy?? +} + +PWM1.write(cyclic);// affectation de la valeur calculé en pwm + +// enregistrement des valeurs N-1 +position_actuelle_n1=position_actuelle; +dTetam_n1=dTetam; +Tetaco_n1=Tetaco; +Tetam_n1=Tetam; +integ_n1=integ; + +//myled1=!myled1;//changement etat de la led1 +} + +//////////////////////////////////////// +// TASKS2 // +//////////////////////////////////////// +void task2_switch() +{ +// pc.printf("%f\r\n", Tetaco);//valeur float consigne en radians le renvoyé par usb +// pc.printf("%i\r\n", position_actuelle);//valeur int du codeur renvoyé par usb +// pc.printf("%f\r\n", Tetam);//valeur float du codeur en radians renvoyé par usb +// pc.printf("dTetam : %f\r\n", dTetam);//valeur float dTetam +// pc.printf("integ : %f\r\n", integ);//valeur float integ +// pc.printf("%f\r\n", A);//valeur float du codeur en radians le renvoyé par usb +// pc.printf("%e\r\n", cyclic);//valeur float du codeur en radians le renvoyé par usb +// pc.printf("\r\n");//retour chario +// pc.printf("$%d %d %d;", position_actuelle,position_actuelle/2,position_actuelle/10 ); //utiliser avec logicielle serial port ploter +// pc.printf("$%d ;", position_actuelle); //utiliser avec logicielle serial port ploter +// pc.printf("%d",position_actuelle); //utiliser avec logicielle serial port ploter + +// this code is a crude template +// you will need to edit this + + +// use this loop if sending integers----------------------------------------------SY + +// int ppp = position_actuelle; +// char text[7]; +// snprintf(text, 7, "%d", ppp); +// pc.printf("\r"); +// pc.printf(text); + + +// or use this loop if sending floats + +// float ppp =position_actuelle; +// char ppp_text[30]; +// dtostrf(ppp, 10, 10, ppp_text); +// char text[31]; +// snprintf(text, 31, "%s", ppp_text); +// pc.printf(text); +//device.printf("n0.val=%d%c%c%c", position_actuelle, 0xff, 0xff, 0xff);// affiche la valeur de position sur l afficheur nextion + +}; + +//////////////////////////////////////// +// TASKS3 // +//////////////////////////////////////// +void task3_switch() +{ + +//generation de la trajectoire +if(start_slope) +{ + Teta_debut=Tetam;//affectation de la mesure a la variable globale + Teta_fin=pulsesToRadians(consigne);//affectation de la consigne a la variable globale + Teta_diff = Teta_fin - Teta_debut;//calcule de la position a parcourir + delta_Teta=(Teta_diff/slope_time)*5*1e-4;//calcule de la distance ideal parcouru en 500us "regle de trois"!!! + count_slope = 0;//mise a zero du conteur de pas + count_max = slope_time/(5*1e-4);//calcule du nombre max de pas + start_slope=false; +} +count_slope++;//incrementation nombre de pas +if (count_slope<=count_max){Tetaco=Tetaco+delta_Teta;} + +} + +//////////////////////////////////////// +// TASKS4 // +//////////////////////////////////////// +void task4_switch() +{ +//device.printf("$%d;", position_actuelle); //utiliser avec logicielle serial port ploter +//pc.printf("0x%04x\n", valueFromMaster); +//pc.printf("%04x", valueFromMaster); +//device.printf("add 1,0,%d%c%c%c", (position_actuelle/500), 0xff, 0xff, 0xff);// pour la fonction waveform add id1,chanel0,position actu +//device.printf("add 1,0,%d%c%c%c", (ADCdata)/10, 0xff, 0xff, 0xff);// pour la fonction waveform add id1,chanel0,position actu + +} + +////////////////////////////////////////////////////////////////////////////// +// TASKS5 reception et transfert données sur SPI // +////////////////////////////////////////////////////////////////////////////// +void task5_switch() +{ + //reply=0xAAAA; + //spi1.reply(reply); + if (spi1.receive()) + { + valueFromMaster = spi1.read(); + + Spi_val_RX[x]=valueFromMaster; + if (x==9){x=0;} + else {x++;} + + // pc.printf("%d Something rxvd, and should have replied with %d\n\r", counter++, reply); + //reply=valueFromMaster; + //spi1.reply(reply); // Prime SPI with next reply + //reply--; + + // pc.printf(" Received value from Master (%d) Next reply will be %d \r\n", valueFromMaster, reply); + //if (reply==0){reply=65535;}//100 + } + +// ici code de la tache 5 +} + +///////////////////////////////////////////////////////////////////////// +// TASKS6 lecture de l'image courant moteur // +///////////////////////////////////////////////////////////////////////// +void task6_switch() +{ + +//ADCdata=Ain*3.3; //lecture de l'image du courant + +for (int z=0;z<=9;z++) +{ +ADCdata=ADCdata+Ain*3.3; //sum 10 samples +} +ADCdata=ADCdata/10; //divide by 10 +//ADCdata=Ain.read_u16(); +if(ADCdata>=imax)//si l'image du courant egale a 0.5v je coupe le moteur . +{ + while(1){ + PWM1.write(0);//mise du signal pwm a zero. +// pc.printf("%1.3f",ADCdata); +// pc.printf("V\n\r"); +// pc.printf("current overload \n\r"); + + //attendre que le manipulateur appuis sur le bouton restart a coder . + //veriffier que les plaques sont bien en position . + //faire une home ou continuer la trajectoire .a voir !!!! + } +} +// ici code de la tache 6 + +} + +//////////////////////////////////////// +// TASKS7 // +//////////////////////////////////////// +void task7_switch() +{ +//lectureRSlcd(); +if(device.readable()) + { + myled1=1; + charac = device.getc(); + mRxMsg[mRxIdx] = charac; + mRxIdx++; + if ((mRxIdx >= 3) && (mRxMsg[mRxIdx-1] == 0xff) && (mRxMsg[mRxIdx-2] == 0xff) && (mRxMsg[mRxIdx-3] == 0xff)) //valid rx message + { + myled3=1; + mRxIdx=0; + + if(mRxMsg[0] == 0x67) //Touch coordinate data return + { mTouchX = (mRxMsg[1]*256) + mRxMsg[2]; + mTouchY = (mRxMsg[3]*256) + mRxMsg[4]; + if(mRxMsg[5] == 0x01) + mTouch = true; + else + mTouch = false; + } + myled3=0; + } +//vitesse_actuelle=qei.GetVelocity(); //fonctionne pas ... +// ici code de la tache 7 + myled1=0; + } +} + +//////////////////////////////////////// +// TASKS8 // +//////////////////////////////////////// + +void task8_switch() +{ + + if((mRxMsg[0] == 0x66))//detection code de la page0 + { + switch ( mRxMsg[1]) + { + case 0x00: + page0();//ici la page0 es traité ----------- code de la page : 66 00 ff ff ff + mRxMsg[0] = 0x00; + break; + + case 0x01: + page1();//ici la page0 es traité ----------- code de la page : 66 01 ff ff ff + mRxMsg[0] = 0x00; + break; + + case 0x02: + page2();//ici la page0 es traité ----------- code de la page : 66 02 ff ff ff + mRxMsg[0] = 0x00; + break; + + case 0x03: + page3();//ici la page0 es traité ----------- code de la page : 66 03 ff ff ff + mRxMsg[0] = 0x00; + break; + + case 0x04: + page4();//ici la page0 es traité ----------- code de la page : 66 04 ff ff ff + mRxMsg[0] = 0x00; + break; + + case 0x05: + page5();//ici la page0 es traité ----------- code de la page : 66 05 ff ff ff + mRxMsg[0] = 0x00; + break; + + case 0x06: + page6();//ici la page6 es traité ----------- code de la page : 66 06 ff ff ff + mRxMsg[0] = 0x00; + break; + + } + +// ici code de la tache 8 + } + +} + +//////////////////////////////////////////////////////////////////////////// +// PROGRAMME PRINCIPAL // +//////////////////////////////////////////////////////////////////////////// + +int main() +{ + // int cycles; + //NVIC_SetPriority(EINT3_IRQn, 252);//set interupt to highest priority 0. + //NVIC_SetPriority(TIMER1_IRQn, 253);// set mbed tickers to lower priority than other things + //NVIC_SetPriority(TIMER2_IRQn, 254);// set mbed tickers to lower priority than other things + //NVIC_SetPriority(TIMER3_IRQn, 255);// set mbed tickers to lower priority than other things + //NVIC_set_all_irq_priorities(0); + + qei.SetDigiFilter(480UL);//filtre + qei.SetMaxPosition(0xFFFFFFFF);//position max 4294967295 pulses + +//initialisation de la com rs232 + device.baud(9600);//rs232 28800 baud + device.printf("serial rs232 ok \n"); + + //calculs de tau ,Kv,Kp + tau=(J*R)/K; + Kv=r1*r2*tau*Ki-1.; + if(Kv<0){Kv = -Kv;} + Kp=r1*Ki*(1.+Kv)/Kv; + +//initialisation moteur +PWM1.period(0.00005);// initialisation du rapport cyclique fixe la période à 50us----f=20Khz +frein_moteur1.write(0);//affectation de la valeur du frein moteur1 +sens_rotation_moteur1.write(0); //affectation du sens de rotation moteur1 non utiliser puisque c'est la tache1 qui le fait non pas la generation de trajectoire + +//initialisation du spi + spi1.format(16,3); // Setup: bit data, high steady state clock, 2nd edge capture + spi1.frequency(1000000); // 1MHz + +//lancement des tasks + time_up1.attach(&task1_switch, 0.0005);//"calcule de l'asservissement" initialisation du ticker a 2Khz "500us". + //time_up2.attach(&task2_switch, 0.05);//"retour d'information position par usb" initialisation du ticker a 100hz "10ms". + time_up3.attach(&task3_switch, 0.0005);//"generation trajectoire" initialisation du ticker a 2khz "500us". + //time_up4.attach(&task4_switch, 0.0005);//"retour d'information position par rs232"initialisation du ticker a 100hz "10ms". + //time_up5.attach(&task5_switch, 0.0001);//"lecture et ecriture DATA SPI1 initialisation du ticker 10khz. + + //time_up6.attach(&task6_switch, 0.0005);//initialises the ticker 2kh + time_up7.attach(&task7_switch, 0.0001);//initialises the ticker 2kh + time_up8.attach(&task8_switch, 0.1);//initialises the ticker 2kh + + device.printf("sendme"); + +count_ticks=0; + while(1) + { + + c='0'; + + //c=valueFromMaster;//valeur par la liaison spi par le master + + //device.scanf("%c",&c);//capture du caract ascii + + switch(c)//chargement des wafers dans tete + { + + case 'a': + //qei.Reset(0); + consigne=70000 ; //1 tour + slope_time=3;//t =0.ms + start_slope=true; + wait(4.5); + + consigne=0 ; //1 tour + slope_time=3;//t=ms + start_slope=true; + wait(4.5); + + consigne=-70000 ; //1 tour + slope_time=3;//t=ms + start_slope=true; + wait(4.5); + + consigne=0 ; //1 tour + slope_time=3;//t=ms + start_slope=true; + wait(4.5); + + break; + + case 'b': + //qei.Reset(0); + consigne=100000 ; //1 tour + slope_time=2.5;//t =0.5ms + start_slope=true; + wait(3.5); + + consigne=0 ; //1 tour + slope_time=2.5;//t=1ms + start_slope=true; + wait(3.5); + + break; + + } + + + + + +/*if(device2.readable())//ici on utilise une seconde com rs avec un autre ecrant nextion + { + c2 = device2.getc(); + mRxMsg2[mRxIdx2] = c2; + mRxIdx2++; + if ((mRxIdx2 >= 3) && (mRxMsg2[mRxIdx2-1] == 0xff) && (mRxMsg2[mRxIdx2-2] == 0xff) && (mRxMsg2[mRxIdx2-3] == 0xff)) //valid rx message + { + mRxIdx2=0; + + if(mRxMsg2[0] == 0x67) //Touch coordinate data return + { mTouchX2 = (mRxMsg2[1]*256) + mRxMsg2[2]; + mTouchY2 = (mRxMsg2[3]*256) + mRxMsg2[4]; + if(mRxMsg2[5] == 0x01) + mTouch2 = true; + else + mTouch2 = false; + } + //start switch + if((mRxMsg2[0] == 0x65)&&(mRxMsg2[1] == 0x01)&&(mRxMsg2[2] == 0x01)&&(mRxMsg2[3] == 0x00)) + { + keyboard.printf("t"); + }//uniquement le bouton start allumeras la led 1 en release ---------------SY + + } + }*/ + +//wait(0.05); +} +} \ No newline at end of file