This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRV8305:使用DRV8305和MSP430G2553驱动BLDC电动机时出现一些问题。

Guru**** 665180 points
Other Parts Discussed in Thread: MSP430G2553, DRV8305
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/567239/drv8305-some-problem-while-driving-bldc-motor-using-drv8305-and-msp430g2553

部件号:DRV8305
主题中讨论的其他部件:MSP430G2553

您好,先生,

我使用DRV8305和MSP430G2553控制器来驱动BLDC。  

它运行几乎完美,但在某个时间点,BLDC电机内部会发出一秒钟的声音, 并且U,V和W相位的时间波形也会受到干扰。 此过程会重复进行,但不会定期执行。  

在我的电路中,我使用  TXB0104PW将BLDC的霍尔传感器的5V信号转换为3.3V。  这是霍尔传感器电路的图像。

下面是我从TI参考设计之一的参考代码中获取的代码。

************

//系统配置
//器件部件号	:MSP430G2553
//编译器 :代码编辑器工作室5.5。0.0.0077万
//振荡器频率	16MHz,使用内部DCO
// PWM生成		:计时器A:1.2 ,16MHz,OUTMOD[2:0]=2,用于高侧FET的PWM
//						:计时器A 1.1 ,16MHz,OUTMOD[2:0]=6,用于低侧FET
的PWM ////
位置反馈: 霍尔传感器信号
//				HA -> WFP 2.0
//				HB -> WFP 2.3
//				HC -> WFP 2.6

//DRV8305
//SPI通信		:SDO -> WFP 1.1
//				:SDI -> WFP 2.7 1.2 3.6
//				:SCLK -> WFP 3.4
//				:

FAULT ->USCO 3.5 //			:EN_GATE -> WFP FAULT
				-> FAULT -> FAO
/

#include <MSP430.h>
#include <stdint.h>
#include "drv8305.h"

void Init_Clocks ();
void Init_IOS (void);
void Init_ADC (void);
void Init_Timer (void);
void Init_COMP_A (void);
void Hall_State_Change_Forward (void);
void Hall_State_Change_reverse (void);
void a_PWM (void);
void B_PWM (void);
void C_PWM (void);
void a_low (void);
void B_low (void);
void C_low (void);
void A_Z (void);
void B_Z (void);
void C_Z (void);
void Readfault (void);
#define		PWM_Period				400 //PWM Frequency (Hz)= 16MHz/(2*PWM_Period)-1)
#define		MAX_DUTYCYCLE				400 //相对于PWM_Period
#define		MIN_DUTYACCECLE				50 //相对于PWM_Period
#define		ACCEL_RATE				500 //全周期PWM (PWM频率/PWM_Period
失效时间					1. //来自MSP430的死时间= dead_ty* 0.0625 us (用于16MHz时钟)
#define 挡块_转子_持续时间 		3万 //BLOCKED_ROTOR关闭时间(s)= BLOCK_ROTOR_Duration*3万/计时器时钟频率
#define WantedDutyCycle 390 //unsigned int
DC_BUS_current = 0;//unsigned
int DC_Bus_Voltage = 0;
unsigned int speed_REF = 0;//unsigned
int Temperature_feedback = 0;//unsigned
int start_count =0;
volatile unsigned int hall_State = 0;
/unsigned
int wantedDutyCycle =30;
unsigned = unsigned
挥发性无符号int Direction=0;
//unsigned int FirstADC_flag =1;
//unsigned int ADC_selection_FLAG_1
=1;
unsigned int ADC_selection_FLAG_1 =1;unsigned int Block_Rotter_Counter =0;
unsigned int Block_Rotter_Counter_1 =0;
unsigned int addr1,addr2,addr3,Addr4;

