Serie STM32CubeMX | Salida PWM

Salida PWM

1. Introducción a PWM

La modulación de ancho de pulso (PWM, Pulse Width Modulation) se abrevia como modulación de ancho de pulso Es una tecnología muy eficaz que utiliza la salida digital de un microprocesador para controlar circuitos analógicos. Es decir, para controlar el ancho del pulso, el principio de PWM es el que se muestra a continuación:

Inserte la descripción de la imagen aquí
En la figura, asumimos que el temporizador está funcionando en modo PWM de conteo progresivo y salida 0 cuando CNT <CCRx, y salida 1 cuando CNT> = CCRx, entonces se puede obtener el diagrama PWM anterior: Cuando CNT <CCRx, salida del puerto IO Nivel bajo; cuando CNT> = CCRx, el puerto IO emite un nivel alto; cuando el valor CNT alcanza ARR, se restablece a cero, y luego vuelve a contar hacia arriba, y se repite a su vez. Cambiar el valor de CCRx puede cambiar el ciclo de trabajo de la salida PWM, y cambiar el valor de ARR puede cambiar la frecuencia de la salida PWM

Hay dos modos de salida: PWM1 y PWM2

Inserte la descripción de la imagen aquí
Polaridad de salida: activa alta y activa baja

2. Diseño de hardware

Este experimento emite la señal PWM a través del canal 1 de TIM3 para controlar el brillo del indicador D7

  • Indicador D7
  • Temporizador TIM3

Inserte la descripción de la imagen aquí
Aquí, dado que el pin correspondiente al canal CH1 de TIM3 es PA6, el LED de la placa de desarrollo no está conectado a PA6. Si desea asignar este canal al puerto IO conectado al LED, debe utilizar la función de reasignación de la función de multiplexación GPIO Reasignar PA6 a PC6

Inserte la descripción de la imagen aquí

3. Diseño de software

3.1 Configuración de STM32CubeMX
  • RCC configura HSE externo, reloj configurado a 72MHz; reloj TIM3 montado en APB1 Time Clocks es 72MHz
  • Seleccione TIM3, configure la fuente del reloj del temporizador en la fuente del reloj interno, configure el canal 1 en el modo PWM (correspondiente al pin PA6 se enciende automáticamente, luego debe seleccionar PC6 TIM3_CH1 para completar la reasignación), elija si desea activar la interrupción del temporizador usted mismo

Inserte la descripción de la imagen aquí

  • El coeficiente de preescalador se establece en 72-1, cuenta hacia arriba y el valor de recarga automática se establece en 500-1, luego la frecuencia del reloj del temporizador es 1MHz, el período del temporizador es 1us y el período de desbordamiento del temporizador (es decir, el período PWM) es 500 * 1 = 500us, la frecuencia de desbordamiento (es decir, frecuencia PWM) es 1 / 500us = 2KHz

  • Seleccione el modo PWM PWM1, el pulso por defecto es 0 y la polaridad PWM está configurada en un nivel bajo (porque el LED está encendido en un nivel bajo)

Inserte la descripción de la imagen aquí

  • Ingrese el nombre del proyecto, seleccione la ruta del proyecto (no chino), seleccione MDK-ARM V5; marque Inicialización de periféricos generados como un par de archivos '.c / .h' por IP; haga clic en GENERAR CÓDIGO para generar el código del proyecto
3.2 Programación MDK-ARM
  • Puede ver la función de inicialización del temporizador en el archivo 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);
}
  • Escriba el código en la función principal para cambiar periódicamente el valor de CCR1 para cambiar el ciclo de trabajo de 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. Descarga la verificación

Después de que la compilación sea correcta, descárguela en la placa de desarrollo, puede ver que la luz indicadora D7 cambia de oscura a brillante y luego de brillante a oscura, mostrando el efecto de respirar la luz.

Supongo que te gusta

Origin blog.csdn.net/Chuangke_Andy/article/details/108590150
Recomendado
Clasificación