直流无刷电机驱动程序

#include

#include "derivative.h"

#include "INIT_PLL.h"

#define BOOL int

#define TRUE 1

#define FALSE 0

#define KEY1 PTH_PTH3

#define KEY1_DIR DDRH_DDRH3

unsigned char WZ,ZKB1=10,ZKB2=20;

BOOL A,B,C,HA,HB,S1,ZHENG,FAN;

void INIT_KEY(void)

{

KEY1_DIR=0;

PPSH&=0XF0;

PIEH|=0X0F;

PIFH|=0X0F;

}

void INIT_ECT(void)//定时器初始化

{

TSCR1_TEN=1; //定时器使能为

TIOS&=0XE0;

TCTL3=0X03;

TCTL4=0Xff;

TIE=0X1F; //允许定时器中断

TSCR2=0X07; //预分频系数111 128分频 时钟周期为4us

TFLG1=0XFF; //清除各IC/OC中断标志位

TFLG2=0XFF; //清除自由定时器中断标志位

}

void INIT_PWM(void) //PWM初始化

{

PWMPRCLK=0X00; //A B

PWMSCLA=4; //SA=A(32M)/2/4

PWMSCLB=4; //SB=B(32M)/2/4

PWMCLK=0Xff; //时钟选择 0: A/B 1: SA/SB

PWMCAE=0XFF; //0:左对齐 1:居中对齐

DDRP=0XFF;

PWMPER0=100; //占空比

PWMDTY0=0;

PWMPER1=100;

PWMDTY1=0;

PWMPER2=100;

PWMDTY2=0;

PWMPER3=100;

PWMDTY3=0;

PWMPER4=100;

PWMDTY4=0;

PWMPER5=100;

PWMDTY5=0;

PWME=0X00;

}

/*

void delay(void)

{

unsigned int i,j;

for(i=0;i

for(j=0;j

}

*/

#pragma CODE_SEG __NEAR_SEG NON_BANKED

//*******************霍尔信号检测*********************//

void interrupt 8 T0_inter(void) {TFLG1_C0F=1; A=PTT_PTT0;}

void interrupt 9 T1_inter(void) {TFLG1_C1F=1; B=PTT_PTT1;}

void interrupt 10 T2_inter(void) {TFLG1_C2F=1; C=PTT_PTT2;}

void interrupt 11 T3_inter(void) {TFLG1_C3F=1; HA=PTT_PTT3;}

void interrupt 12 T4_inter(void) {TFLG1_C4F=1; HB=PTT_PTT4;}

void interrupt 25 PTH_inter(void)

{

if(PIFH_PIFH3!=0) //停止

{

PIFH_PIFH3=1;

S1=1;

ZHENG=0;

FAN=0;

}

if(PIFH_PIFH2!=0)

{

PIFH_PIFH2=1;

ZHENG=1;

FAN=0;

S1=0;

}

if(PIFH_PIFH1!=0)

{

PIFH_PIFH1=1;

ZHENG=0;

FAN=1;

S1=0;

}

if(PIFH_PIFH0!=0) //占空比加1

{

PIFH_PIFH2=1;

ZKB1=ZKB1+5;

ZKB2=ZKB1+10;

if(ZKB1>=85)

{

ZKB1=85;

ZKB2=95;

}

}

}

//***************************************************//

#pragma CODE_SEG DEFAULT

//******************转子位置判断*********************//

void ZZWZ(void)

{

if((A==1)&&(B==0)&&(C==1)) WZ=1;

if((A==1)&&(B==0)&&(C==0)) WZ=2;

if((A==1)&&(B==1)&&(C==0)) WZ=3;

if((A==0)&&(B==1)&&(C==0)) WZ=4;

if((A==0)&&(B==1)&&(C==1)) WZ=5;

if((A==0)&&(B==0)&&(C==1)) WZ=6;

}

//***************************************************//

//*****************六种导通状态**********************//

void A_B(void)

