一、实验任务
深入了解STM32定时器原理,掌握脉宽调制pwm生成方法。
一. 使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。
二. 接上,采用定时器pwm模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整到一个满意效果。使用Keil虚拟示波器,观察 pwm输出波形。
三. 再接上,采用定时器的另外一个通道,编程采集上面的pwm输出信号,获得其周期和脉宽,并重定向输出到串口显示。
二、定时器和PWM
1.定时器介绍
STM32定时器是一种重要的外设,可用于实现定时、计数、捕获、比较和脉宽调制(PWM)等功能。STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM5、TIM6),如下图所示:
基本定时器
基本定时器是一个简单的定时器,通常用于生成精确的时间延迟。它有单个16位计数器,可以通过设置预分频系数实现不同的计数速度。基本定时器通常用于简单的定时任务。
通用定时器
通用定时器是一种更通用功能更强大的定时器,通常用于更复杂的定时和计数任务。STM32系列微控制器通常配备了多个通用定时器,如TIM2、TIM3等。通用定时器具有多个16位或32位计数器,可以通过设置预分频系数和计数周期来实现不同的计数速度和定时精度。
2.定时器的工作原理
定时器可分为四个大部分,分别是:时钟产生部分,时基单元部分,输入捕获部分,输出比较部分。
(1)时钟产生部分可选择四种时钟源:①内部时钟(CK_INT);②外部时钟模式:外部触发输入(ETR);③内部触发输入(ITRx);④外部时钟模式:外部输入脚(TIx)。
(2)时基单元部分包括三个寄存器:
①计数器寄存器(TIMx_CNT):向上计数、向下计数或者中心对齐计数;
②预分频器寄存器(TIMx_PSC):可将时钟频率按1到65535之间的任意值进行分频,可在运行时改变其设置值;
③自动装载寄存器(TIMx_ARR):如果TIMx_CR1寄存器中的ARPE位为0,ARR寄存器的内容将直接写入影子寄存器;如果ARPE为1,ARR寄存器的那日同将在每次的更新时间UEV发生时,传送到影子寄存器;如果TIM1_CR1中的UDIS位为0,当计数器产生溢出条件时,产生更新事件。
(3)输入捕获部分
IC1、2和IC3、4可以分别通过软件设置将其映射到TI1、TI2、TI3和TI4;
4个16位捕捉比较寄存器可以编程用于存放检测到对应的每一次输入捕捉时计数器的值;
当产生一次捕捉,相应的CCxIF标志位被置1;同时如果中断或DMA请求使能,则产生中断或DMA请求。
如果当CCxIF标志位已经为1,当又产生一个捕捉,则捕捉溢出标志位CCxOF将被置1。
3.PWM介绍
STM32PWM模块通常由一个或多个通用定时器(TIM)和相关的GPIO引脚组成。为了配置和控制STM32PWM模块,我们可以使用相应的库函数或直接操作寄存器。主要从频率设置,占空比设置,极性设置,中断使能四个方面来设置PWM。
STM32系列微控制器中一些常用定时器的PWM功能比较:
三、用定时器控制LED周期性闪烁
1.使用STM32CubeMX配置项目
使用STM32F103C8芯片进行实现
2.设置SYS
3.配置GPIO
4.设置TIM2
5.设置TIM3
6.配置NVIC
7.配置USART1
8.编写中断函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt=0;
static uint32_t time_cntck=0;
if (htim->Instance==TIM2)
{
if(++time_cnt >=400)
{
time_cnt =0;
HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
}
if (htim->Instance== TIM3)
{
if(++time_cntck >=1000)
{
time_cntck =0;
HAL_UART_Transmit (&huart1,hel1o,20,100000);
}
}
}
编译烧录,实现效果:
四、使用PWM实现LED闪烁
STM32CubeMX配置在上面的基础上进行一些更改,不用配置TIM3
1.配置TIM2
2.配置时钟
3.编写代码
1.在main.c 设置初始值为10
uint16_t duty_num=10;
2.编写while函数
HAL_Delay(50);
duty_num= duty_num+15;
if(duty_num>500){
duty_num=0;
}
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,duty_num);
编译烧录,实现效果:
4.示波器显示效果
五、总结
此次实验的内容为定时器&PWM应用编程。在这次实验我再次熟悉了STM32的开发环境。hal库的这些工具为STM32的编程提供了便捷的方式,能够轻松配置定时器和PWM参数。这次实验也学习了定时器和PWM的工作原理;如何配置PWM输出,包括设置占空比、频率和极性,以及如何编写中断服务程序,以响应定时器中断或PWM事件。在编程过程中遇到了一些问题,通过csdn的查阅和查阅群里的相关讨论,问题都得到了相应的解决,本次实验使我获益匪浅。
为STM32的编程提供了便捷的方式,能够轻松配置定时器和PWM参数。这次实验也学习了定时器和PWM的工作原理;如何配置PWM输出,包括设置占空比、频率和极性,以及如何编写中断服务程序,以响应定时器中断或PWM事件。在编程过程中遇到了一些问题,通过csdn的查阅和查阅群里的相关讨论,问题都得到了相应的解决,本次实验使我获益匪浅。