Vous êtes sur la page 1sur 3

Ministère de l’Enseignement Supérieur ‫وزارة التعليـم العالي و البحث العلمي‬

et de la Recherche Scientifique

Université de Carthage
‫جامعـة قرطاج‬

Ecole Nationale d’Ingénieurs de Carthage ‫المدرسـة الوطنية للمهندسين بقرطاج‬

Commande d'un Kart Électrique


Un Kart électrique est une variante simple des voitures électrique pour le Karting monoplace. Ce Kart (Figure 1)
est équipé de quatre roues, reliées à un moteur à courant continu, et alimenté par des batteries.
Le système est équipé de quatre capteurs permettant sa commande et délivrant les informations suivantes :
• Un capteur de vitesse : la vitesse en Km/h
• Un capteur de température : la température du moteur en °C
• Un capteur de tension : le niveau de la batterie en V
• Un capteur de courant : le courant absorbé par le moteur en A
Le Kart est muni d'un bouton arrêt d'urgence.

Figure 1: Kart électrique

Tâche Bouton Arrêt


Création de la tâche "Urgence" d'urgence
"Urgence"

Figurepour
Nous proposons de vous guider 2 : Structure globale
développer des différentes
sur STM32F4, tâches
la pile à programmer
logicielle par FreeRTOS, pour la commande
de ce Kart en associant à chaque capteur utilisé une tâche permettant sa gestion.
Nous supposons que la configuration des différents périphériques est effectuée dans la fonction Config_SYS(),
appelée dans la fonction main(). La figure 2 montre un schéma simplifié des différentes tâches proposées.

Capteur de température :
Le capteur de température utilisé est un thermisteur NTC. Il délivre une tension analogique qui passe à travers un
conditionneur pour l'adapter à [0 - 3,3V], appelé Vout . La température est déduite de l'expression suivante :

1
𝛽
𝑇= 20×𝛽 1 𝑉 ×𝑅
− 273,15
𝑜𝑢𝑡 𝑇
+ ln (𝑅 ∗ 3,3−𝑉 )
5963 25 𝑜𝑢𝑡
Où 𝛽 ≈ 3550 et𝑅25 ≈ 850Ω, 𝑅𝑇 = 1000Ω.
Le rôle de cette tâche se résume à lecture de la tension Vout délivrée par le capteur toutes les 30s suivi du calcul de
la température 𝑇 qui sera envoyée vers l’écran LCD.
On suppose que le BSP suivant est prédéfinie :

#define beta 3550


#define R25 850
#define RT 1000
#define R1 33
#define R2 1
#define Vd 0.7
#define pi 3.14
typedef enum { Temp=0, Courant=1, Tension=2, Vitesse=3} CaptTypedef;

typedef struct{
CaptTypedef Capt;
float Donnee;
}LCD_donnee;
float Read_Capt(CaptTypedef C);//Lit et retourne la valeur de l'un des
capteur selon le paramètre C.
double log(double x); /* Calcule le logarithme Népérien de x.
Définie dans: math.h */

1) Coder la tâche "Motor_TEMP" qui permet de lire la tension délivrée par le capteur de température, suivi du
calcul de la température en °C ensuite de l'envoyer sous la forme d'une variable de type LCD_donnee dans une
queue appelée Queue_LCD.
Capteur de tension :
Le Kart intègre un indicateur de niveau de batterie permettant de le protéger contre les surcharges. La tension
délivrée par la batterie VBAT comprise entre [0..100V] passe à travers un conditionneur pour l'adapter à [0..3,3V]
(Vout) :
𝑉𝑂𝑢𝑡 × (𝑅1 + 𝑅2 )
𝑉𝐵𝐴𝑇 = + 2𝑉𝑑
𝑅2
Où Vd=0,7V , R1=33kΩ et R2=1kΩ.
2) Coder la tâche "Battery_level" qui permet de déterminer à partir de la tension 𝑉𝑂𝑢𝑡 issue du conditionneur,
toutes les 10s, la tension réelle des batteries qui sera envoyée sous la forme d'une variable de type LCD_donnee
dans la queue appelée Queue_LCD.
Rq: La tension Vout est récupérée par l'appel de la fonction Read_Capt.

