Projet

Général

Profil

« Précédent | Suivant » 

Révision 183

Ajouté par vidaval il y a plus de 6 ans

Implantation de la mesure de distance par le telemetre + asservissement de l'orientation des roues le tout des tâches

Voir les différences:

branch/daval/Emb_App/SessionM32C_E8a_system.ini
[Target]
M32C E8a SYSTEM=Renesas Communications
[USER_DATA]
RESET=ff0022
RESET=ff002a
branch/daval/Emb_App/programme_principal_etud.c
int k=1; //gain du correcteur
int valeur = 0 ; //valeur envoyee
int consigne_roue=700;
int C=1;
int orientation_roue =0;
CanFrame vitesse;
CanFrame requete;
int distance_mesure=0;
void avance()
{
vitesse.data.id='V'; //Envoi d'une commande
vitesse.data.rtr=0; //Indique une ecriture
vitesse.data.val=15;
snd_dtq (CanTx,vitesse.msg);
}
void asservissement()
{
CanFrame comm;
CanFrame commande;
CanFrame requete;
CanFrame reponse;
......
angle = periph[ADDR('R')].val; // Contient la valeur de retour du simulateur.
comm.data.id='T'; //Envoi d'une commande
comm.data.rtr=0; //Indique une ecriture
commande.data.id='T'; //Envoi d'une commande
commande.data.rtr=0; //Indique une ecriture
valeur=k*(consigne-angle);
comm.data.val=valeur;
snd_dtq (CanTx,comm.msg); //Envoi modif
dly_tsk(2);
commande.data.val=valeur;
snd_dtq (CanTx,commande.msg); //Envoi modif
dly_tsk(5);
}
}
void avance()
{
vitesse.data.id='V'; //Envoi d'une commande en vitesse
vitesse.data.rtr=0; //Indique une ecriture
vitesse.data.val=25;
snd_dtq (CanTx,vitesse.msg);
dly_tsk(15);
}
void distance_bord()
{
CanFrame requete_dist;
UINT flag;
while(1)
{
requete_dist.data.id= 'U' ;
requete_dist.data.rtr= 1 ; //requete lecture
periph[ADDR('U')].ev= 0x02 ;
snd_dtq(CanTx, requete_dist.msg);
wai_flg (ev_periph, 0x02, TWF_ANDW, &flag); //Attente lecture
distance_mesure=periph[ADDR('U')].val;
dly_tsk(15);
}
}
void angle_roue()
{
CanFrame requete,commande;
UINT flag;
while (1)
{
requete.data.id='D';
requete.data.rtr=1;
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);
snd_dtq(CanTx, commande.msg);
dly_tsk(5);
}
}
void main()
......
sta_cyc(ID_acqui);
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_avance);
while(1);
branch/daval/Emb_App/conf_noyau.cfg
name = ID_avance;
stack_size = 256;
stack_section = stack;
priority = 5;
initial_start = OFF;
exinf = 0x0;
};
task[]{
entry_address = distance_bord();
name = ID_distance_bord;
stack_size = 256;
stack_section = stack;
priority = 4;
initial_start = OFF;
exinf = 0x0;
};
task[]{
entry_address = oriente_roue();
name = ID_oriente_roue;
entry_address = angle_roue();
name = ID_angle_roue;
stack_size = 256;
stack_section = stack;
priority = 5;
priority = 4;
initial_start = OFF;
exinf = 0x0;
};
flag[]{
name = ev_bus_fin_tr;
initial_pattern = 0x0000;

Formats disponibles : Unified diff