Projet

Général

Profil

« Précédent | Suivant » 

Révision 290

Ajouté par axfont il y a plus de 6 ans

piste rouge passée saut géré

Voir les différences:

branch/font/Emb_App/programme_principal_etud.c
int distance1;
int vitesse = 60; //vitesse souhait?e
int vitesse_virage = 25; //vitesse pendant un virage souhait?e
int vitesse_montee = 25;
int angle_roue;
int kroue = 1;
int k = 1;
int num_piste;
int num_piste1;
int capteur;
int vitesse_montee = 45; //vitesse pendant la mont?e piste bleu
int vitesse_saut = 45; //vitesse pendant le saut piste rouge
int vitesse_recep = 10;
int angle_roue = 0;
int kroue = 1; //coefficient asservissement tourelle
int ktour = 1; //coefficient asservissement roues
int num_piste; //valeur du p?riph?rique 'M'
int num_piste1; //num?ro de la piste
int capteur; //valeur du dernier capteur franchi
int a = 0;
char saut = 0;
int feu;
......
int montee = 0;
void lecture_telemetre(){
CanFrame reponsed, requeted;
CanFrame requete;
UINT flag;
while(1){
//Lecture distance mesur?e
requeted.data.id = 'U';
requeted.data.rtr = 1; //requete de lecture
requete.data.id = 'U';
requete.data.rtr = 1; //requete de lecture
periph[ADDR('U')].ev = 0x02;
snd_dtq(CanTx, requeted.msg);
snd_dtq(CanTx, requete.msg);
wai_flg(ev_periph, 0x02, TWF_ANDW, &flag); //Attente de lecture
distance1 = periph[ADDR('U')].val;
if(distance1 > 2000){}
if(distance1 > 1500 || distance1 < -1500){}
else {
distance = distance1;
}
dly_tsk(5);
dly_tsk(6);
}
}
......
periph[ADDR('D')].ev = 0x03;
snd_dtq(CanTx, requete.msg);
wai_flg(ev_periph, 0x03, TWF_ANDW, &flag); //Attente de lecture de l'angle des roues
comm.data.rtr = 0;
if(saut == 0){ //Aucun saut franchi
angle_roue = kroue * (distance - distance_bord); //Asservissement de l'angle
//if(saut == 0){
angle_roue = kroue * (distance - distance_bord); //Asservissement de l'angle
//}
if(saut == 1) {
angle_roue = 0;
}
else angle_roue = 0;
comm.data.val = angle_roue;
snd_dtq(CanTx, comm.msg);
dly_tsk(5);
dly_tsk(6);
}
}
......
//asservissement en vitesse de rotation de la tourelle
comm.data.id = 'T';
comm.data.rtr = 0;
comm.data.val = k * (angle_tourelle - alpha);
comm.data.val = ktour * (angle_tourelle - alpha);
snd_dtq(CanTx, comm.msg);
dly_tsk(5);
}
......
snd_dtq(CanTx, requete.msg);
wai_flg(ev_periph, 0x05, TWF_ANDW, &flag); //Attente de la r?ponse
capteur = periph[ADDR('C')].val; //acquisition du dernier capteur franchi
dly_tsk(5);
dly_tsk(6);
}
}
......
while(1){
if(num_piste1 == 2){ //d?tection piste rouge
if( capteur == 0x5604 ){ //d?tection capteur avant saut
if( capteur == 0x5604 ){ //d?tection capteur avant montee
montee = 1;
}
else {
montee = 0;
}
}
dly_tsk(5);
dly_tsk(6);
}
}
......
void gestion_saut (){
while(1){
if(num_piste1 == 7){ //d?tection piste rouge
if(num_piste1 == 3){ //d?tection piste rouge
if( capteur == 0x5603 ){ //d?tection capteur avant saut
dly_tsk(1000);
saut = 1;
}
else {
saut = 0;
}
}
dly_tsk(5);
dly_tsk(6);
}
}
......
wai_flg(ev_periph, 0x06, TWF_ANDW, &flag); //Attente de la r?ponse
feu = periph[ADDR('M')].val; //acquisition du dernier capteur franchi
feuv = feu & 0x8000;
dly_tsk(3);
dly_tsk(6);
}
}
......
snd_dtq(CanTx, comm.msg);
while(1){
comm.data.id = 'V';
comm.data.rtr = 0;
if(angle_roue > 40 || angle_roue < -40){ //ralentissement de la voiture si angle demand? trop grand
comm.data.val = vitesse_virage;
snd_dtq(CanTx, comm.msg);
}
else{
comm.data.val = vitesse;
snd_dtq(CanTx, comm.msg);
}
if(montee == 1){
comm.data.val = vitesse_montee;
snd_dtq(CanTx, comm.msg);
a = 1;
}
dly_tsk(3);
comm.data.id = 'V';
comm.data.rtr = 0;
if(angle_roue > 40 || angle_roue < -40){ //ralentissement de la voiture si angle demand? trop grand
comm.data.val = vitesse_virage;
snd_dtq(CanTx, comm.msg);
}
else{
comm.data.val = vitesse;
snd_dtq(CanTx, comm.msg);
}
if(montee == 1){
comm.data.val = vitesse_montee;
snd_dtq(CanTx, comm.msg);
}
if(saut == 1){
comm.data.val = vitesse_saut;
snd_dtq(CanTx, comm.msg);
}
if(capteur == 0x4203 && num_piste1 == 3){
comm.data.val = vitesse_recep;
snd_dtq(CanTx, comm.msg);
}
dly_tsk(6);
}
//} acolade if d?part feu vert
}

Formats disponibles : Unified diff