本节是介绍如何使用CubeMX配置STM32的通用定时器TIM2,实现PWM输出,并通过Keil观察波形。
关键词:通用定时器TIM2 PWM Keil虚拟示波器
开发环境:CubeMX+MDK5.27
芯片型号:STM32F103ZET6
时间:2020/07/14
简介:在定时器的第一节,我们介绍到通用定时器的功能有:定时、输出比较、输入捕获。本节我们使用其输出比较功能中的PWM输出模式,输出一个PWM波。
PWM波:又称方波,其波形图如图所示
3.3V对应的刻度我们把它称为高电平,而0V对应的刻度就是低电平。那么方波的一个周期就是图中Ton的长度加上Toff的长度,PWM的周期我们又称为脉冲宽度,高电平维持时间与总周期时间的比值我们称为占空比(Duty)。很明显图中高电平维持时间和低电平维持时间是相同的,那么占空比就是50%
了解了PWM波之后,我们再来了解通用定时器TIM2的输出比较功能,首先我们来看输出比较初始化的结构体
这个结构体中有7个成员变量,但与PWM功能相关的有四个,分别是OCMode、Pulse、OCPolarity、OCFastMode
这里是OCMode所有的取值类型,我们只需要两种PWM模式,其他的用的不多,可在需要时再研究。
TIM_OCMODE_PWM1代表PWM模式1,在该模式下,进行递增计数时,当TIM_CNT
结构体中的OC_Polartiry代表着有效电平的极性,当其取TIM_OCPOLARITY_HIGH则表示输出有效电平为高电平
当其取TIM_OCPOLARITY_LOW则表示输出有效电平为低电平。
结构体中的OCFastMode代表着快速输出模式,这个保持默认配置即可,默认是不开启快速输出模式的。
实现步骤
第一步,CubeMX配置定时器2,使用PWM模式1,计数模式为增计数模式,有效电平为高电平,即当计数值<比较值,输出高电平,计数器>比较值,输出低电平。假定输出PWM波的频率为1KHZ,占空比50%.根据上一节总结的公式,T=(prescaler + 1) * (counter period + 1) / TIM_Clock = 1ms = 1/1000s
因此我们取prescaler=72-1 counter period = 1000-1,即T=72*1000/72000000=1/1000s
知道了脉冲宽度,我们就根据占空比,反向计算出比较值,TIM_CRR = 50% * counter period = 500
具体配置如图
配置完后,查看Pinout View可以看到PA15引脚变成了绿色,且Label编程了TIM2_CH1,这表示PA15引脚对应着定时器2的通道1,最终PWM波也是通过该引脚输出。如果你选择的是别的通道,那么就是通道对应的引脚输出PWM波。
第二步,编写代码,非常简单只需要在main.c的USER CODE BEGIN 2下添加以下代码**
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);//启动定时器2
第三步、使用Keil的虚拟示波器观察PA15引脚输出的PWM波
点击魔术棒,将debug选项进行修改
勾选Use Simulator选项表示使用仿真器。注:左下角的两个参数Dialog DLL和Parameter也要修改,如图
Parameter参数里要修改为自己开发板对应的型号,Dialog.DLL要改成DARMSTM.DLL才能正常使用。
接下来点击调试按钮,如图所示
这个像放大镜一样的图标就是调试按钮,点击它可以进入调试界面,再点击就推出调试界面,调试界面如图
找到Logic Analyzer选项并点击它,如图所示
打开Logic Analyzer后如图所示,点击Logic Analyzer窗口左上角的setup
点击setup,会出现如图所示的窗口
点击箭头所指的按钮,就可以在框中输入要观察的引脚,例如本节通过PA15输出PWM波,因此我们输入PORTA.15然后回车即可,接着鼠标选中刚刚添加的待分析信号,此时下方灰色的选项就可以更改了。如图
更改Display Type为Bit,Color我选择红色,便于观察。配置完成后,点击Close,可以发现Logic Analyzer窗口左侧多了刚刚我们添加的引脚,如图
接着我们点击全速运行按钮,就可以观察到波形了!如图
如果波形变化较快,可以点击红色的Stop按钮,观察静止的波形,更多功能在此就不详细介绍,可以自行摸索!