STM32的定时器里面有个EGR寄存器,他的作用就是生事,没事找事.只要给EGR对应的位置位,他就会生事.生成EVENT只影响中断,不影响波形发生.
实际上有这么几个函数,只要执行后,立马中断,不影响引脚变化.
LL_TIM_GenerateEvent_BRK(TIM1); LL_TIM_GenerateEvent_CC1(TIM1); LL_TIM_GenerateEvent_CC2(TIM1); LL_TIM_GenerateEvent_CC3(TIM1); LL_TIM_GenerateEvent_CC4(TIM1); LL_TIM_GenerateEvent_COM(TIM1); LL_TIM_GenerateEvent_TRIG(TIM1); LL_TIM_GenerateEvent_UPDATE(TIM1);
死区控制,是电机中控制的一个关键,特别指的是下图这种.
顺序把左下编号为Q,左上Q2,右上Q3,右下Q4,用CH1和CH1N两个通道,刚开始我还郁闷,CH1和CH1N不就是反向吗,用个非门不好吗,后来发现不是这样的,比如CH1为高的时候,CH1N应该是低,Q1,Q3导通.当反过来时候,CH1为低,Q2导通,这时候CH1N为高,Q4导通,这貌似没问题.但是管子是有反应时间的,切换时候,可能导致Q1,Q2同时导通,然后电流过大,然后就炸管了.如果现在CH1是LOW,然后把CH1N也换成LOW一段时间,这样不就完全断开了?是的,这就是所谓死区时间.
一条语句就可以插入死区时间,默认没有死区时候是突变的.
我们插入了很夸张的死区时间,长达5us,什么管子都来得及反应了.
LL_TIM_OC_SetDeadTime(TIM1, __LL_TIM_CALC_DEADTIME(SystemCoreClock, LL_TIM_GetClockDivision(TIM1), 5000));
然后他们就产生了前后5us的死区时间.
这时候管子不会直接VCC-GND的短路.另外还有Break Input,也是对电机的一些高级功能.他需要一个引脚来捕获,用于紧急停止.
紧急引脚就是说,给他输入高或者低时候,让输出紧急停止.如下代码设定为紧急引脚为高时候停止一切.
/********************************/ /* Break function configuration */ /********************************/ /* Break input configuration: */ LL_TIM_ConfigBRK(TIM1, LL_TIM_BREAK_POLARITY_HIGH); /* Outputs are automatically re-enabled when the *break input is no longer */ /* active */ LL_TIM_EnableAutomaticOutput(TIM1); /* Select the outputs off state in Idle and Run modes */ LL_TIM_SetOffStates(TIM1, LL_TIM_OSSI_ENABLE, LL_TIM_OSSR_ENABLE); /* Enable the break input: */ LL_TIM_EnableBRK(TIM1);
还有个SetOffStates,里面有两个选项,其实这两个有个专业名词,叫做.运行模式下"关闭状态"选择 (Off-state selection for Run mode)和空闲模式下"关闭状态"选择 (Off-state selection for Idle mode),OSSR用于MOE为1,OSSI用于MOE为0,当他们禁止时候,当定时器不工作时,也就是所谓BRK时,禁止OC/OCN输出(OC/OCN使能输出信号=0).只要OSSR或者OSSI开启,就会开始输出,就算BRK时,OSSR使能就是先输出一个无效电平,然后继续正常输出,OSSI是输出一个空闲电平,然后继续输出,他们都是先输出一个其他状态.这是BRK发生后OC/OCN引脚的变化的处理.
代码中就是接收到BRK有效时候,就是OC/OCN不输出了,释放BRK后会自己再输出.
好的,然后关于BDTR,也就是我所理解的高级电机控制寄存器,就只剩下个LOCK位了.这个位解释是这样的.就是保护寄存器,让特定位不能被修改.在系统复位后,只能写一次LOCK位,一旦写入BDTR寄存器,则其内容冻结直至复位,因为BDTR寄存器LOCK位其实也是一直不允许修改的.
- 锁定关闭,寄存器无写保护.
- 锁定级别1,不能写入TIMx_BDTR寄存器的DTG/ BKE/ BKP/AOE位和TIMx_CR2寄存器的OISx/OISxN位.
- 锁定级别2,不能写入锁定级别1中的各位,也不能写入CC极性位(一旦相关通道通过CCxS位设为输出, CC极性位是TIMx_CCER寄存器的CCxP/CCNxP位)以及OSSR/OSSI位.
- 锁定级别3,不能写入锁定级别2中的各位,也不能写入CC控制位(一旦相关通道通过CCxS位设为输出, CC控制位是TIMx_CCMRx寄存器的OCxM/OCxPE位).
保护寄存器大概就是怕寄存器被其他意外覆盖吧,比如程序不太严谨等等,算是一个保险.
还有输出极性位特别容易理解,而我还没想到具体作用.当然这样同低同高时间多,说明电机转的时间只等于死区的那么一点点.