Série STM32CubeMX | Sortie PWM

Sortie PWM

1. Introduction à PWM

La modulation de largeur d'impulsion (PWM, Pulse Width Modulation) est abrégée en modulation de largeur d'impulsion.C'est une technologie très efficace qui utilise la sortie numérique d'un microprocesseur pour contrôler les circuits analogiques. C'est-à-dire pour contrôler la largeur d'impulsion, le principe de PWM est le suivant:

Insérez la description de l'image ici
Dans la figure, nous supposons que la minuterie fonctionne en mode PWM comptant, et la sortie 0 lorsque CNT <CCRx, et la sortie 1 lorsque CNT> = CCRx, alors le diagramme PWM ci-dessus peut être obtenu: Lorsque CNT <CCRx, sortie du port IO Niveau bas; lorsque CNT> = CCRx, le port IO émet un niveau haut; lorsque la valeur CNT atteint ARR, il se réinitialise à zéro, puis compte à nouveau et boucle à son tour. La modification de la valeur de CCRx peut changer le cycle de service de la sortie PWM, et la modification de la valeur de l'ARR peut changer la fréquence de la sortie PWM

Il existe deux modes de sortie: PWM1 et PWM2

Insérez la description de l'image ici
Polarité de sortie: actif haut et actif bas

2. Conception matérielle

Cette expérience émet le signal PWM via le canal 1 de TIM3 pour contrôler la luminosité de l'indicateur D7

  • Indicateur D7
  • Minuterie TIM3

Insérez la description de l'image ici
Ici, comme la broche correspondant au canal CH1 de TIM3 est PA6, la LED de la carte de développement n'est pas connectée à PA6. Si vous souhaitez mapper ce canal au port IO connecté à la LED, vous devez utiliser la fonction de remappage de la fonction de multiplexage GPIO Remapper PA6 à PC6

Insérez la description de l'image ici

3. Conception de logiciels

3.1 Paramètres du STM32CubeMX
  • RCC réglé HSE externe, horloge réglée à 72 MHz; l'horloge TIM3 montée sur les horloges APB1 est de 72 MHz
  • Sélectionnez TIM3, réglez la source d'horloge de la minuterie sur la source d'horloge interne, réglez le canal 1 sur le mode PWM (correspondant à la broche PA6 automatiquement activée, vous devez ensuite sélectionner PC6 TIM3_CH1 pour terminer le remappage), choisissez d'activer ou non l'interruption de la minuterie par vous-même

Insérez la description de l'image ici

  • Le coefficient de prédécaleur est réglé sur 72-1, compte vers le haut et la valeur de rechargement automatique est réglée sur 500-1, puis la fréquence d'horloge de la minuterie est de 1 MHz, la période de la minuterie est de 1us et la période de dépassement de la minuterie (c.-à-d. Période PWM) est de 500 * 1 = 500us, la fréquence de débordement (c'est-à-dire la fréquence PWM) est 1 / 500us = 2KHz

  • Mode PWM sélectionnez PWM1, Pulse par défaut sur 0 et la polarité PWM est réglée sur un niveau bas (car la LED est allumée à un niveau bas)

Insérez la description de l'image ici

  • Entrez le nom du projet, sélectionnez le chemin du projet (pas de chinois), sélectionnez MDK-ARM V5; cochez Initialisation des périphériques générés comme une paire de fichiers «c / .h» par IP; cliquez sur GÉNÉRER LE CODE pour générer le code du projet
3.2 Programmation MDK-ARM
  • Vous pouvez voir la fonction d'initialisation de la minuterie dans le fichier tim.c
void MX_TIM3_Init(void)
{
    
    
  TIM_ClockConfigTypeDef sClockSourceConfig = {
    
    0};
  TIM_MasterConfigTypeDef sMasterConfig = {
    
    0};
  TIM_OC_InitTypeDef sConfigOC = {
    
    0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 72-1;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 500-1;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK){
    
    
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){
    
    
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK){
    
    
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){
    
    
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){
    
    
    Error_Handler();
  }
  __HAL_TIM_DISABLE_OCxPRELOAD(&htim3, TIM_CHANNEL_1);
  HAL_TIM_MspPostInit(&htim3);
}
  • Écrivez le code dans la fonction principale pour changer périodiquement la valeur de CCR1 pour changer le cycle de service PWM
int main(void){
    
    
  /* USER CODE BEGIN 1 */
  uint8_t dir = 1;
  uint16_t ledpwmval = 0;
  /* USER CODE END 1 */
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);		//开启定时器PWM输出
  /* USER CODE END 2 */
  while (1){
    
    
    HAL_Delay(10);
		if(dir)
			ledpwmval++;
		else
			ledpwmval--;
		
		if(ledpwmval > 300)
			dir = 0;
		if(ledpwmval == 0)
			dir = 1;
		
		TIM3->CCR1 = ledpwmval;		//更改CCR1的值来改变PWM的占空比
  }
}

4. Télécharger la vérification

Une fois la compilation correcte, téléchargez-la sur la carte de développement, vous pouvez voir que le voyant D7 passe de sombre à clair, puis de clair à sombre, montrant l'effet de la respiration de la lumière

Je suppose que tu aimes

Origine blog.csdn.net/Chuangke_Andy/article/details/108590150
conseillé
Classement