目的
深入了解STM32定时器原理,掌握脉宽调制pwm生成方法。
在STM32F103C8微控制器中,定时器(Timer)模块和PWM(脉冲宽度调制)模块是常用的功能模块之一,常用于控制和计时应用。以下是关于这两个模块的简要解释:
定时器(Timer):
定时器是一个计时器/计数器,它可以用来测量时间间隔、生成延时、执行定时任务等。
STM32F103C8微控制器通常有多个定时器模块,比如通用定时器(TIM1、TIM2、TIM3等)和高级定时器(TIM1)等。
定时器可以配置为不同的工作模式,如计数模式、PWM输出模式、输入捕获模式等。
PWM(脉冲宽度调制):
PWM是一种周期性的数字信号,其脉冲宽度可以通过调整占空比来控制。
在STM32F103C8微控制器中,PWM通常是通过定时器模块来生成的。通过配置定时器的工作模式为PWM输出模式,可以生成PWM信号。
PWM信号在很多应用中被用来控制电机速度、LED亮度、舵机位置等。
实验内容
- 使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。
1.1打开STM32CubeMX新建文件,对相应的输出管脚进行设置
然后生成keil工程
1.2编写keil程序,在相应的文件下添加已下代码。
HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
ledState = !ledState;
}
}
效果如下:
- 接上,采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果;使用Keil虚拟示波器,观察 PWM输出波形。
2.1与上文一样先用STM32CubeMX新建文件,
2.2在keil中编写程序
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
HAL_Delay(200);
}
/* USER CODE END 3 */
效果:
观察波形图
参考博客:
https://blog.csdn.net/Morzart/article/details/134123197