程序和电路参考的是下面这本书。程序是在这本书的基础上自己改的,电路的话基本上就是这本书的电路了。
反电势过零是采用的比较器的方式(最简单的方法了);
启动就是三段式启动,原理看起来很简单,但是实现起来还是花了点时间,因为这也是我第一次弄无感,全靠自己摸索,也没人问。最重要的是调试,因为这个涉及到开环启动,所以启动时的换向时间实际是自己设置的,所以需要不断的试,试过很多次后大概就知道这个规律了。
其实我觉得最重要的部分就是启动了,只要能启动得起来,那么就跟有霍尔的也没啥大区别了。
无感方波BLDC视频:http://v.youku.com/v_show/id_XMzEzMTg2NzgxNg==.html?spm=a2hzp.8244740.0.0
对于视频的一点说明:我设置的PID参数较小,所以在视频里面看到它响应很慢。
无感电机控制都是自学的,基本上就是看的下面这本书。里面有理论也有源程序。
//反电势过零中断
u8 Steps=0;
@far @interrupt void EXTI_PORTB_IRQHandler(void)
{
u8 bHStatus =0,i;
Speed_Count++;
bHStatus=(GPIO_ReadInputData(GPIOB)>>5)&0x07; //检测三相反电势信号--这儿倒是跟有霍尔的差不多
for(i=0;i<150;i++);
i=(GPIO_ReadInputData(GPIOB)>>5)&0x07;
if(bHStatus!=i)return;
if(StOk==0) //检查换向顺序是否正确,达到一定正确次数,则置StOK=1;
{
if(bHStatus==CheckBEMF[Steps])
{
StCountComm++;
Steps++;
if(Steps>5)Steps=0;
}
else
{
StCountComm=0; //换向顺序错误,则计数清零
}
if(StCountComm>=STCount) //换向顺序正确
{
StOk=1;
}
}
if(StOk==1)
{
if(Close_flag == 0) //我自己设置了先让它以开环转稳定了再进入闭环
{
Close_count++;
if(Close_count == 500)Close_flag = 1;;
Commutation(bHStatus,outpwm);
}
else if(Close_flag == 1)
{
Close_count = 0;
Commutation(bHStatus,outpwm);
}
}
}
启动部分的代码如下,对于不同的电机,启动时的换向时间需要自己设置。
//换向顺序:1 3 2 6 4 5
u8 Sensorless_START(void)
{
u16 tem_c;
u16 Com_time=0;
PID_init();
GPIOB->CR2|=BIT5|BIT6|BIT7;
EXTI->CR1|=BIT2|BIT3; //配置反电势的三个输入口,开启中断触发
StOk=0; //第一次定位
bHallStartStep=4;
outpwm=350;
Commutation(bHallStartStep,outpwm);
for(tem_c=0;tem_c<40000;tem_c++);
bHallStartStep=5; //第二次定位
outpwm=350;
Commutation(bHallStartStep,outpwm);
for(tem_c=0;tem_c<30000;tem_c++);
Com_time=0;
StCountComm=0;
enableInterrupts(); //使能中断
do{
bHallStartStep=bHallSteps[step];
step++;
if(step>5)step=0;
outpwm+=1; //启动过程中不断增加占空比
Commutation(bHallStartStep,outpwm);
ter_c=ter_c-200; //启动过程中不断减少换向时间
if(ter_c<2000)ter_c = 2000;
for(tem_c=0;tem_c<ter_c;tem_c++);
Com_time++; //启动过程中的换向次数
}while(StOk==0&&Com_time<250); //达到一定次数还未启动成功,则停止启动
//StOK:启动成功则=1
if(Com_time>=250)
{
TIM1->BKR &= (uint8_t)(~TIM1_BKR_MOE);
PWM_A_OFF;
PWM_B_OFF;
PWM_C_OFF;
return 0;
}
return 1;
}