stm32F407 硬件COM事件触发六步换相
上一节采用霍尔中断的方式进行六步换相,但是这样会导致定时器PWM通道配置的更改不会同时生效,因为我们在程序中是顺序执行更改配置的,因此配置的生效不会同时发生。
stm32提供了一种采用COM事件的方式,能够使定时器PWM通道的配置同时生效。
首先看一下stm32官方手册关于COM事件的描述:
这张图片说得很清楚,就是OCXM、CCXE、CCXNE这几个位可以进行预装载,那么我们看一下这几个位分别代表什么意思,首先是OCXM,这个位存在于捕获/比较模式寄存器1(TIMX_CCMR1)和捕获/比较模式寄存器2(TIMX_CCMR2)
我们以OC1M为例:
可以看到,OC1M其实就是输出比较1模式,包括冻结,翻转,强制模式、PWM1和PWM2模式。
CCXE与CCXNE则属于捕获/比较使能寄存器(TIMX_CCER),相关定义如下所示:
这两个位,其实就是通道的使能位。
然后COM事件可以由软件触发,软件触发就是自己写一段程序,开启COM事件。软件触发一般采用以下函数:
HAL_TIM_GenerateEvent(&htim1, TIM_EVENTSOURCE_COM); //软件触发COM事件
这个函数的定义如下:
当然了,我们也可以采用硬件触发,也就是通过TRGI上升沿来生成COM事件。那TRGI怎么来呢?其实是采用一个定时器的TRGO作为另外一个定时器的TRGI。也就是主定时器产生一个触发给从定时器,这个触发就是TRGO。本文中TIM4是主定时器,TIM1是从定时器。
首先贴出stm32官方手册中关于霍尔传感器的配置过程以及COM时间生成的时序图:
在cubemx中将定时器TIM4配置成霍尔传感器接口时,TIM_CH1、TIM_CH2、TIM_CH3三个通道做异或操作。
TIM4的CCR1保存两个霍尔信号之间的捕获值,TIM4的CCR2则是另外配置,根据CCR2的值来生成OC2REF,然后触发COM事件。那么我们怎么配置CCR2呢,虽然可以手写CCR2的配置,但是既然有CubmeMx,那么stm32官方应该是可以允许我们直接配置的。
我们可以看到上文中的红线部分,“所编程的延迟过后”这句话,其实就是指的可以自定义更改的CCR2的值,CCR2是占空比,因此相当于延迟。在TIM4的配置界面,Commutation Delay就是CCR2的值。
在HAL_TIMEx_HallSensor_Init函数中,有一段语句就是用来配置通道2的。其中Commutation Delay就是Pulse也等于CCR2
如果在cubemx中允许COM事件中断,那我们可以在COM事件中断中进行换相处理。
需要注意的是,除了允许COM中断,还需要在程序中加入中断开启的语句,比如:
HAL_TIMEx_ConfigCommutationEvent_IT(&htim1,TIM_TS_ITR3,TIM_COMMUTATION_TRGI);
这里为什么ITR3,可以参考以下这个主从定时器的对应关系:
顺便将TIM1的配置也贴出来:
进行这些配置之后,将六步换相和霍尔检测放入COM中断中即可。需要注意的是在电机静止时,TIM4的计数器一直在计数,等待霍尔信号来,但是这个时候静止是没有霍尔信号的,这样会计数器溢出,使得CCR2与CNT的比较一直在进行,也就导致OCR2REF一直在产生,一直可以触发COM事件,从而导致换相出错,因此在使用硬件触发COM事件时,需要在程序里面加入堵转和电机停止的判断语句。
理论上,如果没有这种"错误",是需要在主程序加入软件触发COM事件来启动电机的,但是恰恰因为这种"错误"导致不需要再添加软件触发语句了,因为刚刚已经说了,电机静止时,会一直触发COM事件,进入COM中断,执行换相程序。
在实际中,硬件COM用得很少,因为刚刚这种问题,大部分采用的还是软件COM。