{

PWMPOL_PPOL0=1; PWMPOL_PPOL1=0; PWMPOL_PPOL3=1;

PWMPOL_PPOL2=1; PWMPOL_PPOL4=1; PWMPOL_PPOL5=1;

PWMDTY0=ZKB1; PWMDTY1=ZKB2; PWMDTY3=100;

PWMDTY2=0; PWMDTY4=0; PWMDTY5=0;

PWME=0X3F;

}

void A_C(void)

{

PWMPOL_PPOL0=1; PWMPOL_PPOL1=0; PWMPOL_PPOL5=1;

PWMPOL_PPOL2=1; PWMPOL_PPOL3=1; PWMPOL_PPOL4=1;

PWMDTY0=ZKB1; PWMDTY1=ZKB2; PWMDTY5=100;

PWMDTY2=0; PWMDTY3=0; PWMDTY4=0;

PWME=0X3F;

}

void B_C(void)

{

PWMPOL_PPOL2=1; PWMPOL_PPOL3=0; PWMPOL_PPOL5=1;

PWMPOL_PPOL0=1; PWMPOL_PPOL1=1; PWMPOL_PPOL4=1;

PWMDTY2=ZKB1; PWMDTY3=ZKB2; PWMDTY5=100;

PWMDTY0=0; PWMDTY1=0; PWMDTY4=0;

PWME=0X3F;

}

void B_A(void)

{

PWMPOL_PPOL2=1; PWMPOL_PPOL3=0; PWMPOL_PPOL1=1;

PWMPOL_PPOL0=1; PWMPOL_PPOL4=1; PWMPOL_PPOL5=1;

PWMDTY2=ZKB1; PWMDTY3=ZKB2; PWMDTY1=100;

PWMDTY0=0; PWMDTY4=0; PWMDTY5=0;

PWME=0X3F;

}

void C_A(void)

{

PWMPOL_PPOL4=1; PWMPOL_PPOL5=0; PWMPOL_PPOL1=1;

PWMPOL_PPOL0=1; PWMPOL_PPOL2=1; PWMPOL_PPOL3=1;

PWMDTY4=ZKB1; PWMDTY5=ZKB2; PWMDTY1=100;

PWMDTY0=0; PWMDTY2=0; PWMDTY3=0;

PWME=0X3F;

}

void C_B(void)

{

PWMPOL_PPOL4=1; PWMPOL_PPOL5=0; PWMPOL_PPOL3=1;

PWMPOL_PPOL0=1; PWMPOL_PPOL1=1; PWMPOL_PPOL2=1;

PWMDTY4=ZKB1; PWMDTY5=ZKB2; PWMDTY3=100;

PWMDTY0=0; PWMDTY1=0; PWMDTY2=0;

PWME=0X3F;

}

//***************************************************//

//*********************正转换相函数**********************//

void A_B_C_ZHENG(void)

{

switch(WZ)

{

case 1:C_A();break;

case 2:C_B();break;

case 3:A_B();break;

case 4:A_C();break;

case 5:B_C();break;

case 6:B_A();break;

}

}

//*********************反转换相函数**********************//

void A_B_C_FAN(void)

{

switch(WZ)

{

case 1:A_C();break;

case 2:B_C();break;

case 3:B_A();break;

case 4:C_A();break;

case 5:C_B();break;

case 6:A_B();break;

}

}

//***************************************************//

void main(void)

{

DisableInterrupts;

INIT_PLL();

INIT_PWM();

INIT_ECT();

INIT_KEY();

EnableInterrupts;

A=PTT_PTT0;

B=PTT_PTT1;

C=PTT_PTT2;

for(;;)

{

if(S1==1)

{

PWME=0X00;

}

else if(ZHENG==1)

{

ZZWZ();

A_B_C_ZHENG();

}

else if(FAN==1)

{

ZZWZ();

A_B_C_FAN();

}

else

PWME=0;

}

}


© 2024 实用范文网 | 联系我们: webmaster# 6400.net.cn