目录
一、前言
ARR 即自动重装载值(Auto Reload Register)。相当于一个水杯,水杯容量,水满为一个周期,倒掉重新滴水。它是一个用于指定特定数值的参数,该数值将在特定操作或过程中被自动重新装载或重置,以确保相关功能的持续运行或周期性执行。
“CCRx” 通常指的是捕获 / 比较寄存器 X(Capture/Compare Register X)。相当于刻度线。这些寄存器用于定时器的功能配置,如捕获输入信号、产生输出波形等。
“CNT” 一般指计数器(Counter)。相当于一水滴。它通常用于与定时器相关的操作中,用来记录计数的值。
当CNT小于CCRx时,TIMx,CHx通道输出高电平;
当CNT大于于CCRx时,TIMx,CHx通道输出低电平;
频率=HCLK/(PSC+1)/(ARR+1) 占空比=CCRx/(ARR+1)
占空比:高电平时间/周期总时间
“HCLK” 表示高速内部时钟,“PSC” 表示预分频器值,“ARR” 表示自动重装载值。通过这个表达式可以计算出最终的定时器时钟频率
两个公式要用到3个寄存器,(ARR,PSC)在CUBE中配置,CCRX再程序中设置。
二、代码
实现功能:
按如图配置
定义变量
uint16_t PA6_frq,PA7_frq;
uint16_t PA6_duty=10,PA7_duty=20;
编写执行代码
首先,通过
HAL_TIM_PWM_Start
函数启动了htim16
的通道1
和htim17
的通道1
的 PWM 输出。然后,计算了
PA6
和PA7
的频率,分别与htim16
和htim17
的自动重装载值(ARR
)相关。最后,设置了
TIM16
的通道1
的比较值(CCR1
)为PA6_duty
,以及TIM17
的通道1
的比较值(CCR1
)为PA7_duty
,用于控制 PWM 的占空比。CCR 通过与定时器的自动重装载值(ARR)进行比较来实现输出占空比的控制。当 CCR 的值小于 ARR 时,输出为高电平;当 CCR 的值大于等于 ARR 时,输出为低电平。通过改变 CCR 的值,就可以改变高电平持续的时间,从而实现占空比的调节。
HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);
PA6_frq=80000000/8000/TIM16->ARR+1;
PA7_frq=80000000/4000/TIM17->ARR+1;
TIM16->CCR1=PA6_duty;
TIM17->CCR1=PA7_duty;
显示在LCD上
sprintf(buf," PA6_frq:%dHZ ",PA6_frq);
LCD_DisplayStringLine(Line5,(uint8_t*)buf);
sprintf(buf," PA7_frq:%dHZ ",PA7_frq);
LCD_DisplayStringLine(Line6,(uint8_t*)buf);
sprintf(buf," PA6_duty:%d%% ",PA6_duty);
LCD_DisplayStringLine(Line7,(uint8_t*)buf);
sprintf(buf," PA7_duty:%d%% ",PA7_duty);
LCD_DisplayStringLine(Line8,(uint8_t*)buf);
加入按键效果
当
Key_down
等于 3 时,PA6_duty
增加 10,如果PA6_duty
达到 100,则将其重置为 10,然后更新TIM16
的通道 1 的比较值CCR1
为PA6_duty
。同样,当Key_down
等于 4 时,PA7_duty
增加 20,如果PA7_duty
达到 100,则将其重置为 10,最后更新TIM17
的通道 1 的比较值CCR1
为PA7_duty
。这样就实现了根据按键操作在特定页面调整相应引脚占空比的功能。
if(Key_down==3)//只在第二个页面起作用
{
PA6_duty+=10;
if(PA6_duty==100) PA6_duty=10;
TIM16->CCR1=PA6_duty;
}
if(Key_down==4)//只在第二个页面起作用
{
PA7_duty+=20;
if(PA7_duty==100) PA7_duty=10;
TIM17->CCR1=PA7_duty;
}
三、效果展示
四、代码开源
通过网盘分享的文件:17-TEST8-TIM输出频率和占空比.zip
链接: https://pan.baidu.com/s/1ZJ714mzwAfbtY3f0-kFBFw?pwd=0820 提取码: 0820