58人参与 • 2024-08-06 • stm32
定时器可以设置主从关系,简单来说就是可以用主定时器控制从定时器,这个过程可以套娃,如:从定时器可以控制从从定时器。
主从模式定时器内部连接图(每款芯片可能有所不同,具体参见自己芯片手册):
定时器内部触发连接源,例:若从定时器为tim2,主定时器为tim1,那么触发源为tr0。
这里我构想了两种方法,方法一仅作参考,推荐方法二,效果更好。
以两pwm相位相差180°,两pwm占空比任意可调为例:
这里使用了三个定时器,tim1为主定时器,tim2为从定时器。tim3为从从定时器。tim1与tim3所成pwm为最后所需要的,tim2起到相位调节的作用。当tim1产生上升沿时,tim2开始计时,当tim2计时到周期的一半时(即为180°相位值时,换个意思也就是时间差,这里时间差为周期一半,也就是tim2产生占空比为50%的pwm)产生pwm,tim2的上升沿被tim3检测到后,tim3开始产生pwm,占空比任意。这样就可以实现两任意相位,任意占空比的pwm。
以stm32f407zgt6为例(其他型号类似),实现双pwm相位差为180°(若需其他相位更改tim2占空比就行了!),占空比任意。
配置时钟树,我这里配置时钟为80mhz
只用了1个通道,配置为pwm输出模式,内部时钟
因为前面时钟为80mhz,故预分频79,时钟周期1000,pwm频率:80mhz/(79+1)/1000=1khz,
设置触发输出使能,通道一比较输出(重要!!!)、pwm模式1,pulse为300(占空比为300/1000=30%)
定时器二模式设置为触发模式、触发源根据前言中的表可以得到为itr0,选择内部时钟,通道1输出pwm。预分频为79,计数周期为1000,设置触发输出使能,通道一比较输出、pwm模式2(pwm模式2重要!!!),pulse为500(占空比为500/1000=50%,也就是相位为180°)
配置和tim2一样,只是触发源由表得为itr1,因为后面没有从定时器了,故不再配置触发输出了,这里为pwm模式1,占空比参数随便设为200(200/1000=20%)
主程序添加:
hal_tim_pwm_start(&htim1,tim_channel_1);
hal_tim_pwm_start(&htim2,tim_channel_1);
hal_tim_pwm_start(&htim3,tim_channel_1);
记得魔术棒里设置下载复位,或者手动复位。
这里tim1与tim3所成波形为所需结果。
黄色为tim1,当tim1产生上升沿,tim2开始计时,当达到180°(周期一半,即占空比50%)时,开始产生pwm,tim1与tim2周期一致。
黄色色为tim3,当tim2开始产生上升沿时,tim3被触发,产生pwm
tim1与tim3为所需结果,周期相同,相位相差180°,占空比随便设置的,可以在cube里面调,或者用函数调。
如图所示,两个目标pwm相位差在180°,但是在实际应用中可能存在一定误差,因此想了第二种方法。
需要产生两个pwm相位任意差,占空比和频率可调。同样使用3个主从定时器,1个定时器用来定时,2个定时器来产生pwm。因为相位改变本质是改变信号的初始时间,当延时初始时间占周期时间一半,则相位差为180°。需要多少相位差,则据公式:相位差=延时/周期。
配置时钟树,据所需配置,如80mhz
配置定时器1产生pwm,内部时钟源,预分频80-1,计数周期100-1,占空比10%
主定时器用于定时初始开始时间,当定时时间达到触发从定时器产生pwm。以相位相差180°为例,那么时间差则因为pwm周期的一半。在tim1中配置计数周期为100-1,要一半则为50-1,如下图所示:
配置内部时钟,不选择通道只计时,预分频79(需与上面定时器相同!),触发模式设置为更新事件(就是计数达到了事件进行更新触发从定时器产生pwm)。
当上面主定时器达到时间时,触发从定时器tim3产生pwm。配置为触发模式,内部时钟,通道为pwm模式,触发源根据上面表格或者芯片手册可得为itr1,预分频、计数周期与tim1的相同,占空比根据自己需要填,如10%
生成代码并在main函数里添加
hal_tim_pwm_start(&htim1,tim_channel_1);
hal_tim_base_start(&htim2);
hal_tim_pwm_start(&htim3,tim_channel_1);
验证结果:
可见,两个pwm的相位相差为一半,即180°,若需要其他相位只需更改tim2中的计数值就行了。
通过第二种方法配置好并添加启动程序后,相位的确是我们所需要的相位了,但是有些情况下我们又需要去在程序中修改pwm的频率、相位以及占空比的大小。而在这里,我们就会用到几个常用函数:
至于如何在程序中使用上面函数修改相关值大小,需要弄清楚定时器产生pwm以及其定时原理,然后根据需要设定相应的计数器值和预分频值。定时器原理可以参考下面两篇文章:
【1】stm32 pwm基本知识及配置过程_stm32 pwm配置-csdn博客
【2】stm32定时器详解_stm32通用定时器基本定时器-csdn博客
注意:在使用以上函数修改相关值时,需要注意时序!!!如下图所示:
当从某时写入新的值时,并不是立马完成数据更改, 而是等计数器计数值满归零时才开始运行新的数据。所以,为了保证时序的准确,最好是加一个延时等待计数器时序上的更新。
1.ocxref指通道x,这里定时器有四个通道
2.同一个定时器共用一个计时器,即同一个定时器的4个输出通道的频率(周期)相同
3.tim1_ch1n与tim1_ch1是互补意思
4.pwm 模式一:初始为高电平,立即触发;pwm模式二:初始为低电平,等高电平再触发
声明:本文为作者学习记录,由于知识有限,存在各种不足,望谅解!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论