STM32驱动无刷直流电机学习(3)

本文详细介绍了使用STM32驱动无刷直流电机时,如何通过霍尔传感器测量出霍尔信号与uvw相位的对应关系,并给出了实际操作中遇到的安装精度问题。同时,展示了开环模式下的驱动代码,包括各步驱动函数及其对应的PWM设置,以实现电机的正确旋转。
摘要由CSDN通过智能技术生成

根据STM32驱动无刷直流电机学习(2)测量出 霍尔和uvw 的对应关系

a.电源输入3线  u+ v-   霍尔的三线输出 110/010  就是  6/2 (理论上是2 但是测量出来是 6 应该是安装精度的问题)
b.电源输入3线  u+ w-  霍尔的三线输出 011  就是  3
c.电源输入3线  v+ w-  霍尔的三线输出 001  就是  1
d.电源输入3线  v+ u-  霍尔的三线输出 101  就是  5
e.电源输入3线  w+ u-  霍尔的三线输出 100  就是  4
f.电源输入3线   w+ v-  霍尔的三线输出 110  就是  6
 

那么我的做法是 霍尔输出 和 驱动 相差120度   H 代表 霍尔输出

H2---c    H3---d    H1---e    H5---f    H4---a    H6---b

开环模式代码如下

const pFunction Hall2UVW[]={
	NULL,		//0
	Drv4, 		//1
	Drv2, 		//2
	Drv3, 		//3
	Drv0, 		//4
	Drv5, 		//5
	Drv1, 		//6
	NULL,		//7
};

void RunMotorTask(void)
{
	INT8U hallcur,hallold=0xff;
	SysTick_CounterCmd(SysTick_Counter_Enable);								//系统时钟开始计数	
	DcMotorTim1Init(PWM_PAUSE,1000);
	SetPinState(GPIOC,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8,GPIO_Mode_IPU);
	OSQPost(OSQDebug,(void*)'0');
	do{
		OSTimeDly(OS_TICKS_PER_SEC/1000);
		hallcur=(GPIOC->IDR>>6)&0x07;
		if(hallcur!=hallold && hallcur!=0 && hallcur!=7)
		{
			hallold=hallcur;
			Hall2UVW[hallcur]();
			//USARTX->DR='0'+hallcur;
		}
	}while(1);
}

每一步的驱动代码如下

INT16U BLDC_PWM=50;
#define PWM_TEST	(PWM_PAUSE-BLDC_PWM)
void Drv0(void)
{
	EnPortAFPP(GPIOA,8)=1;
	EnPortAFPP(GPIOA,9)=0;
	EnPortAFPP(GPIOA,10)=0;
	TIM1->CCR1=PWM_TEST;			
	TIM1->CCR2=PWM_PAUSE;
	TIM1->CCR3=PWM_PAUSE;
	MOTORV=1;
}

void Drv1(void)
{
	MOTORU=MOTORV=MOTORW=0;
	EnPortAFPP(GPIOA,8)=1;
	EnPortAFPP(GPIOA,9)=0;
	EnPortAFPP(GPIOA,10)=0;
	TIM1->CCR1=PWM_TEST;
	TIM1->CCR2=PWM_PAUSE;
	TIM1->CCR3=PWM_PAUSE;
	MOTORW=1;
}

void Drv2(void)
{
	MOTORU=MOTORV=MOTORW=0;
	EnPortAFPP(GPIOA,8)=0;
	EnPortAFPP(GPIOA,9)=1;
	EnPortAFPP(GPIOA,10)=0;
	TIM1->CCR1=PWM_PAUSE;
	TIM1->CCR2=PWM_TEST;
	TIM1->CCR3=PWM_PAUSE;
	MOTORW=1;
}

void Drv3(void)
{
	MOTORU=MOTORV=MOTORW=0;
	EnPortAFPP(GPIOA,8)=0;
	EnPortAFPP(GPIOA,9)=1;
	EnPortAFPP(GPIOA,10)=0;
	TIM1->CCR1=PWM_PAUSE;
	TIM1->CCR2=PWM_TEST;
	TIM1->CCR3=PWM_PAUSE;
	MOTORU=1;
}


void Drv4(void)
{
	MOTORU=MOTORV=MOTORW=0;
	EnPortAFPP(GPIOA,8)=0;
	EnPortAFPP(GPIOA,9)=0;
	EnPortAFPP(GPIOA,10)=1;
	TIM1->CCR1=PWM_PAUSE;
	TIM1->CCR2=PWM_PAUSE;
	TIM1->CCR3=PWM_TEST;
	MOTORU=1;
}

void Drv5(void)
{
	MOTORU=MOTORV=MOTORW=0;
	EnPortAFPP(GPIOA,8)=0;
	EnPortAFPP(GPIOA,9)=0;
	EnPortAFPP(GPIOA,10)=1;
	TIM1->CCR1=PWM_PAUSE;
	TIM1->CCR2=PWM_PAUSE;
	TIM1->CCR3=PWM_TEST;
	MOTORV=1;
}

 

 

 

 

 

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值