Révision 350
Ajouté par maantourou il y a plus de 6 ans
branch/Antourou/Emb_App/SessionM32C_E8a_system.ini | ||
---|---|---|
[Target]
|
||
M32C E8a SYSTEM=Renesas Communications
|
||
[USER_DATA]
|
||
RESET=ff0024
|
||
RESET=ff0022
|
branch/Antourou/Emb_App/programme_principal_etud.c | ||
---|---|---|
CanFrame requete;
|
||
UINT flag;//FLGPTN flag
|
||
// short position, distance; // valeur de l'angle renvoy?e par le simulateur
|
||
//
|
||
|
||
// Potentiometre: lire les registres ad00 et ad01, les valeurs sont sur 10 bits.
|
||
|
||
// Clavier: vrcv_dtq(QdmTouche,&code_touche) pour lire la derniere touche appuyee sur le clavier.
|
||
// la variable code_touche doit etre du type short.
|
||
// la variable code_touche doit etre du type short.
|
||
|
||
// Bouton poussoir: Bp_G, Bp_M, Bp_D permettent de lire l'etat des boutons de la carte I/O
|
||
|
||
... | ... | |
|
||
// Exemple:
|
||
// CanFrame comm;
|
||
// comm.data.id='T'; comm.data.rtr=0; comm.data.val=-100;
|
||
// comm.data.id='T';
|
||
// comm.data.rtr=0;
|
||
// comm.data.val=-100;
|
||
// snd_dtq (CanTx,comm.msg);
|
||
|
||
// Pour interroger un peripherique et recuperer les donnees brutes renvoyees simulateur:
|
||
... | ... | |
// snd_dtq (CanTx,demande.msg); // Interrogation du peripherique
|
||
// rcv_dtq (CanRx,&reponse.msg); // Attente de la reponse
|
||
// reponse.data.val contient la valeur de retour du simulateur.
|
||
// ATTENTION: Ne pas utiliser rcv_dtq(CanRx... si la tache ID_periph_rx est active
|
||
///////////////////////////////////// ATTENTION: Ne pas utiliser rcv_dtq(CanRx... si la tache ID_periph_rx est active////////////////////////////////////////
|
||
|
||
// Lors de l'utilisation de la tache de reception et distribution des messages ID_periph_rx
|
||
// Demarrer cette tache : sta_tsk(ID_periph_rx);
|
||
// Pour lire la valeur d'un peripherique:
|
||
// Il faut envoyer une demande de lecture:
|
||
// CanFrame comm;
|
||
// comm.data.id='R'; comm.data.rtr=1;
|
||
// comm.data.id='R';
|
||
// comm.data.rtr=1;
|
||
// snd_dtq (CanTx,comm.msg);
|
||
//
|
||
// Des l'arrivee de la reponse du simlateur, les variables suivantes sont mises a jour:
|
||
... | ... | |
// disponible. 0xab avec a-> nombre de couleurs bien plac?es et b -> couleurs pr?sentes mais mal plac?es.
|
||
//'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 '*'
|
||
|
||
// NOTE MR LAFFONT !!!!!!
|
||
/* passage piste verte :
|
||
1: asserv_tourelle dans le while(1) du main
|
||
2: mettre asserv_tourelle dans une tache
|
||
... | ... | |
*/
|
||
|
||
// fonction du programme:
|
||
void acquivitessetourelle(int vitesse);// acquisition de la vitesse de la tourelle
|
||
unsigned short acquipositiontourelle();// acquisition de la position de la tourelle
|
||
unsigned short longeurtel();// acquisition de la distance mesur? par le t?lem?tre
|
||
unsigned short mesuredistance();// lecture de la distance des roues au mur
|
||
void Avancementvoit(int vitesse);// vitesse de la voiture en r/s
|
||
void rouedirectrices(unsigned short angleroue);//angle des roues en 10e de degre
|
||
void Asservissment_tourelle();// asservissment de la tourelle
|
||
void acquivitesse_Tour(int vit); //vitesse tourelle
|
||
unsigned short position_tourelle(); // lire la position de la tourelle
|
||
unsigned short acqui_distance_Telem(); // acquisition distance du telemetre en cm
|
||
unsigned short distanceaumur(); //acquisition distance des roues au mur en cm
|
||
void vitesse_vehicule(int vitesse); // r?glage de la vitesse du vehicule
|
||
void roue_directrices(unsigned short angle); // commande des roues (angle des en 10e de degre)
|
||
|
||
|
||
unsigned short alpha;
|
||
unsigned short distancemesure;
|
||
|
||
// commande de la tourelle+acquisition de la distance avec le t?l?m?tre
|
||
unsigned short acquipositiontourelle()
|
||
{
|
||
CanFrame requete ;
|
||
UINT flag ;
|
||
|
||
//acquisition de l'angle mesur?e par la tourelle
|
||
requete.data.id='R'; //angle de la tourelle
|
||
requete.data.rtr=1; //req de lecture
|
||
snd_dtq(CanRx, requete.msg);
|
||
//rcv_dtq(CanRx, &repon.msg);
|
||
periph[ADDR('R')].ev=0x01;
|
||
snd_dtq(CanTx,requete.msg);
|
||
wai_flg(ev_periph, 0x01, TWF_ANDW,&flag);
|
||
alpha=periph[ADDR('R')].val;
|
||
return alpha;
|
||
|
||
|
||
}
|
||
void acquivitessetourelle(int vitessetourelle)
|
||
{ int vitessetourelle;
|
||
//asservissement de la tourelle
|
||
comm.data.id='T';
|
||
comm.data.rtr=0;// commande d'?criture
|
||
comm.data.val=vitessetourelle;
|
||
snd_dtq(CanTx,comm.msg);
|
||
dly_tsk(100);
|
||
|
||
|
||
unsigned short position_Tourelle() // lire la position de la tourelle
|
||
{
|
||
CanFrame req;
|
||
UINT flag;
|
||
req.data.id = 'R';
|
||
req.data.rtr = 1; // Requete de lecture
|
||
periph[ADDR('R')].ev =0x01;
|
||
snd_dtq(CanTx, req.msg);
|
||
wai_flg(ev_periph, 0x01, TWF_ANDW, &flag);
|
||
|
||
return periph[ADDR('R')].val;
|
||
}
|
||
unsigned short longeurtel()// acquisition de la distance mesur? par le t?lem?tre
|
||
{
|
||
CanFrame req, longtourn ;
|
||
int distancecons,k;
|
||
UINT flag;
|
||
req.data.id='U';
|
||
req.data.rtr=1; //requ de lecture
|
||
snd_dtq(CanRx, req.msg);
|
||
//rcv_dtq(CanRx, &repon.msg);
|
||
periph[ADDR('U')].ev=0x02;
|
||
snd_dtq(CanTx,req.msg);
|
||
wai_flg(ev_periph, 0x02, TWF_ANDW,&flag);
|
||
return periph[ADDR('U')].val;
|
||
|
||
void acquivitesse_Tour(int vit)//vitesse tourelle
|
||
{
|
||
CanFrame comm;
|
||
comm.data.id = 'T';
|
||
comm.data.rtr = 0; //ecriture
|
||
comm.data.val = vit;
|
||
snd_dtq (CanTx,comm.msg);
|
||
}
|
||
unsigned short distanceaumur()// lecture de la distance des roues au mur
|
||
unsigned short acqui_distance_Telem()// acquisition distance du telemetre en cm pour le calcul de la distance
|
||
{
|
||
unsigned short distance, longtourn,alpha;
|
||
distance=longtourn * sin( 3,14 * (alpha/10) * 180.0 );
|
||
return distance;
|
||
CanFrame requete;
|
||
UINT flag;
|
||
requete.data.id = 'U';
|
||
requete.data.rtr = 1;// Requete de lecture
|
||
periph[ADDR('U')].ev =0x02;
|
||
snd_dtq(CanTx, requete.msg);
|
||
|
||
wai_flg(ev_periph, 0x02, TWF_ANDW, &flag);
|
||
|
||
return periph[ADDR('U')].val;
|
||
}
|
||
void rouedirectrices(unsigned short angleroue)//angle des roues en 10e de degre
|
||
{
|
||
CanFrame comm;
|
||
comm.data.id = 'D';//
|
||
comm.data.rtr = 0; //ecriture
|
||
comm.data.val = angleroue;// ?criture dans angleroue la valeur de l'angle des roues directrices
|
||
snd_dtq (CanTx,comm.msg);
|
||
|
||
void vitesse_vehicule(int vitesse)// r?glage de la vitesse du vehicule
|
||
{
|
||
CanFrame comm;
|
||
comm.data.id = 'V';
|
||
comm.data.rtr = 0; //requete d'ecriture
|
||
comm.data.val = vitesse;
|
||
snd_dtq (CanTx,comm.msg);
|
||
}
|
||
void Avancementvoit() //(ne pas toucher)// vitesse du v?hicule
|
||
unsigned short distanceaumur()//acquisition distance des roues au mur en cm
|
||
{
|
||
CanFrame requete;
|
||
requete.data.id='V';
|
||
requete.data.rtr=0;
|
||
requete.data.val=30;// valeur de la vitesse
|
||
snd_dtq(CanTx,requete.msg);
|
||
unsigned short longtelem, pos_tourelle, distanceaumur;
|
||
longtelem = acqui_distance_Telem();
|
||
pos_tourelle = position_Tourelle();
|
||
distanceaumur= longtelem * sin( 3.14*(pos_tourelle/10)/180.0 );
|
||
return distanceaumur;
|
||
}
|
||
|
||
|
||
void roue_directrices(unsigned short angleroue)// commande des roues (angle des en 10e de degre)
|
||
{
|
||
CanFrame comm;
|
||
|
||
comm.data.id = 'D';
|
||
comm.data.rtr = 0; //commande d'ecriture
|
||
comm.data.val = angleroue;
|
||
snd_dtq (CanTx,comm.msg);
|
||
|
||
}
|
||
void Asservissment_tourelle()// asservissment de la tourelle
|
||
void regulation_roue()
|
||
{
|
||
unsigned short pos_tourelle;
|
||
int k, vites;
|
||
k=3;
|
||
while(1)
|
||
unsigned short dConsigne , distance, k;
|
||
int angleroue;
|
||
k = 3; //gain dpour l'asservissment
|
||
dConsigne = 500;//position au d?but
|
||
|
||
while(1)
|
||
{
|
||
pos_tourelle = acquipositiontourelle();
|
||
vites = k*( 450 - pos_tourelle); //correcteur Prop
|
||
acquivitessetourelle(vites);
|
||
|
||
distance = distanceaumur();
|
||
if ( distance >= 800) // s'il y'a des trous dans les bords
|
||
{
|
||
roue_directrices(0);
|
||
}
|
||
else
|
||
{ angleroue = -k*( dConsigne - distance ); //Corection de la direction
|
||
roue_directrices(angleroue);
|
||
}
|
||
dly_tsk(25);
|
||
}
|
||
}
|
||
|
||
|
||
void asservissment_tour()
|
||
{
|
||
unsigned short posConsigne,posf;
|
||
short k,vit;
|
||
k = 3; //gain definni experimentalement
|
||
posConsigne = 450;
|
||
|
||
while(1)
|
||
{
|
||
posf = position_Tourelle();
|
||
vit = k*( posConsigne - posf); //correcteur Prop
|
||
acquivitesse_Tour(vit);
|
||
dly_tsk(100);
|
||
}
|
||
}
|
||
void regul_roue()
|
||
{ //asservissment v?h
|
||
|
||
int k, distancecons;
|
||
int angleroue;
|
||
k=3;// gain pour asservissement
|
||
distancecons=500;
|
||
while(1)
|
||
{
|
||
distancemesure=distanceaumur();
|
||
angleroue=-k*(distancecons-distancemesure);// correction
|
||
rouedirectrices(angleroue);
|
||
|
||
dly_tsk(25);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void main ()
|
||
|
||
// MAIN:
|
||
void main()
|
||
{
|
||
CanFrame requete,reponse,comm;
|
||
ports_mcu();
|
||
lcd_init();
|
||
periph_init();
|
||
periph_nom("#TEST001*");
|
||
can_init();
|
||
clavier_init(1);
|
||
capture_init();
|
||
ports_mcu();
|
||
lcd_init();
|
||
periph_init();
|
||
periph_nom("#mimi001");// changement du nom du v?hicule
|
||
|
||
can_init();
|
||
clavier_init(1);
|
||
capture_init();
|
||
sta_cyc(ID_acqui);
|
||
sta_tsk(ID_periph_rx);
|
||
sta_tsk(ID_asservissment_tour);
|
||
|
||
dly_tsk(500);
|
||
sta_tsk(ID_regulation_roue);
|
||
dly_tsk(500);
|
||
vitesse_vehicule(45);
|
||
|
||
sta_cyc(ID_acqui);// //Var g utlis?es par les asservissements
|
||
sta_tsk(ID_periph_rx);
|
||
Avancementvoit();
|
||
sta_tsk(ID_Asservissment_tourelle);
|
||
|
||
sta_tsk(ID_regul_roue);
|
||
|
||
|
||
|
||
|
||
while(1)
|
||
{
|
||
|
||
LED_J=1;
|
||
LED_J=1;
|
||
dly_tsk(100);
|
||
LED_J=0;
|
||
dly_tsk(100);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
void acqui()
|
||
{
|
||
LED_V=!LED_V;
|
||
... | ... | |
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
branch/Antourou/Emb_App/conf_noyau.cfg | ||
---|---|---|
exinf = 0x0;
|
||
};
|
||
task[]{
|
||
entry_address = Asservissment_tourelle();
|
||
name = ID_Asservissment_tourelle;
|
||
entry_address = asservissment_tour();// tache d'asservissment de la tourelle
|
||
name = ID_asservissment_tour;
|
||
stack_size = 256;
|
||
stack_section = stack;
|
||
priority = 6;
|
||
... | ... | |
};
|
||
|
||
task[]{
|
||
entry_address = regul_roue();
|
||
name = ID_regul_roue;
|
||
entry_address = regulation_roue();// assr'vissement de la direction des roues directices
|
||
name = ID_regulation_roue;
|
||
stack_size = 1024;
|
||
stack_section = stack;
|
||
priority = 7;
|
Formats disponibles : Unified diff
reprise des fonctions du programme