STM32CUBEMX配置教程(六)高级定时器单通道输出互补PWM波(带死区和刹车)
STM32CUBEMX配置教程(六)高级定时器单通道输出互补PWM波(带死区和刹车)基于STM32H743VI使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我这个大萌新给广大小萌新提供一些学习帮助。PWM常常用于数字控制领域,在电机控制、数字电源等等方面运用广泛。此次工程效果:产生两路互补的100H
STM32CUBEMX配置教程(六)高级定时器单通道输出互补PWM波(带死区和刹车)
基于STM32H743VI
使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些要点总是会有些遗忘,因此写下这一系列教程以供记忆,顺便让我这个大萌新给广大小萌新提供一些学习帮助。
PWM常常用于数字控制领域,在电机控制、数字电源等等方面运用广泛。
此次工程效果:产生两路互补的100HZ的PWM波。
部分参考:STM32F407配置STM32CubeMX通过高级定时器TIM8产生PWM互补输出(带死区和刹车)实验
本次配置的工程链接在最下方,有需要自取。
0基础可以从第一个教程开始阅读
STM32CUBEMX配置教程(一)基础配置
STM32CUBEMX配置教程(二)时钟等内部参数配置
STM32CUBEMX配置教程(三)通用GPIO配置
STM32CUBEMX配置教程(四)定时器中断配置
STM32CUBEMX配置教程(五)高级定时器输出两路PWM波
1 新建工程
2 修改时钟树
3 PWM理论介绍
STM32内部PWM产生器是由计数器和比较器组成。
脉冲宽度调制是一种模拟控制方式。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。
脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
4 定时器互补PWM产生配置
只有通用或高级定时器具有硬件的PWM产生功能(不是那种在定时器中断里面改变IO状态的低效方式)。
在此使用定时器TIM1作为PWM产生时钟,先在cubemx中的左侧找到Timers选项并选中TIM1。
此时上图中右上角有许多参数可以配置,但是右下角一片空白。这个时候定时器没有打开,要打开定时器需要先为定时器配置时钟源。此处配置从上往下数第三个参数Clock Source为内部时钟源,即为Internal Clock。选择后右下角出现相关配置:
在此需要产生两路PWM信号,每路PWM信号需要占用定时器通道,在此将定时器通道1配置为互补输出模式,如下图所示,此时引脚分配图上也会有相关显示,其中CH1为PWM输出,CH1N为互补输出。
下面进行定时器分频系数和计数周期的配置,以控制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 主函数调用案例
主要使用的函数如下:
/* 定时器通道1输出PWM */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
/* 定时器通道1互补输出PWM */
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
//占空比百分之30
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,300);
为什么__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,300)这个函数就可以设置占空比为30%呢?
因为我们配置了arr为999,也就是这个计数周期值为999:
想要30的占空比只要让__HAL_TIM_SET_COMPARE()中参数的值为999的0.3倍(约等于300)就可以了。
如果我之前设置了psc为239,arr为9999
那么溢出时间依旧为:
240*10000/240(us)=10ms
但是此时我需要产生占空比30的PWM则需要设置__HAL_TIM_SET_COMPARE()的参数为3000。
此处给出主函数(占空比30%,arr为999):
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
/* 定时器通道1输出PWM */
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
/* 定时器通道1互补输出PWM */
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
//百分之30
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,300);
while (1)
{
}
}
看看效果图片,两个PWM严格互补,相加为3.3V,与STM32CUBEMX配置教程(五)高级定时器输出两路PWM波中两个通道产生的30%和70%的PWM波相差很大。
5 刹车与死区配置
此部分参考:
将以下这个选项设置为Activate Break Input,即为允许刹车。
在配置完成后右侧IO图上会出现刹车信号输入口,TIM1_BKIN就是:
在配置中这个地方可以配置低电平刹车还是高电平刹车,
此处配置为:
然后是死区配置;
第五部分参考:STM32F407配置STM32CubeMX通过高级定时器TIM8产生PWM互补输出(带死区和刹车)实验
工程链接:https://download.csdn.net/download/weixin_44584198/20600103
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)