République Tunisienne
Ministère de l’Enseignement Supérieur et de la Recherche Scientifique
Université de Monastir
École Nationale d’Ingénieurs de Monastir
TP3: Génération des signaux
PWM/Conversion analogique numérique
ELECT 2 GR 3
Elaboré par :
MAHFOUDH Yosra
ZAAG Jasser
2022-2023
I. Introduction
Contexte et objectifs du TP
La génération de signaux PWM (Pulse Width Modulation) et la conversion analogique-
numérique (CAN) sont deux fonctionnalités importantes des microcontrôleurs tels que le
STM32. Voici un aperçu de ces deux sujets :
Génération des signaux PWM : Le STM32 dispose de plusieurs timers et canaux de
capture qui peuvent être utilisés pour générer des signaux PWM. Les signaux PWM sont
généralement utilisés pour contrôler la vitesse d'un moteur, la luminosité d'une LED ou le
fonctionnement d'un servo-moteur. La configuration des timers et des canaux de capture
pour la génération de signaux PWM peut être effectuée via les registres correspondants
du microcontrôleur ou à l'aide de bibliothèques logicielles telles que STM32CubeMX et
STM32CubeIDE.
Conversion analogique-numérique : La conversion analogique-numérique est une
fonctionnalité qui permet de convertir des signaux analogiques en signaux numériques
exploitables par le microcontrôleur. Cette fonctionnalité est souvent utilisée pour
mesurer des tensions, des courants ou des températures.
Dans ce TP, nous allons explorer Le processus de configuration et de génération d'un signal
PWM à partir du Timer à l'aide de STM32CubeIDE, ainsi que l'utilisation du convertisseur
analogique/numérique, est important pour contrôler un servo-moteur.
Ce processus permet de réguler la vitesse et la position du servo-moteur en ajustant la durée
d'activation du signal PWM et en mesurant la tension analogique à l'aide du convertisseur
analogique/numérique.
STM32CubeIDE offre une interface conviviale pour configurer rapidement et facilement le
signal PWM, ce qui permet un contrôle précis et fiable du servo-moteur.
II. Génération des signaux PWM :
Timer en mode PWM :
Le Timer en mode PWM est une fonctionnalité des microcontrôleurs STM32 qui permet de
générer un signal de modulation de largeur d'impulsion (PWM) avec une fréquence et un
rapport cyclique spécifiques.
Le signal PWM est un signal périodique qui consiste en une succession d'impulsions de
durées variables. Le rapport cyclique est défini comme la durée de l'impulsion par rapport à
la durée totale de la période. Ainsi, un rapport cyclique de 50% signifie que la durée de
l'impulsion est égale à la moitié de la durée totale de la période.
Le Timer en mode PWM peut être configuré à l'aide d'un logiciel comme STM32CubeIDE.
Les paramètres tels que la fréquence, la période et le rapport cyclique du signal PWM
peuvent être définis dans le code. Les signaux PWM sont largement utilisés pour contrôler
des moteurs, des LED ou d'autres périphériques qui peuvent être contrôlés par un signal
PWM.
Le Timer en mode PWM peut être utilisé pour réguler la vitesse et la direction des moteurs.
Par exemple, en ajustant le rapport cyclique du signal PWM, il est possible de contrôler la
vitesse du moteur. En utilisant une boucle de rétroaction, il est également possible de réguler
la position du moteur. Le signal PWM est également utilisé pour réguler la luminosité des
LED ou pour effectuer des opérations d'atténuation.
Figure 1 : Modes d'un signal PWM
La période d’un signal PWM est donnée par :
T_{PWM}=\left(TIMx_ARR\right)\times(TIMx_{PSC}+1)\times T_{cyc}
La durée T_{on} est :
T_{on}=(TIMx_CCRy)\times\ \times(TIMx_{PSC}+1)\times T_{cyc}
y : le numéro du channel (1,2)
Travail demandé :
1. Configuration du module TIM1 pour la génération d'un signal PWM de fréquence
5KHz et un rapport cyclique de 25% sur le channel 1 :
La fonction à utiliser pour initialiser le signal PWM est la suivante :
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
2.3.4. Test du fonctionnement du signal sous Proteus :
Mode 1 :
Figure 2 : Mode 1 d'un signal PWM
On obtenu un rapport cyclique = 25%
Mode 2 :
Figure 3 : Mode 2 d'un signal PWM
On peut ajuster le rapport cyclique à 75% en utilisant le registre TIM1_CCR1 en utilisant
cette instruction :
TIM1 -> CCR1=1500 ;
III. Convertisseur Analogique numérique :
Les microcontrôleurs STM32 disposent de CAN 12 bits, 16 bits, 24 bits ou 32 bits en
fonction du modèle. Certains modèles peuvent également inclure plusieurs convertisseurs
CAN.
Figure 4 : CAN et CNA
Les CAN STM32 peuvent être configurés pour fonctionner en mode unique, continu,
discontinu, balayage de plusieurs canaux, ou en utilisant un trigger externe.
Ils peuvent également inclure des sources de tension interne (Vref, température, etc.) et des
options de filtrage numérique.
Les convertisseurs CAN dans les microcontrôleurs STM32 sont souvent utilisés dans les
applications de mesure de capteurs, de contrôle de moteurs, de surveillance de l'état de la
batterie, et de nombreux autres domaines.
Lorsqu'on utilise un convertisseur analogique-numérique (CAN) pour mesurer une tension
d'entrée V, il est important de choisir une tension de référence appropriée pour garantir une
mesure précise. La tension de référence (Vref) doit être supérieure à la tension d'entrée
maximale V que l'on souhaite mesurer, pour que la plage de tension d'entrée soit couverte par
la plage de la tension de référence.
Quand la tension d'entrée V est mesurée, elle est convertie en une valeur numérique par le
CAN. La valeur numérique de sortie est généralement comprise entre 0 et 2^N -1, où N est le
nombre de bits de résolution du convertisseur. Par exemple, si le convertisseur a une
résolution de 12 bits, la valeur numérique de sortie sera comprise entre 0 et 2^12 -1, soit entre
0 et 4095.
La valeur numérique de sortie est proportionnelle à la tension d'entrée V, selon la formule
suivante :
Valeur numérique de sortie = (V / Vref) x 2^N
Par conséquent, plus la tension d'entrée est proche de la tension de référence, plus la valeur
numérique de sortie sera élevée. Ainsi, pour une tension d'entrée de 3,3V et une tension de
référence de 3,3V, la valeur numérique de sortie sera de 2^N -1, soit 4095 pour une résolution
de 12 bits.
Figure 5 : Schéma fonctionnel d'un ADC du STM32F
Le convertisseur analogique-numérique (CAN) basé sur la technologie SAR (Registre à
Approximations Successives) est un type de CAN qui utilise une technique de conversion en
plusieurs étapes pour convertir une tension d'entrée en une valeur numérique. Le temps de
conversion dépend du nombre de bits de résolution du convertisseur, car chaque bit doit être
converti séparément.
Ainsi, pour une résolution de 12 bits, le temps de conversion sera de 12 cycles d'horloge au
sein du DAC. Le temps total de conversion est déterminé par la formule suivante :
Ttotal conversion = Sampling time + 12 cycles.
Le temps de sampling est le temps nécessaire pour prélever l'échantillon de tension d'entrée et
le stabiliser avant de le convertir en valeur numérique. Il dépend de la fréquence de l'horloge
de la partie analogique du CAN, qui est réglable par l'intermédiaire d'un prescaler (2, 4, 6, 8).
Figure 6 : ADC sample time register 1 (ADC_SMPR1)
Lorsqu'une conversion est terminée, il est possible de déclencher une interruption à chaque
fin de conversion en utilisant le flag EOC (End of Conversion). Cette interruption peut être
utilisée pour démarrer une autre conversion ou pour effectuer un traitement sur la valeur
numérique de sortie.
Pour tester le fonctionnement d'un convertisseur analogique-numérique, on peut utiliser les
instructions suivantes après la phase de configuration :
HAL_ADC_Start(&hadc1) : permet de démarrer la conversion.
HAL_ADC_PollForConversion(&hadc1, 100) : attend la fin de la conversion ou jusqu'à
ce que le temps d'attente soit écoulé (ici 100ms).
HAL_ADC_GetValue(&hadc1) : permet de lire la valeur numérique de sortie.
printf("value of ADC is: %d\r\n", Num) : affiche la valeur numérique de sortie sur la
console.
Travail demandé :
1. Aquisition d'une tension issue d'un potemiomètre :
Après avoir faire la configuration on exécute ce code STM32CubeIDE suivant :
/* USER CODE BEGIN 2 */
//configuration pins lcd
Lcd_PortType ports[] = {D4_GPIO_Port,D5_GPIO_Port,D6_GPIO_Port,D7_GPIO_Port };
Lcd_PinType pins[] = {D4_Pin,D5_Pin,D6_Pin,D7_Pin};
lcd=Lcd_create(ports , pins , RS_GPIO_Port , RS_Pin , E_GPIO_Port , E_Pin, LCD_4_BIT_MODE) ;
Lcd_cursor(&lcd, 0,2);
Lcd_string(&lcd, "readVal");
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
TIM1-> CCR1=5;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,100);
readVal=HAL_ADC_GetValue(&hadc1);
HAL_Delay(200);
Lcd_cursor(&lcd, 1,0);
Lcd_int(&lcd, readVal );
}
/* USER CODE END WHILE */
Simulation du code :
Figure 7 : Simulation pour une valeur minimale
Figure 8 : Simulation pour une valeur maximale
Pour obtenir et afficher la valeur analogique de la tension on exécute ce code
STM32CubeIDE suivant :
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,100);
readVal=HAL_ADC_GetValue(&hadc1);
HAL_Delay(200);
voltage = (3.6 * readVal) / 4095.0; // conversion de la valeur de l'ADC en tension
HAL_Delay(200);
Lcd_cursor(&lcd, 0,2);
Lcd_string(&lcd, "volt");
Lcd_cursor(&lcd, 1,0);
Lcd_float(&lcd, voltage );
}
/* USER CODE END WHILE */
Simulation du code :
Figure 9 : Simulation du valeur analogique de la tension pour une valeur maximale
On visualise ensuite la tension maximale à l'oscilloscope :
Figure 10 : Visualisation de la tension maximale à l'oscilloscope
[Link] de la température avec le capteur LM35 :
Le capteur de température LM35 est un capteur analogique qui utilise la variation de tension
en fonction de la température pour mesurer la température ambiante. Il est constitué d'une
sonde en silicium qui génère une tension de sortie proportionnelle à la température en degrés
Celsius (°C). La tension de sortie du capteur varie de 10 mV par degré Celsius, ce qui le rend
très précis et adapté à une large gamme d'applications.
Figure 11 : Capteur LM35
Le capteur LM35 peut mesurer des températures allant de -55°C à +150°C, ce qui en fait un
capteur polyvalent pour la mesure de température. La tension de sortie du capteur peut être
directement lue et convertie en température en utilisant un convertisseur analogique-
numérique (CAN) d'un microcontrôleur, comme le STM32F4 dans cet exemple.
Figure 12 : Capteur LM35 sous ISIS
La première étape consiste à sélectionner l'ADC (IN0 et IN1) comme indiqué dans
l'illustration ci-dessous, puis à modifier le prédiviseur d'horloge 'PCLK2 divisé par 4' :
Le nombre de conversions est fixé à 2, comme illustré dans la figure ci-dessous :
Fixer le Rank 1 : channel 1 et le simpling time =480 cycle
et Rank 2 : channel0 et le simpling time =480 cycle
Enable le ADC1 global interrupt :
Puis on exécute le code suivant :
/* USER CODE BEGIN 0 */
void ADC_select_CH1 (void){
ADC_ChannelConfTypeDef sConfig = {0};
[Link] = ADC_CHANNEL_1;
[Link] = 1;
[Link] = ADC_SAMPLETIME_480CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
void ADC_select_CH0(void){
ADC_ChannelConfTypeDef sConfig = {0};
[Link] = 1;
[Link] = ADC_SAMPLETIME_480CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
GPIO_InitTypeDef GPIO_InitStructPrivate={0};
uint32_t previousMillis;
uint32_t currentMillis ;
Lcd_HandleTypeDef lcd;
uint32_t adc_val1,adc_val2;
float cnt;
float pas=3.6/4095;
float temp;
float voltage ;
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_start(&htim1,TIM_channel_1);
//configuration pins lcd
Lcd_PortType ports[] = {D4_GPIO_Port,D5_GPIO_Port,D6_GPIO_Port,D7_GPIO_Port };
Lcd_PinType pins[] = {D4_Pin,D5_Pin,D6_Pin,D7_Pin};
lcd=Lcd_create(ports , pins , RS_GPIO_Port , RS_Pin , E_GPIO_Port , E_Pin, LCD_4_BIT_MODE) ;
Lcd_cursor(&lcd, 0,2);
Lcd_string(&lcd, "volt");
//HAL_TIM_Base_Start_IT(&htim1);
//TIM1->CNT=1;
Lcd_cursor(&lcd,0,0);
Lcd_string(&lcd,"Voltage");
Lcd_cursor(&lcd,2,0);
Lcd_string(&lcd,"Temperature");
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
ADC_select_CH1();
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,100);
adc_val1= HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
Voltage=adc_val1*pas;
Lcd_cursor(&lcd, 1,7);
Lcd_float(&lcd, Voltage );
TIM1->CCR1=adc_val1*0.4884;
ADC_select_CH0();
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,100);
adc_val2= HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop(&hadc1);
Voltage=adc_val2*pas;
Lcd_cursor(&lcd, 2,7);
Lcd_float(&lcd, temp );
/* USER CODE END 3 */
Simulation du code :
Figure 13 : Affichage de la tension et la température par Capteur LM35 sous ISIS
IV. Conclusion:
En conclusion, ce travail pratique a abordé deux aspects importants de l'utilisation des
microcontrôleurs STM32F4 : la configuration et la génération d'un signal PWM à partir d'un
Timer, ainsi que la configuration et l'utilisation d'un convertisseur analogique/numérique
(CAN).