- 积分
- 2090
- 回帖
- 0
- 西莫币
-
- 贡献
-
- 威望
-
- 存款
-
- 阅读权限
- 35
- 最后登录
- 1970-1-1
签到天数: 11 天 连续签到: 1 天 [LV.3]偶尔看看II
|
楼主 |
发表于 2020-3-23 08:36
|
显示全部楼层
来自: 中国江苏南京
再贴一个论坛的单片机霍尔程序
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了 |
|