Capteur de courant :
Le kart est équipé d'un capteur de courant afin de protéger l’utilisateur et les équipements électroniques contre les
surcharges lentes et rapides. Ainsi, le capteur de courant ASC758 a été installé sur l’une des phases du moteur. Il
permet de supporter un courant Ip allant jusqu'à 50A.
L’utilisation du circuit ASC 758 simplifie énormément la tâche de programmation grâce à la relation linéaire qui lie
le courant 𝐼𝑝 à la tension𝑉𝑜𝑢𝑡 .
𝑉𝑜𝑢𝑡
𝐼𝑝 =
0,04
3) Coder la tâche "Current" qui permet de déterminer à partir de la tension 𝑉𝑂𝑢𝑡 issue du capteur ASC758, toutes
les 1s, la valeur du courant, qui sera envoyée sous la forme d'une variable de type LCD_donnee dans la queue
appelée Queue_LCD.

Capteur de vitesse
L’estimation de la vitesse est souvent basée sur le calcul du nombre de tours des roues. Nous avons équipé le kart
électrique d'un capteur infrarouge permettant de convertir le nombre de tours du moteur en nombre d’impulsions.
En effet, le Timer3 est utilisé afin de compter à chaque seconde le nombre d’impulsions n provenant du capteur
infrarouge.
𝑉 = 𝑛 × 𝜋 × 20,6

2
Avec : 𝑉 : La vitesse en (km/h) et 𝑛 : Le nombre d'impulsion par seconde.

4) Coder la tâche "Speed" , qui permet de déterminer à partir du nombre d’impulsions générées par le capteur
infrarouge, la vitesse de rotation des roues qui sera envoyée sous la forme d'une variable de type LCD_donnee dans
la queue appelée Queue_LCD.
On suppose que les BSPs suivants, permettant la manipulation du TIMER3, soient définis :

void TIM3_ResetCounting(); // Permet d'initialiser le comptage : TIM3_CNT=0


uint32_t TIM3_ReadCounting(); // Permet de lire la valeur de comptage du Timer3
void TIM_StartCounting(); // Permet de commencer le comptage
void TIM3_StopCounting(); // Permet d'arrêter le comptage

Écran LCD
La tâche "Display" reçoit la valeur des différents capteurs à partir de la queue Queue_LCD. Selon la donnée
reçue un message dédié est affiché ayant l'une des formes suivantes :
• Température moteur (°C)= 29,3
• Tension batterie (V)= 50
• Courant phase (A)= 12
• Vitesse (Km/h)=2 3

void LCD_Write_String(char txt[]);//Permet d'afficher une chaine de caractères passée en


paramètre
void LCD_Write_Float(float x);//Permet d'afficher un réel passé en paramètre
5) Sachant que les tâches "Display" et "Urgence" accèdent en concurrence à l'écran LCD, quel mécanisme de
FreeRTOS peut-on utiliser pour garantir le bon affichage des messages dans leurs totalités ?
6) Coder la tâche "Display"

Bouton arrêt d'urgence

La tâche "Urgence" est la tâche la plus prioritaire. Elle permet d'arrêter les moteurs suite à l'appui du bouton arret
d'urgence. Le test de l'état de ce bouton est effectué toutes les 20ms, dans le cas où il est appuyé, la commande des
moteurs est effectuée et le message "Arrêt d'urgence" est affiché sur l'écran LCD.
uint8_t ButtonRead();//Permet de lire la valeur du bouton arret d'urgence, retourne 1, s'il est appuyé et 0
sinon
void Com_Stop_Motor();//Permet d'arrêter les moteurs
7) Coder la tâche "Urgence".

8) Coder la fonction main() de ce programme, en créant :


• les entités FreeRTOS nécessaires pour le fonctionnement de ce système (Queues et autres)
• les tâches citées précédemment (sans oublier de leurs assigner les diverses priorités)

Vous aimerez peut-être aussi