stm32之TIM1和TIM8刹车和死区寄存器TIMX_BDTR

因为要用到这部分功能,所以查阅了相关文档,做了相应的实验,现作一记录;初次写博客,思路有些混乱,见谅!

BDTR寄存器

 主要是MOE,AOE,BKP,BKE,OSSR,OSSI,LOOK,UTG的设置
 ···
 TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = DEADTIME;  

TIM_BDTRInitStructure.TIM_Break  = TIM_Break_Enable;   //使能Break
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;  //Break低有效
TIM_BDTRInitStructure.TIM_AutomaticOutput= TIM_AutomaticOutput_Disable;  //刹车手动恢复

···
下面分别介绍BDRT寄存器各个位的配置:
MOE(main output enable):当刹车输入有效时,该位会被硬件异步清0(异步没搞明白什么意思?)。
0:禁止OC和OCN输出或强制为空闲状态;
1:若设置了相应的使能位(即TIMX_CCER的CCxE、CCxNE),则开启OC和OCN输出
我的理解是即使没有使能break功能,MOE位也应该被初始化为0,
AOE(automatic output enable):TIM_AutomaticOutput,该位的设置与MOE相关
0:MOE位只能被软件置1,
1:MOE被软件置1或者当刹车信号无效后被更新时间自动置1。
也就是说当刹车信号有效时,MOE位被硬件清0,该位若为0,则MOE位只能由软件置1(即使刹车信号出现一次,之后无效,),若AOE位为1,则MOE除了软件置1外,当刹车信号失效时,在下一个更新事件时,MOE会被自动置1。
BKP(break polarity):TIM_BreakPolarity 刹车输入极性
0:低电平有效;
1:高电平有效;
这个好理解,如字面意思。
BKE(break enable):TIM_Break,使能
0:禁止刹车输入
1:使能刹车输入
就是是否启用break功能
OSSR、OSSI
OSSR:设置与MOE相关,即当MOE=1,并且TIM通道为互补输出时有效
0:禁止OC/OCN输出
1:当CCXE或CCXEN=1时,首先开启OC/OCN并输出无效电平,然后OC/OCN使能输出信号等于1,
有个前提就是when inactive,我的理解是当TIM不工作时,
OSSI:用于当MOE=0;并且通道是输出时,也就是当刹车信号有效时,
0:禁止OC/OCN输出(OC和OCN的使能信号等于0)
1:当CCXE或CCXEN=1时,OC/OCN首先输出其空闲电平,然后OC/OCN使能输出信号等于1,
有个表格可以将MOE、OSSI、OSSR三者的配置方式说的很明白。
在这里插入图片描述
其中OIS1和OIS1N输出空闲状态,即空闲状态的电平是可以手动设置的,相关寄存器为TIMx_CR2

刹车中断

当配置好刹车功能后,当出现刹车信号时可以进入相应的BRK_IRQHandler进行刹车后的动作。
中断配置较为简单,设置中断优先级分组,中断优先级,使能中断。

问题

1、当刹车信号有效时,SR寄存器的BIF(break interrupt flag)位会置1,BDTR寄存器的MOE位会被置0,从keil的watch窗口看相关寄存器的值确实变了,但是我用下面语句读寄存器的值时,仍然是以前没有刹车信号时的数据,即BIF仍为0,MOE位仍为1,

value = (MOTOR1_TIM->BDTR) & 0x8000;
g_value = (TIM1->SR) & 0x0080;

让人很不解,待后续解决,也希望能够得到各位的帮助!!!

发布了1 篇原创文章 · 获赞 1 · 访问量 35

猜你喜欢

转载自blog.csdn.net/yaoji1234/article/details/103937394