直流无刷电机驱动程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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<100;i++)
for(j=0;j<500;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;
}
}