squelette de demarrage projet ERS3 IUT NICE GEII

Dependencies:   mbed bloc_io mbed-rtos html EthernetInterface

Committer:
johan04
Date:
Wed Oct 30 13:51:08 2019 +0000
Revision:
1:da3240668253
Parent:
0:e30c9ba95bd4
Start

Who changed what in which revision?

UserRevisionLine numberNew contents of line
superphil06 0:e30c9ba95bd4 1
superphil06 0:e30c9ba95bd4 2
superphil06 0:e30c9ba95bd4 3 //#include "EthernetInterface.h"
superphil06 0:e30c9ba95bd4 4 #include <stdlib.h>
superphil06 0:e30c9ba95bd4 5 #include <string.h>
superphil06 0:e30c9ba95bd4 6 #include "mbed.h"
superphil06 0:e30c9ba95bd4 7 #include "rtos.h" // need for main thread sleep
superphil06 0:e30c9ba95bd4 8 #include "html.h" // need for html patch working with web server
superphil06 0:e30c9ba95bd4 9 #include "bloc_io.h"
superphil06 0:e30c9ba95bd4 10 #define RADIUS 0.2F // wheel size
superphil06 0:e30c9ba95bd4 11 #define NBPOLES 8 // magnetic pole number
superphil06 0:e30c9ba95bd4 12 #define DELTA_T 0.1F // speed measurement counting period
superphil06 0:e30c9ba95bd4 13
superphil06 0:e30c9ba95bd4 14
superphil06 0:e30c9ba95bd4 15 Bloc_IO MyPLD(p25,p26,p5,p6,p7,p8,p9,p10,p23,p24);// instantiate object needed to communicate with PLD
superphil06 0:e30c9ba95bd4 16 // analog input connected to mbed
superphil06 0:e30c9ba95bd4 17 // valid pmw mbed pin
johan04 1:da3240668253 18 AnalogIn Poig(p17);
superphil06 0:e30c9ba95bd4 19 Serial pc(USBTX, USBRX); // tx, rx
superphil06 0:e30c9ba95bd4 20 // Top_Hall Pin
superphil06 0:e30c9ba95bd4 21
superphil06 0:e30c9ba95bd4 22
superphil06 0:e30c9ba95bd4 23
superphil06 0:e30c9ba95bd4 24
superphil06 0:e30c9ba95bd4 25 /************ persistent file parameters section *****************/
superphil06 0:e30c9ba95bd4 26 LocalFileSystem local("local"); // Create the local filesystem under the name "local"
superphil06 0:e30c9ba95bd4 27
superphil06 0:e30c9ba95bd4 28
superphil06 0:e30c9ba95bd4 29
superphil06 0:e30c9ba95bd4 30
superphil06 0:e30c9ba95bd4 31
superphil06 0:e30c9ba95bd4 32
superphil06 0:e30c9ba95bd4 33
superphil06 0:e30c9ba95bd4 34 /********************* web server section **********************************/
superphil06 0:e30c9ba95bd4 35
johan04 1:da3240668253 36 //var_field_t tab_balise[10]; //une balise est présente dans le squelette
superphil06 0:e30c9ba95bd4 37 int giCounter=0;// acces counting
superphil06 0:e30c9ba95bd4 38
superphil06 0:e30c9ba95bd4 39
superphil06 0:e30c9ba95bd4 40 /*********************** can bus section ************/
superphil06 0:e30c9ba95bd4 41 // determine message ID used to send Gaz ref over can bus
superphil06 0:e30c9ba95bd4 42 #define _CAN_DEBUG // used to debug can bus activity
superphil06 0:e30c9ba95bd4 43 //#define USE_CAN_REF // uncomment to receive gaz ref over can_bus
superphil06 0:e30c9ba95bd4 44 CAN can_port (p30, p29); // initialisation du Bus CAN sur les broches 30 (rd) et 29(td) for lpc1768 + mbed shield
superphil06 0:e30c9ba95bd4 45 bool bCan_Active=false;
superphil06 0:e30c9ba95bd4 46
superphil06 0:e30c9ba95bd4 47
superphil06 0:e30c9ba95bd4 48
superphil06 0:e30c9ba95bd4 49 DigitalOut led1(LED1); //initialisation des Leds présentes sur le micro-controleur Mbed*/
superphil06 0:e30c9ba95bd4 50 DigitalOut led2(LED2);
superphil06 0:e30c9ba95bd4 51 DigitalOut led3(LED3); // blink when can message is sent
superphil06 0:e30c9ba95bd4 52 DigitalOut led4(LED4); // blink when can message is received
superphil06 0:e30c9ba95bd4 53
johan04 1:da3240668253 54 DigitalOut VALID_PWM(p21);
johan04 1:da3240668253 55 InterruptIn TopHall(p22);
johan04 1:da3240668253 56 Ticker Timode;
johan04 1:da3240668253 57 Ticker T;
superphil06 0:e30c9ba95bd4 58
superphil06 0:e30c9ba95bd4 59
superphil06 0:e30c9ba95bd4 60 //************ local function prototypes *******************
johan04 1:da3240668253 61 void lecture(void);
johan04 1:da3240668253 62 void Init(void);
johan04 1:da3240668253 63 void recupD(void);
johan04 1:da3240668253 64 void choix(void);
johan04 1:da3240668253 65 void compteur(void);
johan04 1:da3240668253 66 void mesures(void);
superphil06 0:e30c9ba95bd4 67
johan04 1:da3240668253 68 char cChoix=0;
johan04 1:da3240668253 69 int mode;
johan04 1:da3240668253 70 int giRefPwm =0;
johan04 1:da3240668253 71 int MODE,PWM;
johan04 1:da3240668253 72 float val_poig ,Val_PwmPoig;
johan04 1:da3240668253 73 float NgazMin=0.15F, NgazMax=0.65F;
johan04 1:da3240668253 74 float Delta_Gaz = NgazMax - NgazMin;
johan04 1:da3240668253 75 int Hall,Brake,Overcurrent,Fault,Direction;
johan04 1:da3240668253 76 int toto ;
johan04 1:da3240668253 77 int reF;
johan04 1:da3240668253 78 int val;
johan04 1:da3240668253 79 int giRefPwm_av;
johan04 1:da3240668253 80 float vitesse;
johan04 1:da3240668253 81 int tophall,cptTopHall;
superphil06 0:e30c9ba95bd4 82
superphil06 0:e30c9ba95bd4 83
johan04 1:da3240668253 84 FILE* File1 = NULL;
superphil06 0:e30c9ba95bd4 85 /**************** Read persistent data from text file located on local file system ****************/
superphil06 0:e30c9ba95bd4 86
superphil06 0:e30c9ba95bd4 87
superphil06 0:e30c9ba95bd4 88
superphil06 0:e30c9ba95bd4 89 /**************** write persitant data to text file located on local file system ****************/
superphil06 0:e30c9ba95bd4 90
superphil06 0:e30c9ba95bd4 91
superphil06 0:e30c9ba95bd4 92
superphil06 0:e30c9ba95bd4 93
superphil06 0:e30c9ba95bd4 94
superphil06 0:e30c9ba95bd4 95
superphil06 0:e30c9ba95bd4 96 //************** calibation gaz function needed to record min_gaz and max_gaz value to persistent text file ******************
superphil06 0:e30c9ba95bd4 97
superphil06 0:e30c9ba95bd4 98
superphil06 0:e30c9ba95bd4 99 // ************top hall counting interrupt needed for speed measurement
superphil06 0:e30c9ba95bd4 100
superphil06 0:e30c9ba95bd4 101
superphil06 0:e30c9ba95bd4 102 //********************** timer interrupt for speed measurement each 100ms *************************
superphil06 0:e30c9ba95bd4 103
superphil06 0:e30c9ba95bd4 104
superphil06 0:e30c9ba95bd4 105
superphil06 0:e30c9ba95bd4 106
superphil06 0:e30c9ba95bd4 107
superphil06 0:e30c9ba95bd4 108
superphil06 0:e30c9ba95bd4 109 //********************* Timer Interrupt for gaz ref management each 10ms ********************
superphil06 0:e30c9ba95bd4 110
superphil06 0:e30c9ba95bd4 111
superphil06 0:e30c9ba95bd4 112
superphil06 0:e30c9ba95bd4 113 /********* main cgi function used to patch data to the web server thread **********************************/
superphil06 0:e30c9ba95bd4 114 void CGI_Function(void) // cgi function that patch web data to empty web page
johan04 1:da3240668253 115 {
johan04 1:da3240668253 116 char ma_chaine4[20]={};// needed to form html response
johan04 1:da3240668253 117 /*sprintf (ma_chaine4,"%d",iCounter);// convert speed as ascii string Html_Patch
johan04 1:da3240668253 118 (tab_balise,0,ma_chaine4);// patch first label with dyn.string
johan04 1:da3240668253 119 iCounter++;*/
superphil06 0:e30c9ba95bd4 120
superphil06 0:e30c9ba95bd4 121 }
superphil06 0:e30c9ba95bd4 122
superphil06 0:e30c9ba95bd4 123
superphil06 0:e30c9ba95bd4 124 /*********************** CAN BUS SECTION **********************/
superphil06 0:e30c9ba95bd4 125
superphil06 0:e30c9ba95bd4 126
superphil06 0:e30c9ba95bd4 127
superphil06 0:e30c9ba95bd4 128 void CAN_REC_THREAD(void const *args)
superphil06 0:e30c9ba95bd4 129 { int iCount,iError;
superphil06 0:e30c9ba95bd4 130
superphil06 0:e30c9ba95bd4 131 while (bCan_Active)
superphil06 0:e30c9ba95bd4 132 {Thread::wait(100);// wait 100ms
superphil06 0:e30c9ba95bd4 133 // code todo
superphil06 0:e30c9ba95bd4 134
superphil06 0:e30c9ba95bd4 135 }
superphil06 0:e30c9ba95bd4 136
superphil06 0:e30c9ba95bd4 137 }
superphil06 0:e30c9ba95bd4 138
johan04 1:da3240668253 139 void Init()
johan04 1:da3240668253 140 {
johan04 1:da3240668253 141 VALID_PWM.write(0);
johan04 1:da3240668253 142 //recupD();
johan04 1:da3240668253 143 pc.printf("\n\r");
johan04 1:da3240668253 144 pc.printf("NgazMin = %f\n\r",NgazMin);
johan04 1:da3240668253 145 pc.printf("NgazMax = %f\n\r",NgazMax);
johan04 1:da3240668253 146 MyPLD.write(0);
johan04 1:da3240668253 147 VALID_PWM.write(1);
johan04 1:da3240668253 148 mode = 0;//mode auto
johan04 1:da3240668253 149 Timode.attach(&choix,0.05);
johan04 1:da3240668253 150 TopHall.mode(PullUp);
johan04 1:da3240668253 151 TopHall.rise(&compteur);
johan04 1:da3240668253 152 T.attach(&mesures,0.01);
johan04 1:da3240668253 153
johan04 1:da3240668253 154 }
johan04 1:da3240668253 155 void recupD()
johan04 1:da3240668253 156 {
johan04 1:da3240668253 157 File1 = fopen("/local/GR2a.txt","r");
johan04 1:da3240668253 158 if(File1!=NULL)
johan04 1:da3240668253 159 {
johan04 1:da3240668253 160 fscanf(File1,"%f %f",&NgazMin,&NgazMax);
johan04 1:da3240668253 161 }
johan04 1:da3240668253 162 fclose(File1);
johan04 1:da3240668253 163 }
superphil06 0:e30c9ba95bd4 164
superphil06 0:e30c9ba95bd4 165 //*************************** main function *****************************************
johan04 1:da3240668253 166 int main()
johan04 1:da3240668253 167 {
superphil06 0:e30c9ba95bd4 168
johan04 1:da3240668253 169
johan04 1:da3240668253 170 Init();
johan04 1:da3240668253 171
johan04 1:da3240668253 172 //***************************************** web section ********************************************/
johan04 1:da3240668253 173 //Init_Web_Server(&CGI_Function); // create and initialize tcp server socket and pass function pointer to local CGI function
johan04 1:da3240668253 174 //Thread WebThread(Web_Server_Thread);// create and launch web server thread
johan04 1:da3240668253 175 /********* main cgi function used to patch data to the web server thread **********************************/
johan04 1:da3240668253 176 //Gen_HtmlCode_From_File("/local/pagecgi2.htm",tab_balise,1);// read and localise ^VARDEF[X] tag in empty html file
johan04 1:da3240668253 177 //var_field_t tab_balise[1]; //une seule balise est présente dans le squelette html
johan04 1:da3240668253 178 //ma_chaine3 = Gen_HtmlCode_From_File("a:\\pagecgi.htm",tab_balise,1);
johan04 1:da3240668253 179 //******************************************* end web section ************************************* /
johan04 1:da3240668253 180
johan04 1:da3240668253 181
johan04 1:da3240668253 182 pc.printf("\n\r");
johan04 1:da3240668253 183
johan04 1:da3240668253 184 pc.printf(" programme scooter mbed \n\r");
johan04 1:da3240668253 185
johan04 1:da3240668253 186
johan04 1:da3240668253 187
johan04 1:da3240668253 188 //********************* can bus section initialisation *******************************************
johan04 1:da3240668253 189 //bCan_Active=true;// needed to lauchn CAN thread
johan04 1:da3240668253 190 //Thread CanThread(CAN_REC_THREAD);// create and launch can receiver thread
johan04 1:da3240668253 191 //********************* end can bus section *****************************************************
johan04 1:da3240668253 192
johan04 1:da3240668253 193
johan04 1:da3240668253 194 while(cChoix!='q' and cChoix!='Q')
johan04 1:da3240668253 195 {
johan04 1:da3240668253 196 pc.printf(" veuillez saisir un choix parmi la liste proposee: \n\r");
johan04 1:da3240668253 197 pc.printf(" m : manuel\n\r");
johan04 1:da3240668253 198 pc.printf(" l : Lecture registre \n\r");
johan04 1:da3240668253 199 pc.printf(" c : calibrage\n\r");
johan04 1:da3240668253 200 pc.printf(" a : automatique\n\r");
johan04 1:da3240668253 201 pc.printf(" q : quitter \n\r");
johan04 1:da3240668253 202
johan04 1:da3240668253 203 /************* multithreading : main thread need to sleep in order to allow web response */
johan04 1:da3240668253 204 while (pc.readable()==0) // determine if char availabler
johan04 1:da3240668253 205 {
johan04 1:da3240668253 206 Thread::wait(10);
johan04 1:da3240668253 207 } // wait 10 until char available on serial input
johan04 1:da3240668253 208 /************* end of main thread sleep ****************/
johan04 1:da3240668253 209
johan04 1:da3240668253 210 pc.scanf(" %c",&cChoix);
johan04 1:da3240668253 211 switch(cChoix)
johan04 1:da3240668253 212 {
johan04 1:da3240668253 213 case 'm':
johan04 1:da3240668253 214 mode = 1;
johan04 1:da3240668253 215 pc.printf("Saisir une vitesse\n\r");
johan04 1:da3240668253 216 pc.scanf("%d",&PWM);
johan04 1:da3240668253 217 break;
johan04 1:da3240668253 218
johan04 1:da3240668253 219 case 'l':
johan04 1:da3240668253 220 lecture();
johan04 1:da3240668253 221
johan04 1:da3240668253 222 break;
johan04 1:da3240668253 223
johan04 1:da3240668253 224 case 'c':
johan04 1:da3240668253 225
johan04 1:da3240668253 226 pc.printf("Effectuez le calibrage\n\r");
johan04 1:da3240668253 227 pc.printf("Valeur mini de la poignee\n\r");
johan04 1:da3240668253 228 pc.scanf("%f",&toto);
johan04 1:da3240668253 229 NgazMin=Poig.read();
johan04 1:da3240668253 230 pc.printf("NgazMin = %f\n\r",NgazMin);
johan04 1:da3240668253 231 pc.printf("Valeur max de la poignee\n\r");
johan04 1:da3240668253 232 pc.scanf("%f",&toto);
johan04 1:da3240668253 233 NgazMax=Poig.read();
johan04 1:da3240668253 234 pc.printf("NgazMax = %f\n\r",NgazMax);
johan04 1:da3240668253 235
johan04 1:da3240668253 236 File1 = fopen("/local/GR2a.txt","w");
johan04 1:da3240668253 237 if(File1!=NULL)
johan04 1:da3240668253 238 {
johan04 1:da3240668253 239 fprintf(File1,"%f %f",NgazMin,NgazMax);
johan04 1:da3240668253 240 }
johan04 1:da3240668253 241 fclose(File1);
johan04 1:da3240668253 242
johan04 1:da3240668253 243 break;
johan04 1:da3240668253 244
johan04 1:da3240668253 245 case'a':
johan04 1:da3240668253 246 mode =0;
johan04 1:da3240668253 247 break;
johan04 1:da3240668253 248
johan04 1:da3240668253 249 case 'q':
johan04 1:da3240668253 250
johan04 1:da3240668253 251 VALID_PWM.write(0);
johan04 1:da3240668253 252 MyPLD.write(VALID_PWM);
johan04 1:da3240668253 253
johan04 1:da3240668253 254 break;
johan04 1:da3240668253 255 }
johan04 1:da3240668253 256
johan04 1:da3240668253 257 } // end while
johan04 1:da3240668253 258
johan04 1:da3240668253 259 //************** thread deinit *********************
superphil06 0:e30c9ba95bd4 260 //DeInit_Web_Server();
superphil06 0:e30c9ba95bd4 261 //bCan_Active=false;
superphil06 0:e30c9ba95bd4 262 //CanThread=false;// close can received thread
johan04 1:da3240668253 263 pc.printf(" fin programme scooter mbed \n\r");
superphil06 0:e30c9ba95bd4 264 } // end main
johan04 1:da3240668253 265
johan04 1:da3240668253 266 void lecture()// lecture des valeures de retour du PLD
johan04 1:da3240668253 267 {
johan04 1:da3240668253 268
johan04 1:da3240668253 269 int mypld=MyPLD.read();
johan04 1:da3240668253 270 Hall = mypld &0x07;
johan04 1:da3240668253 271 Brake = mypld &0x20;
johan04 1:da3240668253 272 Overcurrent = mypld &0x40 ;
johan04 1:da3240668253 273 Fault = mypld &0x10 ;
johan04 1:da3240668253 274 Direction = mypld &0x08 ;
johan04 1:da3240668253 275
johan04 1:da3240668253 276 tophall=TopHall.read();
johan04 1:da3240668253 277 if(tophall == 1)
johan04 1:da3240668253 278 {
johan04 1:da3240668253 279 compteur();
johan04 1:da3240668253 280 }
johan04 1:da3240668253 281
johan04 1:da3240668253 282
johan04 1:da3240668253 283
johan04 1:da3240668253 284 pc.printf("\n\r");
johan04 1:da3240668253 285 pc.printf("Valeure du secteur Hall=%d\n\r",Hall);
johan04 1:da3240668253 286
johan04 1:da3240668253 287 if(Direction == 0)
johan04 1:da3240668253 288 pc.printf("Marche arriere\n\r");
johan04 1:da3240668253 289 else
johan04 1:da3240668253 290 pc.printf("Marche avant\n\r");
johan04 1:da3240668253 291
johan04 1:da3240668253 292 if (Brake == 0)
johan04 1:da3240668253 293 pc.printf("Frein actif\n\r");
johan04 1:da3240668253 294 else
johan04 1:da3240668253 295 pc.printf("Frein non actif\n\r");
johan04 1:da3240668253 296
johan04 1:da3240668253 297 if (Overcurrent == 0)
johan04 1:da3240668253 298 pc.printf(" surchage\n\r");
johan04 1:da3240668253 299 else
johan04 1:da3240668253 300 pc.printf("Pas de surchage\n\r");
johan04 1:da3240668253 301
johan04 1:da3240668253 302 if(Fault == 0)
johan04 1:da3240668253 303 pc.printf("pas d'erreur de convertisseur\n\r");
johan04 1:da3240668253 304 else
johan04 1:da3240668253 305 pc.printf("erreur de convertisseur\n\r");
johan04 1:da3240668253 306
johan04 1:da3240668253 307 pc.printf("cptTopHall = %d\n\r",cptTopHall);
johan04 1:da3240668253 308 pc.printf("Vitesse = %f\n\r",vitesse);
johan04 1:da3240668253 309
johan04 1:da3240668253 310
johan04 1:da3240668253 311
johan04 1:da3240668253 312 }
johan04 1:da3240668253 313
johan04 1:da3240668253 314 void choix()//fonction ticker
johan04 1:da3240668253 315 {
johan04 1:da3240668253 316
johan04 1:da3240668253 317 int mypld=MyPLD.read();
johan04 1:da3240668253 318 Brake = mypld &0x20;
johan04 1:da3240668253 319 if(mode == 0)
johan04 1:da3240668253 320 {
johan04 1:da3240668253 321
johan04 1:da3240668253 322 val_poig = Poig.read();
johan04 1:da3240668253 323
johan04 1:da3240668253 324 val = ((val_poig-NgazMin)/(NgazMax-NgazMin)*255);
johan04 1:da3240668253 325 if(Brake == 0)
johan04 1:da3240668253 326 {
johan04 1:da3240668253 327 val = 0;
johan04 1:da3240668253 328 }
johan04 1:da3240668253 329 if(val > giRefPwm_av)
johan04 1:da3240668253 330 {
johan04 1:da3240668253 331 giRefPwm_av = giRefPwm_av + 1;
johan04 1:da3240668253 332 }
johan04 1:da3240668253 333 if(val < giRefPwm_av)
johan04 1:da3240668253 334 {
johan04 1:da3240668253 335 giRefPwm_av = val;
johan04 1:da3240668253 336 }
johan04 1:da3240668253 337 if(giRefPwm_av > 255)
johan04 1:da3240668253 338 giRefPwm_av = 255;
johan04 1:da3240668253 339 if(giRefPwm_av < 0)
johan04 1:da3240668253 340 giRefPwm_av = 0;
johan04 1:da3240668253 341
johan04 1:da3240668253 342 }
johan04 1:da3240668253 343
johan04 1:da3240668253 344 else
johan04 1:da3240668253 345 {giRefPwm_av=PWM;}
johan04 1:da3240668253 346
johan04 1:da3240668253 347 MyPLD.write(giRefPwm_av);
johan04 1:da3240668253 348 }
johan04 1:da3240668253 349 void mesures()
johan04 1:da3240668253 350 {
johan04 1:da3240668253 351 int cpthall;
johan04 1:da3240668253 352 cpthall=0;
johan04 1:da3240668253 353 vitesse = cpthall*10*((2*3.14*0.21)*3.6)/120;
johan04 1:da3240668253 354 }
johan04 1:da3240668253 355 void compteur()
johan04 1:da3240668253 356 {
johan04 1:da3240668253 357 cptTopHall++;
johan04 1:da3240668253 358 }