主题中讨论的其他部件: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