直流无刷电机驱动程序

#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;

}

}

#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;

}

}


相关文章

  • 四旋翼飞行器无刷直流电机调速系统的设计
  • 四旋翼飞行器无刷直流电机控制系统的设计 时间:2012-02-21 14:07:07 来源:电子设计工程 作者:孟 磊,蒋 宏,罗 俊,钟疏桐 摘要:提出了一种适用于飞行器上的无传感器型无刷直流电机的控制方案.采用ATmega8作为系统控制 ...查看


  • 电动车用无刷直流电机控制器的设计
  • 摘 要 近年来,社会发展快速,而我们生活的环境也在遭受破坏,民众的环境保护意识和资源节约意识不断提高,电动车在这样的机遇下获得很大关注并蓬勃发展.之前有刷直流电机在电动车驱动装置中占据着主导地位,但有刷电机凭借机械换向器和电刷配合进行换向, ...查看


  • 直流电动机工作原理
  • 直流电机(D.C.machine) [编辑本段] 定义 定义输出或输入为直流电能的旋转电机,称为直流电机,它是能实现直流电能和机械能互相转换的电机.当它作电动机运行时是直流电动机,将电能转换为机械能:作发电机运行时是直流发电机,将机械能转换 ...查看


  • 永磁无刷直流电机基本结构及工作原理
  • 伴随着电子控制技术和永磁材料技术的迅速发展,永磁无刷直流电机逐渐发展成熟.由于它作为在电动车的驱动电机使用时,能较好地满足电动车的各种性能要求,价格优势明显,所以很快成为了理想的电动车用驱动电机.如图1所示为电动车上常用的永磁无刷直流电机, ...查看


  • 单片机控制直流电机
  • 毕 业 设 计 ( 2015届 ) 题目: 单片机控制直流电机 完成日期: 2015 年 6 月 5 日 摘 要 近年来由于微型机的快速发展,国外交直流系统数字化已经达到实用阶段.由于以微 处理器为核心的数字控制系统硬件电路的标准化程度高, ...查看


  • 单片机程序设计
  • 引 言 调速能力强,速度变化平滑是直流电机的显著特点,在很多的控制系统中有极为广泛的应用,但是以往使用模拟器件或电路来完成控制直流电机的,这样做有很多问题例如:控制准确度低,稳定性差,这些问题如果仍然有过去的设计是根本无法解决和消除的,并且 ...查看


  • 小型无刷直流电机驱动器设计
  • 小型无刷直流电机驱动器设计 本设计中采用反电势法无位置传感器无刷直流电机驱动策略.反电势法不需要借助位置传感器,仅通过检测反电势信号就可以判断转子位置,具有结构简单.可靠性高等优点[3,4].如图2 所示,为A 相绕组的反电势在一个电周期内 ...查看


  • 直流电机控制
  • 微机应用课程设计报告 题 目: 基于单片机的直流电动机控制器设计 专 业: 班 级: 姓 名: 学 号: 地 点: 时 间:指导老师: 摘要 电动机作为最主要的机电能量转换装置,其应用范围已遍及国民经济的各个领域和人们的日常生活.无论是在工 ...查看


  • 无刷直流电机
  • 无刷直流电机 硬件结构 控制部则依需求转换输入电源频率. 电源部可以直接以直流电输入(一般为 24V) 或以交流电输入(110V/220 V) ,如果输入是交流电就得先经转换器(converter) 转成直流.不论是直流电输入或交流电输入要 ...查看


  • 数控伺服系统组成及原理介绍
  • 数控伺服系统组成及原理介绍 伺服系统是指以机械位置或角度作为控制对象的自动控制系统.它接受来自数控装置的进给指令信号,经变换.调节和放大后驱动执行件,转化为直线或旋转运动.伺服系统是数控装置(计算机) 和机床的联系环节,是数控机床的重要组成 ...查看


热门内容