STM32CUBEMX配置教程(五)高级定时器输出两路PWM波
STM32CUBEMX配置教程(五)高级定时器输出两路PWM波基于STM32H743VI使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我这个大萌新给广大小萌新提供一些学习帮助。PWM常常用于数字控制领域,在电机控制、数字电源等等方面运用广泛。本次配置的工程链接在最下方,有需要自取。0基础可以从第一个
STM32CUBEMX配置教程(五)高级定时器输出两路PWM波
基于STM32H743VI
使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我这个大萌新给广大小萌新提供一些学习帮助。
PWM常常用于数字控制领域,在电机控制、数字电源等等方面运用广泛。
此次工程效果:产生两路100HZ,但是占空比不同的PWM信号。
本次配置的工程链接在最下方,有需要自取。
0基础可以从第一个教程开始阅读
STM32CUBEMX配置教程(一)基础配置
STM32CUBEMX配置教程(二)时钟等内部参数配置
STM32CUBEMX配置教程(三)通用GPIO配置
STM32CUBEMX配置教程(四)定时器中断配置
1 新建工程
2 修改时钟树
3 PWM理论介绍
STM32内部PWM产生器是由计数器和比较器组成。
脉冲宽度调制是一种模拟控制方式。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
4 定时器PWM产生配置
只有通用或高级定时器具有硬件的PWM产生功能(不是那种在定时器中断里面改变IO状态的低效方式)。
在此使用定时器TIM1作为PWM产生时钟,先在cubemx中的左侧找到Timers选项并选中TIM1。
此时上图中右上角有许多参数可以配置,但是右下角一片空白。这个时候定时器没有打开,要打开定时器需要先为定时器配置时钟源。此处配置从上往下数第三个参数Clock Source为内部时钟源,即为Internal Clock。选择后右下角出现相关配置:
在此需要产生两路PWM信号,每路PWM信号需要占用定时器通道,在此将定时器通道1和通道2配置为PWM输出口,如下图所示,此时引脚分配图上也会有相关显示,即两个通道绑定到了PE9和PE11:
下面进行定时器分频系数和计数周期的配置,以控制PWM的频率,在此需要产生100HZ的方波。需要对定时器的配置进行调整,配置界面为:其中参数含义分别为:
Prescaler 分频系数
Counter Mode 计数模式(分为向上和向下)
Count Period 计数周期
Interal Clock Division 内部时钟分频
auto-reload preload 自动重装载
TRGO Event Selection 触发事件
还有很多的参数在下面暂时用不到不介绍了
其中分频系数和计数周期较为常用,可用于设置定时器溢出时间,一般来说溢出也代表定时器中断的产生(如果配置了中断)。溢出时间计算公式如下:
上面那个公式中arr为Count Period的设置数值,psc为Prescaler的设置数值。
Tclk为定时器挂载的时钟线的频率。对于STM32H743而言最高为240Mhz(根据自己的设置有关),不记得可以看看自己配置的时钟树。
下图中的TO APB1 Timer clocksClocks和TO APB2 Timer clocksClocks都是240Mhz。(虽然TIM6挂在哪个总线上忘记了,但是这里只有240M,有知道的小伙伴可以评论留言)。
如果我想要产生100HZ方波,那么需要配置溢出时间为10ms(100HZ的周期为10ms)。
则可以选择配置psc为2399,arr为999
那么溢出时间公式为:
2400*1000/240(us)=10ms
按照上述计算结果进行配置,其他参数不用改即可
那么配置完成。
5 主函数调用案例
主要使用的函数如下:
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//启动定时器1的PWM通道1
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);//启动定时器1的PWM通道2
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,500);//设置占空比50%
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,500);//设置占空比50%
为什么__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,500)这个函数就可以设置占空比为50%呢?
因为我们配置了arr为999,也就是这个计数周期值为999:
想要50的占空比只要让__HAL_TIM_SET_COMPARE()中参数的值为999的一半(约等于500)就可以了。
如果我之前设置了psc为239,arr为9999
那么溢出时间依旧为:
240*10000/240(us)=10ms
但是此时我需要产生占空比50的PWM则需要设置__HAL_TIM_SET_COMPARE()的参数为5000。
此处给出主函数(函数中两路PWM占空比分别为30和70,arr为999):
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,300);//百分之30
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,700);//百分之70
while (1)
{
}
}
看看效果图片:
工程链接:https://download.csdn.net/download/weixin_44584198/20598491
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)