西莫电机圈

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 351|回复: 9

[讨论] 请教ST霍尔初始化程序

[复制链接]

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

发表于 2020-3-21 08:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
关于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
}
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过

签到天数: 27 天

连续签到: 1 天

[LV.4]偶尔看看III

发表于 2020-3-22 16:30 | 显示全部楼层
初始值在正常角度上偏移30度,防止启动时卡死

评分

参与人数 1西莫币 +2 收起 理由
PMSM_spy + 2 感谢您的参与

查看全部评分

西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

 楼主| 发表于 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了

点评

哥哥,这不是我写的吗? 还能看到我的注释  详情 回复 发表于 2020-3-23 11:23
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 37 天

连续签到: 1 天

[LV.5]常住居民I

发表于 2020-3-23 11:23 | 显示全部楼层
wujinee 发表于 2020-3-23 08:36
再贴一个论坛的单片机霍尔程序

void HallContrl(void)

哥哥,这不是我写的吗?   还能看到我的注释
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

 楼主| 发表于 2020-3-23 13:01 | 显示全部楼层
18201975434 发表于 2020-3-23 11:23
哥哥,这不是我写的吗?   还能看到我的注释

这么巧,能否解释一下,这里的公式?

点评

这么久我都忘记了 哈哈  详情 回复 发表于 2020-3-23 13:37
hall=6其实只是一个更新时间节点,计算的时间还是单个hall的时间  详情 回复 发表于 2020-3-23 13:36
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 37 天

连续签到: 1 天

[LV.5]常住居民I

发表于 2020-3-23 13:36 | 显示全部楼层
wujinee 发表于 2020-3-23 13:01
这么巧,能否解释一下,这里的公式?

hall=6其实只是一个更新时间节点,计算的时间还是单个hall的时间
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 37 天

连续签到: 1 天

[LV.5]常住居民I

发表于 2020-3-23 13:37 | 显示全部楼层
wujinee 发表于 2020-3-23 13:01
这么巧,能否解释一下,这里的公式?

这么久我都忘记了 哈哈
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

 楼主| 发表于 2020-3-23 13:54 | 显示全部楼层
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;
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 2 天

连续签到: 1 天

[LV.1]初来乍到

 楼主| 发表于 2020-3-23 19:41 | 显示全部楼层
wujinee 发表于 2020-3-23 13:01
这么巧,能否解释一下,这里的公式?

一圈转过来,应该有6次霍尔状态变化,上一次 到 这一次hall=6 时候是完整转了一圈。定时器捕获的就是这一圈的时间间隔啊。

点评

看了一眼,确实是360计算转速,下面求转速你核实一下被除数  详情 回复 发表于 2020-3-23 20:53
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

签到天数: 37 天

连续签到: 1 天

[LV.5]常住居民I

发表于 2020-3-23 20:53 来自手机 | 显示全部楼层
wujinee 发表于 2020-03-23 19:41
一圈转过来,应该有6次霍尔状态变化,上一次 到 这一次hall=6 时候是完整转了一圈。定时器捕获的就是这一圈的时间间隔啊。

看了一眼,确实是360计算转速,下面求转速你核实一下被除数
西莫电机论坛微信公众平台正式上线!★详情请点击★ 西莫电机论坛会员交流专用群欢迎您西莫电机论坛加群请注明论坛用户名及所从事专业,否则不予通过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|西莫电机圈 ( 浙ICP备10025899号-3 浙公网安备:33028202000436号

GMT+8, 2024-9-28 09:18 , Processed in 0.095506 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表