请教ST霍尔初始化程序
关于ST的霍尔初始化,在不同的状态是怎么算的?下面是程序,电机知识贫乏,请大师指点,这个偏移是怎么得到的void HALL_Init_Electrical_Angle(void)
{
#if (HALL_SENSORS_PLACEMENT == DEGREES_120)
switch(ReadHallState())
{
case STATE_5:
hElectrical_Angle = (s16)(S16_PHASE_SHIFT+S16_60_PHASE_SHIFT/2);
break;
case STATE_1:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT+S16_60_PHASE_SHIFT+
S16_60_PHASE_SHIFT/2);
break;
case STATE_3:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT+S16_120_PHASE_SHIFT+
S16_60_PHASE_SHIFT/2);
break;
case STATE_2:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_120_PHASE_SHIFT-
S16_60_PHASE_SHIFT/2);
break;
case STATE_6:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_60_PHASE_SHIFT-
S16_60_PHASE_SHIFT/2);
break;
case STATE_4:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_60_PHASE_SHIFT/2);
break;
default:
break;
}
#elif (HALL_SENSORS_PLACEMENT == DEGREES_60)
switch(ReadHallState())
{
case STATE_1:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT+S16_60_PHASE_SHIFT/2);
break;
case STATE_3:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT+S16_60_PHASE_SHIFT+
S16_60_PHASE_SHIFT/2);
break;
case STATE_7:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT+S16_120_PHASE_SHIFT+
S16_60_PHASE_SHIFT/2);
break;
case STATE_6:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_120_PHASE_SHIFT-
S16_60_PHASE_SHIFT/2);
break;
case STATE_4:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_60_PHASE_SHIFT-
S16_60_PHASE_SHIFT/2);
break;
case STATE_0:
hElectrical_Angle =(s16)(S16_PHASE_SHIFT-S16_60_PHASE_SHIFT/2);
break;
default:
break;
}
#endif
} 初始值在正常角度上偏移30度,防止启动时卡死 再贴一个论坛的单片机霍尔程序
void HallContrl(void)
{
uint16 SpeedTemp;
uint8 temp=0;
if(HALL_A == 1)
{
_nop_();
_nop_();
if(HALL_A == 1)
HALL_DATA |= 0x01;
else
HALL_DATA &= 0xFE;
}
else
{
HALL_DATA &= 0xFE;
}
if(HALL_B == 1)
{
_nop_();
_nop_();
if(HALL_B == 1)
HALL_DATA |= 0x02;
else
HALL_DATA &= 0xFD;
}
else
{
HALL_DATA &= 0xFD;
}
if(HALL_C == 1)
{
_nop_();
_nop_();
if(HALL_C == 1)
HALL_DATA |= 0x04;
else
HALL_DATA &= 0xFB;
}
else
{
HALL_DATA &= 0xFB;
}
if(OldHallTemp!=HALL_DATA)//霍尔状态
{
if(HALL_DATA == 6)
{
SpeedTemp = TH3<<8;
MotorSpeedTemp = SpeedTemp + TL3;
T3CON &= 0xFB;
TL3 = 0;
TH3 = 0;
T3CON |= 0x04;
}
temp= HALL_DATA;
{
OldHallTemp=temp;
BLDC120HX(temp);
}
}
}
void SpeedContrl(uint16 Spd_Ref) //cflcfl T3T4用sysclk的1/256 fs=(84/256)M 60/(POLES*(1/fs)*6*cnt )3281250/(POLES*cnt)
{
RunSpeed=SpeedCalculate(MotorSpeedTemp);
PWM_Duty=PID_Speed(Spd_Ref,RunSpeed,&SPEED_PID_t);
}
uint16 SpeedCalculate(uint16 HallTimer) //cflcfl T1频率27/12=2.25MHz
{
uint16 SpeedTemp;
MDSCON = 0xc1;//cflcfl相关位清0
OPRDZ_16 = 0x10;//0x0E;//cflcfl HiByte(978260);//HiByte(11250000); //
OPRDY_16 = 0xcb00;//0xED54;//cflcfl LoByte(978260);//LoByte(11250000);
OPRDX_16 = HallTimer;
MDSCON = 0x41; //无符号除法
while(MDSCON&0x01);//cflcfl 等待运算完成再读数
SpeedTemp = OPRDY_16;
return(SpeedTemp);
}
这里计算转速霍尔捕获是在if(HALL_DATA == 6)才给SpeedTemp 赋值,那为什么注释的说明 60/(POLES*(1/fs)*6*cnt )3281250/(POLES*cnt) 要除以6? 我理解的是HALL_DATA == 6 是每周捕获一次,就不用除以6了 wujinee 发表于 2020-3-23 08:36
再贴一个论坛的单片机霍尔程序
void HallContrl(void)
哥哥,这不是我写的吗?{:4_575:} 还能看到我的注释 18201975434 发表于 2020-3-23 11:23
哥哥,这不是我写的吗? 还能看到我的注释
这么巧,能否解释一下,这里的公式?{:1_561:} wujinee 发表于 2020-3-23 13:01
这么巧,能否解释一下,这里的公式?
hall=6其实只是一个更新时间节点,计算的时间还是单个hall的时间 wujinee 发表于 2020-3-23 13:01
这么巧,能否解释一下,这里的公式?
这么久我都忘记了 哈哈 18201975434 发表于 2020-3-23 13:37
这么久我都忘记了 哈哈
第一次HALL_DATA == 6,和第二次 HALL_DATA == 6之间 不是应该转了一圈吗?
if(OldHallTemp!=HALL_DATA)//霍尔状态
{
if(HALL_DATA == 6)
{
SpeedTemp = TH3<<8;
MotorSpeedTemp = SpeedTemp + TL3;
T3CON &= 0xFB;
TL3 = 0;
TH3 = 0;
T3CON |= 0x04;
}
temp= HALL_DATA;
{
OldHallTemp=temp;
BLDC120HX(temp);
}
}
这里是采用查询的方式,如果是单个霍尔更新,就不用if(HALL_DATA == 6)这个判断了啊。直接每次霍尔状态更新就 SpeedTemp = TH3<<8;
MotorSpeedTemp = SpeedTemp + TL3;
wujinee 发表于 2020-3-23 13:01
这么巧,能否解释一下,这里的公式?
一圈转过来,应该有6次霍尔状态变化,上一次 到 这一次hall=6 时候是完整转了一圈。定时器捕获的就是这一圈的时间间隔啊。 wujinee 发表于 2020-03-23 19:41
一圈转过来,应该有6次霍尔状态变化,上一次 到 这一次hall=6 时候是完整转了一圈。定时器捕获的就是这一圈的时间间隔啊。
看了一眼,确实是360计算转速,下面求转速你核实一下被除数
页:
[1]