Modifications

Sauter à la navigation Sauter à la recherche
795 octets ajoutés ,  8 février 2021 à 21:17
Ligne 99 : Ligne 99 :     
==PWM et servos==
 
==PWM et servos==
===Prerequis===
+
===Prérequis===
 
* Carte STM32 NUCLEO-F446RE
 
* Carte STM32 NUCLEO-F446RE
 
* STM32 CubeIDE
 
* STM32 CubeIDE
Ligne 112 : Ligne 112 :  
# D'après la [https://www.st.com/resource/en/datasheet/stm32f446re.pdf documentation] du microcontrôleur (p.16) nous voyons que le timer 2 est connecté au bus APB1. [[Fichier:PWM4.png|sans_cadre|centré|300px]] et d'après la vue précédente, les timers de APB1 tournent à 90 MHz (x2 de APB1 peripheral clocks). [[Fichier:PWM5.png|sans_cadre|centré|300px]]
 
# D'après la [https://www.st.com/resource/en/datasheet/stm32f446re.pdf documentation] du microcontrôleur (p.16) nous voyons que le timer 2 est connecté au bus APB1. [[Fichier:PWM4.png|sans_cadre|centré|300px]] et d'après la vue précédente, les timers de APB1 tournent à 90 MHz (x2 de APB1 peripheral clocks). [[Fichier:PWM5.png|sans_cadre|centré|300px]]
 
# Revenant sur la configuration du TIM2, nous devons configurer le registres ‘’Prescaler’’ et ‘’Counter Period’’ pour régler la fréquence du signal généré d'après la formule suivante : f_PWM = f_APBx_timer/((PSC+1)*(CounterPeriod+1)). Pour arriver à une fréquence de 50 Hz, nécessaire pour piloter un servomoteur analogique, nous pouvons entrer les valeurs suivantes: [[Fichier:PWM6.png|sans_cadre|centré|300px]]
 
# Revenant sur la configuration du TIM2, nous devons configurer le registres ‘’Prescaler’’ et ‘’Counter Period’’ pour régler la fréquence du signal généré d'après la formule suivante : f_PWM = f_APBx_timer/((PSC+1)*(CounterPeriod+1)). Pour arriver à une fréquence de 50 Hz, nécessaire pour piloter un servomoteur analogique, nous pouvons entrer les valeurs suivantes: [[Fichier:PWM6.png|sans_cadre|centré|300px]]
 +
===Programmation===
 +
Accéder au fichier main.c (‘’Core/Src/main.c’’). Ajouter les lignes suivantes pour démarrer la génération du PWM et contrôler son rapport cyclique (entre les balises /* USER CODE 2 */ ). 
 +
<syntaxhighlight lang="cpp">
 +
int __io_putchar(int ch)
 +
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
 +
htim2.Instance->CCR1 = 1000; // 10000/20000 = 0.5 (duty cycle)
 +
</syntaxhighlight>
 +
 +
# Vous pouvez également utiliser la fonction ‘’HAL_TIM_PWM_Stop’’ pour arrêter le signal.
 +
# Le rapport cyclique est égal au rapport CCRx/CounterPeriod. CounterPeriod nous avons fixé, mais nous pouvons changer le registre CCR1. CCR1=10000 règle le rapport à 0.5 ou 50% dans ce cas.
 +
# Vous pouvez utiliser la ligne suivante pour piloter un servo de 270°. CCR1 = 200*(2.5+deg/27)
    
==Porter une bibliothèque==
 
==Porter une bibliothèque==

Menu de navigation