/******************************************************************* Programme du robot aspirateur avec un 30F4012 Oscillateur: FRC (7.5Mhz)*16PLL= 30 Mips Les trois sortie PWM sont utilisées (2 pour les moteurs de déplacement et 1 pour le moteur de l'aspirateur) Le convertisseur analogique numérique sert pour la gestion des contactes grâce à la mesure de m'intensité qui circule dans les moteurs et à la gestion de l'alimentation. Le timer 23 sert pour faire cligonter une LED et pour la rampe de vitesse des moteurs. nb On pourrait tout aussi bien utiliser un seul timer 16 bits Le timer 45 sert pour temporiser le actions *********************************************************************/ #include "p30f4012.h" #include #include #include #include #include //#define BAUDS_9600_FRC_8PLL 95 //#define BAUDS_9600_FRC_16PLL 194 unsigned long pwm; //fontions de manipulation du robot void avance(void); void recule(void); void tourn_drt(void); void tourn_gch(void); void incr_pwm(void); void arret(void); void redemarrage(void); void frein(void); void roue_libre(void); void demarrer_tempo(unsigned long tempo); volatile unsigned int fin_tempo_var; //variable qui indique la fin d'une tempo volatile unsigned int pwm_count; volatile unsigned int AN_alim,AN_md,AN_mg; //pour le conversion AN volatile unsigned int alim_low; //variable qui indique une baisse de tension volatile unsigned int led_count;//variable pour le clignotement de la led //pin des moteurs et registre de controle de cette pin //#define EN_A PORTEbits.RE1 #define EN_A_TRIS TRISEbits.TRISE5 #define EN_A_LAT LATEbits.LATE5 #define IN_A1 LATBbits.LATB3 #define IN_A1_TRIS TRISBbits.TRISB3 #define IN_A2 LATBbits.LATB4 #define IN_A2_TRIS TRISBbits.TRISB4 //#define EN_B PORTEbits.RE3 #define EN_B_TRIS TRISEbits.TRISE3 #define EN_B_LAT LATEbits.LATE3 #define IN_B1 LATBbits.LATB5 #define IN_B1_TRIS TRISBbits.TRISB5 #define IN_B2 LATCbits.LATC15 #define IN_B2_TRIS TRISCbits.TRISC15 #define puls_aspi LATEbits.LATE1 #define puls_aspi_TRIS TRISEbits.TRISE1 //variable des contactes #define cntct_drt PORTDbits.RD1 #define cntct_drt_TRIS TRISDbits.TRISD1 #define cntct_gch PORTDbits.RD0 #define cntct_gch_TRIS TRISDbits.TRISD0 #define cntct_centre PORTEbits.RE8 #define cntct_centre_TRIS TRISEbits.TRISE8 #define off 1 #define on 0 #define forward 1 #define reverse 0 #define in 1 #define out 0 //variables de temporisation (limite de temps d'une action !) #define av_tempo 200000 //117188 #define rec_tempo 200000 // 117188 #define drte_tempo 200000 //58594; //117188 #define gch_tempo 200000 //58594; //117188 #define frein_tempo 1561880 //pwm max du moteur --> vitesse max admise #define pwm_max_ar 2400 //2210 //1500 //2310 #define pwm_max_dg 2650 //2850 #define pwm_min 2000 //1800 #define AN_alim_min_haut 750 #define AN_alim_min_bas 650 #define AN_md_max 130 //130 // 145 //1024 //435 #define AN_mg_max 130 //130 // 145 //1024 //435 ok ca marche 145 et à 130 //les moteurs consomment plus quand le robot tourne sur lui-même #define AN_md_ctg_max 1024 // 145 //1024 //435 #define AN_mg_ctd_max 1024 // 145 //1024 //435 //variables de l'intelligence de l'aspirateur enum {av,rec,drte,gche,ar,red,frn} Etat,Etat_old;//variable qui permet de stocker l'Etat du robot enum {contacte_drt,contacte_gch,contacte_front,nothing,fin_tempo,alimlow} Evenment;//variable qui permet l'evenment //filtrage numerique volatile float filtre_d,filtre_g; #define alpha .1 #define un_alpha .9