目录
四、采用定时器pwm模式,让 led 以呼吸灯方式渐亮渐灭,周期为1~2秒
一、定时器
1.定时器模块的功能
stm32定时器模块主要有计数、定时、输入捕获、输出比较这四个功能。其中:
计数:脉冲计数,使用使用微控制器内部的外部时钟(pclk)来计数,是对固定周期的脉冲信号计数。
定时:时间控制,通过对微控制器内部的时钟脉冲进行计数实现定时功能。
输入捕获:对输入信号进行捕获,实现对脉冲的频率测量,可用于对外部输入信号脉冲宽度的测量,比如测量电机转速。
输出比较:将计数器计数值和设定值进行比较,根据比较结果输出不同电平,用于控制输出波形,比如直流电机的调速。
2.stm32定时器类别
stm32定时器主要分为基本定时器、通用定时器和高级定时器。
下面是stm32定时器的分类比较表:
定时器 | 基本定时器**(tim6、tim7)** | 通用定时器**timx(x=2~5)** | 高级定时器**(tim1、tim8)** |
---|---|---|---|
计数器类型 | 16**位,向上** | 16**位,向上、向下、向上/向下** | 16**位,向上、向下、向上/向下** |
预分频系数 | 1**~65535之间的任意数** | 1**~65535之间的任意数** | 1**~65535之间的任意数** |
输入**/捕获通道** | 无 | 四个独立通道:输入捕获、输出比较、**pwm生成、单脉冲模式输出** | 四个独立通道:输入捕获、输出比较、**pwm生成、单脉冲模式输出** |
产生中断**/dma** | 可以 | 可以 | 可以 |
刹车(电机控制) | 无 | 无 | 可以 |
3.通用定时器
stm32通用定时器timx(x=2,3,4,5)主要由时钟源、时钟单元、捕获和比较通道等构成,核心是可编程预分频驱动的16位自动装载计数器。
(1)时钟源
当定时器使用内部时钟时,定时器的时钟源统称为timxclk。timxclk的系统默认的时钟频率为72mhz,但其时钟来源并不相同。
定时器tim2~tim7挂接在apb1上定时器tim1和tim8挂接在apb2上。
若外部晶振的频率为8mhz,则系统默认的时钟频率为72mhz
apb1预分频器的分频系数设置为2,则pclk1=36mhz;
apb2预分频系数设置为1,则pclk2=72mhz,tim1和tim8的时钟频率timxclk=72mhz;
cortex系统时钟由ahb时钟(hclk)8分频得到,即systick的频率为9mhz。
(2)预分频器psc
可以以1~65535之间的任意数值对时钟源ck_psc的时钟频率进行分频,输出ck_cnt脉冲供计数器cnt进行计数。
(3)计数器cnt
timxcnt是一个16位的寄存器,计数范围为1~65535,可以向上计数、向下计数或向下向上双向计数。
要得到想要的计数值,需要对输入时钟频率进行分频。
当计数值达到设定值时,便产生溢出事件,溢出时产生中断或dma请求,然后再由自动装载寄存器进行重新加载或更新。
计数器溢出中断属于软件中断,执行相应的定时器中断服务程序。
(4)自动装载寄存器arr
定时器的定时时间主要取决于定时周期和预分频因子,计算公式为:定时时间=(arr+1)×(预分频值psc+1)/输入时钟频率或 t=(tim_period +1)*(tim_prescaler +1)/timxclk这里arr+1是因为计数器都是从0开始计数的。
二、pwm
pwm是一种利用脉冲宽度即占空比实现对模拟信号进行控制的技术,即是对模拟信号电平进行数字表示的方法。
1.工作原理
stm32的定时器除了tim6和tim7,其他定时器都可以用来产生pwm输出。
通用定时器能同时产生多达4路的pwm输出。
stm32中每个定时器有4个输入通道:timx_ch1~timx_ch4;每个通道对应1个捕获/比较寄存器timx_crrx,将寄存器值和计数器值相比较,通过比较结果输出高低电平,从而得到pwm信号。
在pwm的一个周期内,定时器从0开始向上计数,在0-t1时间段,定时器计数器timx_cnt值小于timx_ccrx值,输出低电平;
在t1-t2时间段,定时器计数器timx_cnt值大于timx_ccrx值,输出高电平;
当定时器计数器的值timx_cnt达到arr时,定时器溢出,重新从0开始向上计数,如此循环。
2.pwm标准外设库输出配置
首先配置pwm输出通道,开启tim3时钟:
stm32规定了具体的引脚作为pwm输出引脚,选择不同的引脚时,还必须使用重定向功能(remap)
定时器tim1的引脚复用功能映像:
复用功能 | tim1_remap[1:0] = 00**(没有重映像)** | tim1_remap[1:0] = 01**(部分重映像)** | tim1_remap**[1:0] = 11(完全重映像)** (1) |
---|---|---|---|
tim1_etr | pa12 | pe7 | |
tim1_ch1 | pa8 | pe9 | |
tim1__ch2 | pa9 | pe11 | |
tim1_ch3 | pa10 | pe13 | |
tim1_ch4 | pa11 | pe14 | |
tim1_bkin | pb12(2) | pa6 | pe15 |
tim1_ch1n | pb13(2) | pa7 | pe8 |
tim1_ch2n | pb14(2) | pb0 | pe10 |
tim1_ch3n | pb15(2) | pb1 | pe12 |
定时器tim2的引脚复用功能映像:
复用功能 | tim2_remap**[1:0]=00(没有重映像)** | tim1_remap**[1:0]=01(部分重映像)** | tim1_remap[1:0]=10 (**部分重映像)** (1) | tim1_remap[1:0]=11**(完全重映像)** (1) |
---|---|---|---|---|
tim2_ch1_etr**(2)** | pa0 | pa15 | pa0 | pa15 |
tim2_ch2 | pa1 | pb3 | pa1 | pb3 |
tim2_ch3 | pa2 | pb10 | ||
tim2_ch4 | pa3 | pb11 |
定时器tim3的引脚复用功能映像:
复用功能 | tim3_remap[1:0] = 00**(没有重映像)** | tim3_remap[1:0] = 10**(部分重映像)** | tim3_remap[1:0] = 11**(完全重映像)** (1) |
---|---|---|---|
tim3_ch1 | pa6 | pb4 | pc6 |
tim3_ch2 | pa7 | pb5 | pc7 |
tim3_ch3 | pb0 | pc8 | |
tim3_ch4 | pb1 | pc9 |
三、用定时器计数方式,控制led以2s的频率周期性亮灭
使用stm32f103的 tim2~tim5其一定时器的某一个通道pin(与gpiox管脚复用,见下图),连接一个led,用定时器计数方式,控制led以2s的频率周期性地亮-灭。
1.stm32cube配置
(1)gpio配置
(2)rcc配置
(3)sys配置
(4)tim2配置
(5)clock配置
(6)项目配置
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;
}
}
3.实验结果
四、采用定时器pwm模式,让 led 以呼吸灯方式渐亮渐灭,周期为1~2秒
接上,采用定时器pwm模式,让 led 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果;使用keil虚拟示波器,观察 pwm输出波形。
1.stm32cube配置
(1)rcc配置
(2)sys配置
(3)tim3配置
(4)gpio配置
2.keil代码编写
在main.c中对应位置添加下面的代码:
/* 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 */
3.程序烧录及实验结果
4.keil波形图查看
波形图如下:
发表评论