Formation STM32 PWM
PWM
I. introduction
Dans cette manipulation on va voir la configuration nécessaire pour générer un signal
PWM. On va générer deux signaux complémentaires pour commander un onduleur et deux
autres indépendants. La largeur d’impulsion et définie comme suit :
Largeur PWM (us) = PULSE *(PRESC+1)/ Fapb(MHZ)
Avec PULSE, PRESC sont des valeurs à écrire dans les registres.
Généralement la largeur d’impulsion est exprimée en pourcent, la valeur numérique
écrite dans le registre
PULSE=largeur de PWM(en %)*valeur ARR
Avec PSC=2
II. Manipulation
1. Sorties PWM complémentaire
Le timer utilisé sera TIM1
Dans le menu pinnout on active TIM1 et on sélectionne CHANNEL 2 comme PWM
Génération CH2 CH2N, PE11 et PB0 seront des sorties complémentaires. De même on
fait à Channel 3. PE13 et PB1 seront des sorties complémentaires aussi.
2. Sortie PWM indépendante
Le timer utilisé sera TIM12
MAHER Boumiza Page 1
Formation STM32 PWM
Les sorties sont PB15 et PB14
• Sortie complémentaire
Onglet configuration menu control on sélectionne TIM1
MAHER Boumiza Page 2
Formation STM32 PWM
Prescaler : pré-diviseur noté précédemment PRESC
Counter Period : période du signal
Internal clock division : pour calcul du temps mort.
Automatic output State : l’état des pins reflète l’état de ces bits correspond dans le
registre
Off State Selection for Run mode / Off State Selection for idle mode : l’état des pins
dans le fonctionnement normale et en état d’arrêt, est définit par le registre.
Dead Time : valeur du temp mort qui est calculé comme suit :
il faut tout d’abord paramètrer Internal Clock Division (CKD) comme suit :
La valeur de temps mort DT est exprimé en fonction du nombre d’impulsion d’horloge
comme suit :
MAHER Boumiza Page 3
Formation STM32 PWM
Pulse : largeur d’impulsion du signal note précédemment PULSE.
Mode : PWM1
CH polarity : high, si le bit est actif il sera à 3.3V
CHN polarity : high si le bit est actif le signal sera à 0V
CH Idle state/CHN Idle state : au repos les deux sortie seront a l’état reset.
• Sortie indépendante
On configure les largeurs d’impulsion pour chaque sortie PWM.
MAHER Boumiza Page 4
Formation STM32 PWM
III. Fonction a utilisé
Lancement du timer en mode PWM
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
Arrêt du timer en mode PWM
HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
Lancement du timer en mode PWM avec génération d’interruption
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
Arrêt du timer en mode PWM avec interruption
HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
Le variable channel peut prendre l’un des valeurs suivant
TIM_CHANNEL_1 : TIM Channel 1 selected
TIM_CHANNEL_2 : TIM Channel 2 selected
TIM_CHANNEL_3: TIM Channel 3 selected
TIM_CHANNEL_4 : TIM Channel 4 selected
HAL_StatusTypeDef
HAL_OK = 0x00
HAL_ERROR = 0x01
HAL_BUSY = 0x02
HAL_TIMEOUT = 0x03
IV. Tips
Pour changer la largeur d’impulsion on agissant directement sur le registre
TIMx->CCRx=valeur
Pour changer la valeur du temps mort
TIMx->BDTR=valeur
x : numéro du timer en mode PWM
MAHER Boumiza Page 5
Formation STM32 PWM
Si il ya un problème de génération de signaux PWM complémentaires on a joute cette
instruction
Channel 1 complémentaire TIM (1ou 8) ->CCER=0x0005
Channel 2 complémentaire TIM (1ou 8) ->CCER=0x0050
Channel 3 complémentaire TIM (1ou 8) ->CCER=0x0500
Pour activer plus Qu’une chaine on fait un ou logique entre les valeurs e.g channel
1+3 en PWM complémentaire
TIM(1 ou 8) ->CCER+0X0505
MAHER Boumiza Page 6