Vous êtes sur la page 1sur 3

include <xc.

h>
#include "iut_lcd.h"
#include "iut_adc.h"
#include "iut_pwm.h"

int potent = 0;

int etatLectureCapteur = 0;
int vitBase;
float coefBrac = 0.1;

void suiviLigne(void) {
int CD, CG;
static int position;
// lecture des capteurs
CG = adc_read(3);
CD = adc_read(1);

switch (etatLectureCapteur) {
case 0:
position = CD - CG;
if ((CD < 900)&(CG < 200)) etatLectureCapteur = 1;
if ((CG < 900)&(CD < 200)) etatLectureCapteur = 2;
break;
case 1:
position = 800;
if (CD > 900) etatLectureCapteur = 0;
break;
case 2:
position = -800;
if (CG > 900) etatLectureCapteur = 0;
break;
default:
// ce cas ne devrait jamais se produire
etatLectureCapteur = 0;
} // fin du switch

pwm_setdc1((int)((float)vitBase+coefBrac*position)); // 0,25 pour PWM1 (broche


C2)
pwm_setdc2((int)((float)vitBase-coefBrac*position)); // 0,75 pour PWM2 (broche
C1)

lcd_position(0, 0);
lcd_printf(" Pos %4d ", position);
lcd_position(1, 0);
lcd_printf("CD%4d CG%4d", CD, CG);

void main(void) {

// declarations des variables


char JCK, FDC;
int etat;
// initialisation
lcd_init();
adc_init(4);
pwm_init(149, 2); // initialisation de la période 50µs

pwm_setdc1(0); // 0,25 pour PWM1 (broche C2)


pwm_setdc2(0); // 0,75 pour PWM2 (broche C1)
TRISB = 0xFF;
TRISE = 0xFF;

while (1) {
// acquisition entrée
potent = adc_read(0);
// initialisation

pwm_setdc1(0); // 0,25 pour PWM1 (broche C2)


pwm_setdc2(0); // 0,75 pour PWM2 (broche C1)
TRISB = 0xFF;
TRISE = 0xFF;

FDC = PORTBbits.RB2;
JCK = PORTEbits.RE2;

switch (etat) {
case 0:
lcd_position(0, 0);
lcd_printf(" Pos %4d ", potent);
vitBase=potent;
// arrêt des moteurs
if (JCK != 0) etat = 1;
break;
case 1:
// mise en marche des moteurs

suiviLigne();

if (FDC == 0) etat = 2;
break;
case 2:
pwm_setdc1(0); // 0,25 pour PWM1 (broche C2)
pwm_setdc2(0); // 0,75 pour PWM2 (broche C1)

if (JCK == 0) etat = 0;
break;
default:
// ce cas ne devrait jamais se produire
etat = 0;
} // fin du switch
// mise à jour sorties

return;
}

Vous aimerez peut-être aussi