Projet

Général

Profil

« Précédent | Suivant » 

Révision 275

Ajouté par vidaval il y a plus de 6 ans

Mise en place de la condition pour passer les trous barrière piste bleue + correction position de la voiture sur la route

Voir les différences:

branch/daval/Emb_App/SessionM32C_E8a_system.ini
[Target]
M32C E8a SYSTEM=Renesas Communications
[USER_DATA]
RESET=ff0030
RESET=ff0028
branch/daval/Emb_App/programme_principal_etud.c
//'I'/73/Ox49 : D?finition du nom du v?hicule. Doit d?buter par le caract?re '#' et entraine le chargement de la configuration de piste
// correspondant au nom du v?hicule si le nom se termine par '*'
//Asservissement de la tourelle
int consigne = 450; //valeur de la consigne
int angle=0 ; //valeur retournee
float k=1.9; //gain du correcteur
int valeur = 0 ; //valeur envoyee
int angle_mesure=0 ; //valeur retournee
char k=1; //gain du correcteur
int angle_corrige = 0 ; //valeur envoyee
int consigne_roue=735; // Consigne en angle pour que les roues soient un peu pr?s droite
float C=1.; // Gain asservissment des roues
int orientation_roue =0; // valeur corrigee pour l orientation des roues
int vitesse_voulue=45; // Commande de vitesse que l'on envoie
CanFrame vitesse;
CanFrame requete;
//Asservissement de la voiture
int consigne_roue=700; // Consigne qui permet d etre bien centr? sur la route
char C=1; // Gain asservissment des roues
int vitesse_voulue=35; // Commande de vitesse que l'on envoie
int distance_mesure=0;
void asservissement()
{
CanFrame commande;
......
//rcv_dtq (CanRx,&reponse.msg); // Attente de la reponse // On ne l'utilise plus car utlisation de periph_ID
angle = periph[ADDR('R')].val; // Contient la valeur de retour du simulateur.
angle_mesure = periph[ADDR('R')].val; // Contient la valeur de retour du simulateur.
commande.data.id='T'; //Envoi d'une commande
commande.data.rtr=0; //Indique une ecriture
valeur=k*(consigne-angle);
commande.data.val=valeur;
angle_corrige=k*(consigne-angle_mesure);
commande.data.val=angle_corrige;
snd_dtq (CanTx,commande.msg); //Envoi modification
dly_tsk(5);
dly_tsk(15);
}
}
void avance()
{
vitesse.data.id='V'; //Envoi d'une commande en vitesse
vitesse.data.rtr=0; //Indique une ecriture
vitesse.data.val=vitesse_voulue;
snd_dtq (CanTx,vitesse.msg);
dly_tsk(15);
CanFrame vitesse;
CanFrame requete;
vitesse.data.id='V'; //Envoi d'une commande en vitesse
vitesse.data.rtr=0; //Indique une ecriture
vitesse.data.val=vitesse_voulue;
snd_dtq (CanTx,vitesse.msg);
dly_tsk(15);
}
void distance_bord()
......
requete_dist.data.id= 'U' ;
requete_dist.data.rtr= 1 ; //requete lecture distance donne par le telemetre
periph[ADDR('U')].ev= 0x01 ; //L evenement est declenche a chaque fois que la valeur du periph U et mise ? jour
periph[ADDR('U')].ev= 0x02 ; //L evenement est declenche a chaque fois que la valeur du periph U et mise ? jour
snd_dtq(CanTx, requete_dist.msg);
wai_flg (ev_periph, 0x01, TWF_ANDW, &flag); //Attente lecture
distance_mesure=periph[ADDR('U')].val;
dly_tsk(15);
wai_flg (ev_periph, 0x02, TWF_ANDW, &flag); //Attente lecture
//distance_mesure=periph[ADDR('U')].val;
if(periph[ADDR('U')].val > 2000)
{
distance_mesure=700;
}
else
{
distance_mesure=periph[ADDR('U')].val;
}
dly_tsk(5);
}
}
void angle_roue()
void angle_roues()
{
CanFrame requete,commande;
UINT flag;
......
while (1)
{
requete.data.id='D';
requete.data.rtr=1;
requete.data.id='D'; //Angle des roues directrices
requete.data.rtr=1; //Requete lecture distance donne par le telemetre
periph[ADDR('D')].ev=0x01;
snd_dtq(CanTx, requete.msg);
wai_flg (ev_periph, 0x01, TWF_ANDW, &flag);
orientation_roue=periph[ADDR('D')].val;
commande.data.id='D';
commande.data.rtr=0;
commande.data.val= C*(distance_mesure-consigne_roue);
......
sta_tsk(ID_periph_rx); //Si on utilise cette t?che on ne doit plus utiliser canRX
sta_tsk(ID_asservissement);
sta_tsk(ID_distance_bord);
sta_tsk(ID_angle_roue);
sta_tsk(ID_angle_roues);
sta_tsk(ID_avance);
while(1);
branch/daval/Emb_App/conf_noyau.cfg
};
task[]{
entry_address = angle_roue();
name = ID_angle_roue;
entry_address = angle_roues();
name = ID_angle_roues;
stack_size = 256;
stack_section = stack;
priority = 4;

Formats disponibles : Unified diff