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:
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
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
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
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
-
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)
- 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.