发布单相电机的控制源代码!!!
发布单相电机的控制源代码MCU:AVR M8及以上的单片机!
6个NPN三极管
6个继电器
四个按钮开关
4个LED灯!!
/***********************************************************************************/
#include<iom128v.h>
#include<macros.h>
/*系统重要参数定义*/
#define uchar unsignedchar
#define uint unsignedint
#define Power_Transistor 1/*"0"=PNP,"1"=NPN*/
#define Led_ode 0/*"1"=送出高电平亮,"0"=送出低电平亮*/
#define Clock_Fre 8000000
/*系统资源分配及其管教定义*/
#define Switch_Stop PB0
#define Switch_Forward PB1
#define Switch_Inversion PB2
#define Switch_Start_stop PB3
#define Start_stop_LedSignal PB4
#define Inversion_LedSignalPB5
#define Forward_LedSignal PB6
#define Stop_LedSignal PB7
#define Beep_Led_Flage PD1
#define Power_Switch1 PD2
#define Power_Switch2 PD3
#define Brige_Arm1 PD4
#define Brige_Arm2 PD5
#define Brige_Arm3 PD6
#define Brige_Arm4 PD7
/*系统主要宏定义*/
#if ( (Clock_Fre/1000000)>16 )
#errorCrystal of your choice too,please select it again!
#else
#define DELAY_NUM 5*(Clock_Fre/1000000)
#define DELAY_Dead DELAY_NUM*2
#endif
#define Stop_Flage Switch_Stop
#define Forward_Flage Switch_Forward
#define Inversion_Flage Switch_Inversion
#define Start_stop_Flage Switch_Start_stop
#define SS_Led_Flage Start_stop_LedSignal
#define Inversion_Led_FlageInversion_LedSignal
#define Forward_Led_Flage Forward_LedSignal
#define Stop_Led_Flage Stop_LedSignal
/*系统标志位定义*/
uchar SystemRun_Flage; /*系统运行标志*/
uchar Motor_Inversion; /*电机反转标志*/
uchar Motor_Forward; /*电机正转标志*/
uchar Sys_Stop_Flage; /*系统启/停标志*/
//
uchar Forward_Views;
uchar Inversion_Views;
uchar SystemRun_Views;
uchar KeyVal;
voidBeep_Mes(uchar number);
/* 各个功能函数 */
/*电源开关函数之打开电源函数*/
voidPower_On()
{
#if( Power_Transistor==0 )
PORTD&=~(BIT(Power_Switch1)|BIT(Power_Switch2));
#else
PORTD|=BIT(Power_Switch1)|BIT(Power_Switch2);
#endif
}
/*关闭电源函数*/
void Power_Off()
{
#if( Power_Transistor==0 )
PORTD|=BIT(Power_Switch1)|BIT(Power_Switch2);
#else
PORTD&=~(BIT(Power_Switch1)|BIT(Power_Switch2));
#endif
}
/*电机正转函数*/
voidMot_Forward()
{
#if(Led_ode==1) /*因LED灯的极性定义开关值*/
PORTB&=~(BIT(Stop_Led_Flage)|BIT(Inversion_Led_Flage));
PORTB|=BIT(Forward_Led_Flage);
#else
PORTB|=BIT(Stop_Led_Flage)|BIT(Inversion_Led_Flage);
PORTB&=~(BIT(Forward_Led_Flage));
#endif
PORTD|=BIT(Brige_Arm1)|BIT(Brige_Arm4)|BIT(Brige_Arm2)|BIT(Brige_Arm3);
}
/*电机反转函数*/
voidMot_Inversion()
{
#if(Led_ode==1) /*因LED灯的极性定义开关值*/
PORTB&=~((BIT(Stop_Led_Flage)|BIT(Forward_Led_Flage));
PORTB|=1<<Inversion_Led_Flage;
#else
PORTB|=BIT(Stop_Led_Flage)|BIT(Forward_Led_Flage);
PORTB&=~(BIT(Inversion_Led_Flage));
#endif
PORTD&=~(BIT(Brige_Arm1)|BIT(Brige_Arm4)|BIT(Brige_Arm2)|BIT(Brige_Arm3));
}
/*电机定转函数*/
voidMot_Stop()
{
#if(Led_ode==1) /*因LED灯的极性定义开关值*/
PORTB&=~(BIT(Forward_Led_Flage)|BIT(Inversion_Led_Flage));
PORTB|=BIT(Stop_Led_Flage);
#else
PORTB|=BIT(Forward_Led_Flage)|BIT(Inversion_Led_Flage);
PORTB&=~(BIT(Stop_Led_Flage));
#endif
Power_Off();
}
/********************系统延时函数************************************
函数名:系统延时函数
功 能:给系统各模块提供延时功能
参 数:uchar delaynumber
delaynumber:具体要延时的时间参数。
逻辑说明:无
返回值:无
修改日期:01-04-2010
作者:qhshilin
*******************************************************************/
voidDelay(uchar delaynumber)
{
uint x;
while(delaynumber--)
{
for(x=0;x>1141;x++);x=1141;
}
}
/********************正向转动函数*********************************
函数名:正向转动函数
功 能:实现电机的正向转动
参 数:无
逻辑说明:前提是系统必须运行中,如果是第一次运行该函数,先断电后
启动正方向转动函数,因为要防止电桥发生死区;如果是第二
次运行,直接运行正方向转动函数并报警。
返回值:无
修改日期:01-04-2010
作者:qhshilin
*******************************************************************/
void Forward_M()
{ uchar cont;
Inversion_Views=0;
Forward_Views++;
if(Forward_Views==2) {Forward_Views=1,Beep_Mes(2);Mot_Forward();}
else
{
Power_Off();
for(cont=DELAY_NUM*DELAY_Dead ;/*DELAY_NUM为总的延时次数参数,*/
/*DELAY_Dead为电桥电压死区的延时参数
保证电桥没有电压死区提供足够的时间*/
cont>0;cont--)
{
Delay(200);Delay(200);Delay(100);
}
Mot_Forward();
Power_On();
}
}
/********************反向转动函数***********************************
函数名:反向转动函数
功 能:实现电机的反向转动
参 数:无
逻辑说明:前提是系统必须运行中,如果是第一次运行该函数,先断电后启
动反方向转动函数,因为要防止电桥发生死区;如果是第二次运行,直接运
行反方向转动函数并报警。
返回值:无
修改日期:01-04-2010
作者:qhshilin
*******************************************************************/
void Inversion_M()
{
ucharcont;
Forward_Views=0;
Inversion_Views++;
if(Inversion_Views==2) {Inversion_Views=1,Beep_Mes(2);Mot_Inversion();}
else
{
Power_Off();
for(cont=DELAY_NUM*DELAY_Dead/*DELAY_NUM为总的延时次数参数,
DELAY_Dead为电桥电压死区的延时参数
保证电桥没有电压死区提供足够的时间*/
;cont>0;cont--)
{
Delay(200);Delay(200);Delay(100);
}
Mot_Inversion();
Power_On();
}
}
/********************停转函数****************************************
函数名:停转电机
功 能:停止电机转动
参 数:无
逻辑说明:在系统没有运行之前,按住这个按钮,进行报警,在已经
停止电机转动之后,再次按下这个按钮再次进行报警。
返回值:无
修改日期:01-04-2010
作者:qhshilin
*******************************************************************/
voidStop_M()
{
if(Inversion_Views||Forward_Views)
{
Power_Off();
Mot_Stop();
Inversion_Views=Forward_Views=0;
}
else
Beep_Mes(3);
}
/********************报警函数****************************************
函数名:报警函数
功 能:报警显示
参 数:uchar number
number:要报警显示的次数,类型:uchar;
逻辑说明:无
返回值:无
修改日期:01-04-2010
作者:qhshilin
*******************************************************************/
voidBeep_Mes(uchar number)
{
uchar x, cont;
x=number;
while(x--)
{
#if(Led_ode==1)
PORTD|=BIT(Beep_Led_Flage);
#else
PORTD&=~(BIT(Beep_Led_Flage));
#endif
for(cont=DELAY_NUM;cont>0;cont--)
{
Delay(200);Delay(200);Delay(100);
Delay(200);Delay(200);Delay(100);
}
#if(Led_ode==1)
PORTD&=~(BIT(Beep_Led_Flage));
#else
PORTD|=BIT(Beep_Led_Flage);
#endif
for(cont=DELAY_NUM;cont>0;cont--)
{
Delay(200);Delay(200);Delay(100);
Delay(200);Delay(200);Delay(100);
}
}
}
void main()
{
void (*FunPointer)();
void (*FunPointer2)(uchar x);
uchar Val;
DDRD=0xff;
PORTD&=252;
#if( Power_Transistor==0 )
PORTD&=~(BIT(Brige_Arm1)|BIT(Brige_Arm4)|BIT(Brige_Arm2)|BIT(Brige_Arm3));
#else
PORTD|=BIT(Brige_Arm1)|BIT(Brige_Arm4)|BIT(Brige_Arm2)|BIT(Brige_Arm3);
#endif
Power_Off();
DDRB=0xff;
#if(Led_ode==1)
PORTB=0x0f;
#else
PORTB=0xff;
#endif
PORTB|=0x0f;
DDRB=0xf0;
Val=PINB%16;
if(Val!=15)goto Error;
FunPointer2=Beep_Mes;
(*FunPointer2)(3);
ok: //系统工作
while(1)
{
Rep: Val=PINB%16;
if(Val!=15)
{
Delay(250);Delay(250);
Val=PINB%16;
if(Val!=15)
{
KeyVal=Val;
while((PINB%16)!=15);
goto State;
}
}
else
goto Rep;
State:
if(KeyVal==7)
{
SystemRun_Views++;
if(SystemRun_Views==1)
{
SystemRun_Flage=1;
#if(Led_ode==1)
PORTB|=BIT(SS_Led_Flage);
#else
PORTB&=~(BIT(SS_Led_Flage));
#endif
}
else
if(SystemRun_Views==2)
{
SystemRun_Views=0;SystemRun_Flage=0;
#if(Led_ode==1)
PORTB&=~(BIT(SS_Led_Flage));
#else
PORTB|=BIT(SS_Led_Flage);
#endif
#if(Led_ode==1)
PORTB&=~(BIT(Stop_Led_Flage)|BIT(Inversion_Led_Flage)|BIT(Forward_Led_Flage));
#else
PORTB|=(BIT(Stop_Led_Flage)|BIT(Inversion_Led_Flage)|BIT(Forward_Led_Flage));
#endif
Power_Off();
Inversion_Views=Forward_Views=0;
}
}
if(SystemRun_Views&&(KeyVal==11)) FunPointer=Inversion_M,(*FunPointer)();
else
if(SystemRun_Views&&(KeyVal==13)) FunPointer=Forward_M,(*FunPointer)();
else
if(SystemRun_Views&&(KeyVal==14)) FunPointer=Stop_M,(*FunPointer)();
else
if(KeyVal==7) ;
else
{FunPointer2=Beep_Mes;(*FunPointer2)(2);}
KeyVal=0;
goto Rep;
}
Error:
while(1)
{FunPointer2=Beep_Mes;
(*FunPointer2)(3);
Val=PINB%16;
if(Val!=15)goto Error;
else
goto ok;
}
}
/**********************************************************************************/
页:
[1]