本帖最后由 tianxj01 于 2020-6-24 09:27 编辑
现在开始讲程序处理部分。
整个程序最核心的部分,是几个换相数据,下面直接给出换相表:
volatile u8 code MotorPhaseStateHightTab[]={0xFE,0xFB,0xFB,0xEF,0xEF,0xFE};
volatile u8 code MotorPhaseStateLowTab[]={0x20,0x20,0x02,0x02,0x08,0x08};
volatile u8 code HallSeqTab[]={0,2,4,3,6,1,5,0};//======================================
MotorPhaseStateHightTab 看字面应该就可以明白,这是上管换相数据。
Tab数据查表后,直接用于N76E003的PMEN寄存器。
关于PMEN寄存器的官方说明文档描述是这样的:
PWMn输出掩码使能位
0 = PWMn 信号输出
1 = PWMn 根据PMDn设定的电位值掩码
我们看看顺序0的表格内容=0xFE,二进制是11111110,也就是只有PWM0通道输出PWM信号(PWM0是A相的上臂输出端),其他个PWM端口根据PMD的数据来确定。
//======================================
这里我们再看看官方对PMD寄存器的定义:
PWMn掩码数据寄存器
PWMn信号输出掩码寄存器设置的电平,当其相应的PMENn位设置时。
0 = PWMn 掩码,输出低电平
1 = PWMn 掩码,输出高电平
//======================================
然后我们再看看PMD查表后的第一拍数据=0x20,二进制是00100000,也就是这个时候,PWM5通道输出高电平电平(注意是高电平,而不是PWM信号,这就可以实现单极性半桥控制)。(PWM5是C相的下臂输出端)
因此,MotorPhaseStateLowTab就是下管换相数据,Tab数据查表后,直接用于N76E003的PMD寄存器。大家可以对比着下面的时序图,来分析上面的2个换相表。上面的顺序1,就等于下面图表60-120°区间,其他的以此类推,换相表最后一个数据,0xFE=11111110,即AH=PWM,下臂为0x08=00001000即BL=H,循环过来对应的是下图0-60°
//======================================
HallSeqTab表 则是霍尔输入逻辑转变为顺序的换相拍子的转换表格。也就是霍尔输入端口读进去的数据,和拍子顺序的对应关系,{0,2,4,3,6,1,5,0}表格把000和111输入都填的0,这是无效输入,合法的输入只有1-6表格单元,霍尔输入101时候,HallSeqTab[5]=1,也就是换相顺序1,霍尔输入001时候,HallSeqTab[1]=2,也就是换相顺序2。...........霍尔输入100时候,HallSeqTab[4]=6,也就是换相顺序6。
实际操作非常简单,每次查询(或者中断处理)执行下面的操作就是了:
if(HallSwtch>0&&HallSwtch<7)u8HallSensorMotorPhaseState = HallSeqTab[HallSwtch]; //检查合法霍尔输入,并把霍尔输入转换成顺序的换相数据
PMEN = MotorPhaseStateHightTab[u8HallSensorMotorPhaseState-1]; //ABC相上臂驱动换相
PMD = MotorPhaseStateLowTab[u8HallSensorMotorPhaseState-1]; //ABC相下臂驱动换相
也许有得人会问,你再弄个霍尔输入逻辑转换表,干嘛不按照实时输入霍尔数据的数字,重新安排驱动的上下管换相表格呢?这样做当然是可以的,只不过做表格时容易出错,关键是电动机反转逻辑现在这样更容易简单化处理,倒置一下查出来的霍尔输入对应顺序再去差换相表格就直接实现电动机反转了。
今天就到这里...............
|