/*********************** ADC信道选择******************************************* /

#define measure_speed()		{	ADC10CTL0 = ADC10SHT_1 + ADC10IE + ADC10ON; 	\
								ADC10CTL1 = inch_3 + CONSEQ_0 + SHS_0;						\
								ADC10AE0 = BIT3;	}/*

#define measure_TEMP()		{	ADC10CTL0 = ADC10SHT_1 + ADC10IE + ADC10ON; 			\
								ADC10CTL1 = inch_4 + CONSEQ_0 + SHS_0;						\
								ADC10AE0 = BIT4;	}

#define measure_VDC()		{ ADC10CTL0 = ADC10SHT_1 + ADC10IE + ADC10ON; 	\
								ADC10CTL1 = inch_5 + CONSEQ_0 + SHS_0;						\
								ADC10AE0 = BIT5;	}

#define measure_IDC()		{ ADC10CTL0 = ADC10SHT_1 + ADC10IE + ADC10ON; 		\
								ADC10CTL1 = inch_6 + CONSEQ_0 + SHS_0;						\
								ADC10AE0 = BIT6;	}
*/
#define conversion _enable()	{ ADC10CTL0 |= ENC + ADC10SC;}

#define conversion _disable(){ ADC10CTL0 &=~ENC; 										\
								ADC10CTL1 = 0;	}/***********************

主要内容************************************************************** /
void main()
{
	WDTCTL = WDTPW + WDTHOLD;//				停止监视程序计时器以防止超时重置
	Init_Clocks();
	Init_IOS();
	drv8305_init();
	a_Z();
	B_Z();
	C_Z();
	IF((P2IN & BIT3)== 0)
	{
		ReadRegister (0x01);
		ReadRegister (0x02);
		ReadRegister (0x03);
		ReadRegister (0x04);ReadRegister (0x04);
		//Readfault();
	}
	P3OUT |= BIT6;
	Init_adc ();
//	Init_COMP_A ();
	Init_Timer ();
	WDTCTL = WDTPW + WDTHOLD;				//停止监视计时器以防止超时重置
	__Delay_Cycles (100万);
	hall_State =(P2IN和BIT0)+(
	=(= P2IN和PB0)
	
	;B3IN和PB0;PB0;= 6;PB0;B3IN和PB0;PB0;PB0;PB0;PB0;PB0;PB0;PB0;PB0;PB0;PB0;PB0和PB0;PB0;PB0;PB0;PB0;PB0;PB

	while (1)
		{
			IF(direction ==1)
			{
				Hall_State_Change_forward();
			}
			else
			{
				Hall_State_Change_reverse();
			}


			IF(softstart_counter == ACCEL_RATE)
			{
				softstart_counter =0;

				IF((P3IN & BIT0)== 1)
				{
					IF ( CurrentDutyCycle <Wanted_Rate=){ DutyCycle=)}
					
						
					
				
				
				
					{ DutyCycle=0;
					
						}= DutyCycle { DutyCycle=}{ DutyCycle=0}{ DutyCycle=}{ DutyCycle=}{ DutyCycle=0;<=}{
					
				}
			}}}}/**************************

		


正在初始化ADC *************************************** /
void Init_adc (void)
{
ADC10CTL0 = ADC10SHT_0 + ADC10ON + ADC10IE;// ADC10ON,中断已启用
ADC10CTL1 = inch_3; //}/**************************


正在初始化GPIO*************************************** /
void Init_ios (void)

{
	//霍尔传感器输入

	P2SEL &=~(BIT0+BIT6+BIT7);						//GPIO -霍尔传感器
	P2DIR &=~(BIT0+BIT6+BIT7);						//输入-霍尔传感器

	//PWM输出

	P2OUT |=(BIT1+BIT2+BIT2+BIT4+BIT2+P3P3P=					
						
								
								

	
										

	~/ SEL= P3PBIT3PBIT3PB3PBIT7=/ PBIT3PBIT3PB1= PBIT3PBIT3PBIT2+P3PBIT2= PBIT3PBIT3PBIT3PBIT2= PBIT3PBIT3PBIT3PBIT3PBIT3PBIT2= PBIT3PBIT2+PBIT3PBIT3PBIT2= PBIT3PBIT3PBIT2= PBIT2= PBIT3PBIT3PBIT3PBIT2= PBIT
	P3DIR |= BIT7;									//LED1


	//DRV8305
	P2SEL &=~(BIT3);								//GPIO -故障
	P2DIR &=~(BIT3);								//输入-故障
	//P3SEL ||(BIT6);								//GPIO -EN_GATE

	P3DIR ||(BIT6);								//输出
	
	
										
	=~/PB1TIF=									
	~/输出= PB1TIF=/PBITO= 									
		//SCLK
	P3OUT &=~BIT4;
	P3DIR || BIT5;	//NSC
	P3OUT |= BIT5;

	//Indications
	P3SEL &=~Ω(BIT1);								//GPIO -LED3
	P3DIR ||(BIT1);								//Output-LEDIR

	//方向控制
	P3SEL &=~Ω								
									(BITS1)~/端口

	
	(PIT0) PIT0 (PIR=/) 					//边缘检测高=下降边缘,低=上升边缘
	P2IFG &=(~BIT0)+(~BIT6)+(~BIT7);				//消除引脚2.0 ,2.6 和2.7 IFG
	P2IE |=(BIT0)+(BIT6)+(BIT7);				//启用输入引脚2.2 ,2.3 和2.4 上的中断
	********_ENTIF**



正在初始化计时器*************************************** /
void Init_Timer (void)
{
	TA1CCR0		= PWM_Period;//							加载参考计数
	TA1CCTL2	= OUTMOD_2;//								高侧PWM
	TA1CCR2		=50;
	TA1CCTL1	= OUTMOD_6;//								低侧PWM
	TA1CCR1		=50;									//使用零
	TA1CTL初始化TA1CTL		= Tassel/CLMC+TA3		,CL_Timer + TASK + TASH_CL/TA3 计时器中断开

	//TA1CCTL0	= CCIE;

	WDTCTL		= WDT_MDLLY_32;					//大约2ms间隔
	IE1		|= W技工 经; //启用WDT中断
	_EINT(); 		//启用中断
}/******************

正在初始化时钟*************************************** /
void Init_Clocks (void)
{
	BCSCTL1		= CALC1_16MHz; 	//设置DCO ~ 16 MHz
	DCOCTL		= CALDCO_16MHz;
	BCSCTL1	|| DIVA_1; 	// aclk/(0:1,1:2,2:4,3:8)
	BCSCTL3	|= LFXT1S_2; 	// LFXT1 = VLO
}/******************



端口(霍尔传感器)中断维修例行程序*************************************** /

#pragma vector=port2_vector
__interrupt void Port_2 (void)

{
		Hall_State =(P2IN & BIT0)+((P2IN & BIT6)>>4)+((P2IN & BIT7)>>6);


		IF (direction ==1)
		{
			Hall_State_Change_forward();
		
		else
		{ Hall_State_Bit7)}>6)BIT+)=}BIT7
			
		


		^ //将霍尔中断更改为下降边缘,以检测两个边缘
		P2IFG &=(~BIT0)+(~BIT6)+(~BIT7);	//清除中断标志

}/**********

计时器中断向量*************************************** /
#pragma vector = Timer1_A1_vector
__interrupt void Timer1_A1_ISR (void)
{


SWITCH(__偶 数_in_range(TA1IV,0x0A))
{
	CASE TA1IV_NONE:中断; //矢量0:无中断
CASE TA1IV_TACR1:中断; //矢量2:TACR1 CCIFG
CASE TA1IV_TACCR2:中断; //矢量4:TACR2 CCIFG
CASE TA1IV_6:中断; //向量6:保留的CCIFG
CASE TA1IV_8:中断; //向量8:保留的CCIFG
CASE TA1IV_TAIFG: 		//矢量10:TAIFG


//		TA1CCR2		=(CurrentDutyCycle);
//		TA1CCR1		= CurrentDutyCycle;

		TA1CCR2		=(CurrentDutyCycle -deed_time);
		TA1CCR1		= CurrentDutyCycle;

		IF ((P2IN和BIT3)= 0)
		{ 						
			P3OUT &=~(BIT6); 								
			Readfault();
		}


中断;


默认:	break;
}}}/******************



ADC中断*************************************** /
#pragma vector=ADC10_vector
__interrupt void ADC10_ISR (void)
{


	speed_REF =(ADC10MEM>>1);
	conversion _disable();

}/******************

换向顺序前进*************************************** /
void Hall_State_Change_Forward (void)
{

			switch (Hall_State)
			{
				案例2:
						A_PWM();
						B_low();
						C_Z();

				Break;

				案例6:
						A_PWM();
						c_low();
						B_Z();

					中断;

				案例3:
						c_PWM();
						B_low();
						A_Z();

						中断;
				案例1:
						c_PWM();
						a_low();
						B_Z();

						中断;

				案例4:
						B_PWM();
						C_LOW ();
						A_Z ();

						中断;

				案例5:
						B_PWM();
						A_low();
						C_Z();

						中断;


				默认:
					A_Z();
					B_Z();
					C_Z();

					Break;
			}}}/******************



换向顺序倒档*********************************************** /
void Hall_State_Change_reverse (void)
{

			switch (hall_State)
			{
				案例2:
						b_PWM ();
						a_low ();
						C_Z ();

				break;

				案例6:
						c_PWM ();
						a_low();
						B_Z();

					中断;

				案例3:
						b_PWM();
						C_low();
						A_Z();

						中断;
				案例1:
						A_PWM();
						C_low();
						B_Z();

						中断;

				案例4:
						C_PWM();
						B_LOW ();
						A_Z();

						中断;

				案例5:
						A_PWM();
						B_low();
						C_Z();

						Break;


				default:
					A_Z();
					B_Z();
					C_Z();

					Break;
			}}}/******************




PWM GPIOs的定义*********************************************** /

void a_wm (void)

{
	P3SEL || BIT3;
	P3SEL || BIT2;

}


void B_PWM (void)

{
	P2SEL || BIT4;
	P2SEL || BIT2;

}

void C_PWM (void)

{
	P2SEL || BIT5;
	P2OUT || BIT1;



void A_low( void)

	~
	B3IT2=~PB3SEL
	
	=~


void B_low(void)
{
	P2SEL &=~BIT4;
	P2OUT &=~BIT4;
	P2SEL &=~BIT2;
	P2OUT |= BIT2;
}

void C_low(void)
{
	P2SEL &=~BIT5;
	P2OUT &=~BIT5;
	
	P2OUT &=~BIT1;




	~3PSE=
	~3PB3;
	~SEL=
	~


void B_Z(void)
{
	P2SEL &=~BIT4;
	P2OUT &=~BIT4;
	P2SEL &=~BIT2;
	
}

void C_Z(void)
{
	P2SEL &=~BIT5;
	P2OUT &=~BIT5;
	P2SEL &=~BIT1; P2OUT
	&=~BIT01;~= 1;


REGADDR03=0X01; REG; REG; RED02=021(REG1;RED01;REG1;RED02=01;REG;RED01;REG;RED01;RED01;REG;RED01;REG;RED01;REG;REG


	
	
	
	


完**************************************************************** /


请帮我解决这个问题。 您还可以指出代码中的错误。  

谢谢你。  

此致,

Dinesh JINJALA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Dinesh,

    发生干扰时,您是否检查过霍尔针脚? 这应有助于您确定干扰是由不正确的大厅信息还是不正确的换向顺序引起的。 如果霍尔信息正确,则应进一步检查代码。

    如果代码按预期运行,将LED更改为切换和监控LED可提供信息。 这有助于确定主代码和中断之间是否存在一些交互。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。  

    下面是我在实验电机时遇到的一些问题。

    1. 反向 (顺时针)工作正常(马达中的抖动量非常小),但当我用手加载马达时,它开始发出小声音(导致从 其位置移位)。  

    2. 在前进(逆时针)方向上,它开始发出从起动开始的声音。

    黄色为 相位U的图形,蓝色为 相位W的图形

    3.当我尝试测量霍尔传感器信号时(在这些信号通过TXB0104PW转换为3.3V信号后),在反向模式下,它也开始在没有负载的情况下发出声音。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Dinesh,

    如果没有霍尔输入和另一个相位,很难确定发生了什么。

    如有可能,请关注圈出的区域。 可能缺少换向状态。

    在这段时间内,大厅的输入是什么? 它们是否按预期切换?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     Rick Duncan,您好!

    我有一个示波器 ,但只有两个探头需要测量。

    如果我可以测量,那么我一定会发送它。  

    但在3.3V霍尔传感器信号上放置10nF电容器后,我发现有一些改进。 我已将C45,C46和C47替换为10nF。 该值的结果比以前好得多。

     我会检查几个小时的性能。 之后,我会说这个问题是否解决了。  

    谢谢。