PWM波形生成

背景

方法

定时器

(1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线

(2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线

(3)当APB1和APB2分频数为1的时候,TIM1、TIM8~TIM11的时钟为APB2的时钟,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟;

(4)而如果APB1和APB2分频数不为1,那么TIM1、TIM8~TIM11的时钟为APB2的时钟的两倍,TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍。

对于stm32f407 168M主频,因为系统初始化SystemInit函数里初始化APB1总线时钟为4分频即42M,所以TIM2~TIM7、TIM12~TIM14的时钟为APB1的时钟的两倍即84M;APB2总线时钟为2分频即84M,TIM1、TIM8~TIM11的时钟为APB2时钟的两倍即168M。

descript

基本定时器没有输出pwm波的功能, 只能用通用定时器或者高级定时器来达到生成pwm波效果. 我们选用通用定时器实现。

prescaler

预分频器

Auto Reload Register

自动重装载寄存器

auto-load preload

影子寄存器, 立即生效 or 等待当前轮执行完生效

update-interrupt

一般情况下,我们开启定时器总是要调用中断,所以代码为`HAL_TIM_BASE_Start_IT()`,其中update interrupt会在counter与auto reload register中值相同时触发中断,这样我们就知道达到了我们想要的时间,可以在callback函数中添加我们的功能.

注意:STM32配置TIM后会直接触发一次中断

其中有一些以`__`开头的函数可以更改寄存器的值

counter = __HAL_TIM_GET_COUNTER(&htim10);
__HAL_TIM_SET_PRESCALER(&htim10, prescaler);
__HAL_TIM_SET_AUTORELOAD(&htim10, autoreload);

外部时钟模式

外部时钟模式有外部时钟模式1和外部时钟模式2.

外部时钟模式2直接

注意过滤器(filter)的设置,一般设置为最大值, 也就是15.

PWM波形生成

注意PWM Generation Channel 中 Pulse 为比较寄存器值, 应该小于 auto reload的值. Compare 寄存器含义为低于指定计数次, 高电平; 高于指定计数次, 低电平(PWM mode 1下)

其中常用操作为更改Compare 寄存器值

__HAL_TIM_SET_COMPARE(&htim9, TIM_CHANNEL_1, compareValue);

代码参考: 输出应为1k Hz, 占空比25%

STM32F407NUEDC/PWM at main · Casdos/STM32F407NUEDC (github.com)

参考

https://blog.csdn.net/u014453443/article/details/100101152

posted @ 2024-07-27 15:30  我千五可以  阅读(95)  评论(0)    收藏  举报