基于STM8S的无感方波BLDC控制

程序和电路参考的是下面这本书。程序是在这本书的基础上自己改的,电路的话基本上就是这本书的电路了。

反电势过零是采用的比较器的方式(最简单的方法了);

启动就是三段式启动,原理看起来很简单,但是实现起来还是花了点时间,因为这也是我第一次弄无感,全靠自己摸索,也没人问。最重要的是调试,因为这个涉及到开环启动,所以启动时的换向时间实际是自己设置的,所以需要不断的试,试过很多次后大概就知道这个规律了。

其实我觉得最重要的部分就是启动了,只要能启动得起来,那么就跟有霍尔的也没啥大区别了。

无感方波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;
}


  • 14
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值