⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wushua.c

📁 电动车程序和原理图,该程序和原理已经批量生产,由于不同的电机会有差异,使用时要重新进行一些参数的调整,该程序也可作为一般直流无刷电机驱动程序,具有低成本高性能的特点
💻 C
📖 第 1 页 / 共 2 页
字号:

 //*************************************//
 //										//
 //			无刷电动自行车控制程序			//
 //			Design By	: Sunny.xu		//
 //			Ver			: V1.0			//
 //			Date		: 2004.07.02	//
 //*************************************//



#include <PIC.H>
#include "WUSHUA.h"
#include "delay.h"

 __CONFIG( WDTEN & PWRTEN & BORDIS & HS & PROTECT );
// __IDLOC(AAAA);



 //***********************************
 //
 //			函数声明区
 //
 //***********************************
void	Led_Display(void);
void	Key_Dtc(void);
void	Key_Process(void);
void	Initial(void);
unsigned char	AD_Convert(unsigned char);
void	AD_Sample(void);
void	Alarm_Process(void);
void	Flash_Read(void);
void	Zhuli_Hall_DTC(void);



//*************************************************
//
//		定时器1中断服务子程序
//		定时器1每5ms中断一次
//*************************************************
void    interrupt Int_Tmr1_Sever(void)
	{
		if(TMR1IF)
			{
				TMR1IF=0;
				TMR1H=0xF9;
				TMR1L+=0x40;
				MS_5_OK=1;			//DISPLAY ENABLE
				Cur_Over_Time++;
				if(Cur_Over_Time>100)
					{
						Cur_Over_Time=0;
						TIME_OVER=1;
					}
				if((++Time_Base)==20)	//100ms
					{
						Time_Base=0;
						Time_Motor_Ph++;
						if(Time_Motor_Ph>100)
							{
								Time_Motor_Ph=100;
							}
						if((Main_Flag2&0xE0)==0)
							{
								PWR_ON=0;	//清除首次上电标志
							}
						if(!ERR_DISP_OK) 
							{
								Time_All_Err++;
								if(Time_All_Err<3)	ALL_OFF_1ST=0;
								else if(Time_All_Err<6)ALL_OFF_1ST=1;
								else if(Time_All_Err<9)ALL_OFF_1ST=0;
								else if(Time_All_Err<12)ALL_OFF_1ST=1;
								else if(Time_All_Err<15)ALL_OFF_1ST=0;
								else if(Time_All_Err<18)ALL_OFF_1ST=1;
								else {ERR_DISP_OK=1;Time_All_Err=0;}
							}
						if(MODE_DOWN)	Time_Mode++;
						if(BREAK_EN)	Time_Break++;
						Time_Zhuli++;
						if(Time_Zhuli==5)
							{
								Time_Zhuli=0;
								TIME_ZHULI_OK=1;
							}
					}
				if(ERR_SPEED)
					{
						Time_Speed++;
						if(Time_Speed>Time_Err_Speed)
							{
								ALL_OFF=!ALL_OFF;
								Time_Speed=0;
							}
					}

			}
		if(T0IF)
			{
				T0IF=0;
				TMR0+=83;
				MS_1_OK=1;
			}
		else
			{
				INTCON&=0xF8;
				PIR1=0;
			}

}

//*************************************************
//
//		显示子程序
//
//*************************************************
void	Led_Display(void)
	{
		NOP();
	
	if((Disp_Data_Old!=Main_Flag1)||(Main_Flag1==0)||WITH_ERR)
		{
			Disp_Data_Old=Main_Flag1;
			Disp_Data=Main_Flag1^0xFF;
			if(WITH_ERR)
				{
				if(!ERR_DISP_OK)
					{
						Disp_Data=0x00;
						if(ALL_OFF_1ST)	Disp_Data=0xFF;
					}
				else
					{
						Disp_Data=0xFF;
					if(ERR_SPEED)
						{
						Disp_Data&=0xFE;	//欠压
						if(ALL_OFF) Disp_Data=0xff;
						}
					if(ERR_MODE)
						{
						Disp_Data&=0xDF;	//助力
						}
					if(ERR_BREAK)
						{
						Disp_Data&=0xBF;	//电动
						}
					}
				}
			if(WITH_ERR&&ERR_DISP_OK)
				{
					if(!ZHULI_DTC)	Disp_Data&=0x7F;
					Phase_Dtc_Led=(Phase_Dtc*2)^0xff;
					Disp_Data&=Phase_Dtc_Led;
				}
			for(i=0;i<8;i++)
				{
			    S_CLK=0;
			    S_DATA=Msb_Disp_Data;
		 	    Disp_Data<<=1;
		     	S_CLK=1;
			  	}

		}
	}
//*************************************************
//
//		按键检测子程序
//
//*************************************************
void	Key_Dtc(void)
	{
		Key_Temp0=0;
		NOP();
		if(KEY_MODE)
			{
			Key_Temp0=Key_Temp0|0x10;
			}
		if(BREAK_IN)
			{
			Key_Temp0=Key_Temp0|0x40;
			}
		KEY_ORDER=!KEY_ORDER;
		if(KEY_ORDER)	Key_Data0=Key_Temp0;
		else			Key_Data1=Key_Temp0;
		if(Key_Data0!=KEY_INITIAL)
			{
				if(Key_Data0==Key_Data1)
					{
						if(!KEY_UP)
							{
								KEY_UP=1;				//按键被按下
								KEY_PRO_EN=1;			//可以进行按键处理
								Key_Result=Key_Data0;	//获取键值
							}
						if(MODE_DOWN)	//模式按钮按下
							{
								if(Time_Mode>=DS_MODE_TIME)
									{
										MODE_DOWN=0;
										Time_Mode=0;
										if(DIANDONG)
										{
										ZHULI=0;		//按下时间>2S 进入定速状态
										DIANDONG=0;
										DINGSU=1;
										}
									}
								else if(Time_Mode>=2)
									{
										if(!DIANDONG)
										{
										MODE_DOWN=0;
										Time_Mode=0;
										ZHULI=0;		//按下时间>2S 进入定速状态
										DIANDONG=1;
										DINGSU=0;
										}
									}
							}
						if(BREAK_EN)
							{
								if(Time_Break>=2)
									{
									Time_Break=0;
									BREAK_ST=1;
									if(!ZHULI)
										{
											ZHULI=0;
											DIANDONG=1;
											DINGSU=0;
										}
									}
							}
						
					}

			}
		else
			{
				if(MODE_DOWN)	//模式按钮按下
					{
						if(Time_Mode<DS_MODE_TIME&&Time_Mode!=0)//100ms~1S
							{
								if(DIANDONG)
									{
										DINGSU=0;
										ZHULI=1;		//按下时间<2S 进入助力状态
										DIANDONG=0;
									}
							}
					}
				MODE_DOWN=0;
				Time_Mode=0;
				Time_Break=0;
				KEY_UP=0;		//按键抬起
				BREAK_EN=0;		//清除刹车状态
				BREAK_ST=0;
				if(ERR_MODE||ERR_BREAK)
					{
					Disp_Data_Old=0x55;
					ERR_MODE=0;
					ERR_BREAK=0;
					}
			}

	}

//*************************************************
//
//		按键处理子程序
//
//*************************************************
void	Key_Process(void)
	{
		KEY_PRO_EN=0;		//清按键处理标志
		if(PWR_ON)		//上电第一次检测
			{
				if(!KEY4)	//模式按钮出错
					{
						ERR_MODE=1;
						WITH_ERR=1;
					}
				else
					{
						ERR_MODE=0;
					}
				if(KEY6)	//刹车出错
					{
						ERR_BREAK=1;
						WITH_ERR=1;
					}
				else
					{
						ERR_BREAK=0;
					}
				KEY_UP=0;
				return;		//直接返回
			}

		if(!KEY4)		//模式处理
			{
				if(WORK_STA)		//不在工作状态不处理
					{
						MODE_DOWN=1;	//模式按钮按下
					}
			}
		if(KEY6)		//刹车处理
			{
				BREAK_EN=1;
			}
		KEY_UP=1;
		Key_Result=KEY_INITIAL;
	}


//*************************************************
//
//		变量初始化子程序
//
//*************************************************
void     Initial(void)
	{
        OPTION=0x03;
        TRISA=0xFF;
        TRISB=0xF9;
        TRISC=0x10;
        PR2=0x9D;       //PWM PERIOD=1/18K
        ADCON1=0x04;    //RA0 AR1 RA2 AS ANALOG INPUT
        INTCON=0x60;    //PEIE=1 T0IE
        PIE1=0x01;      //TMR1IE=1

        CCP1CON=0x0C;   //PWM MODE LSB=0
        TMR0=83;
        CCPR1L=0x00;    //INITIAL DUTY=0
        T2CON=0x00;     //TMR2  POSTSCAL=1 PRESCAL=1 TMR2 ON
        ADCON0=0x80;    //AD LOCK=FOSC/32
        PORTA=0X00;
        PORTB=0x08;		//led_power off
        PORTC=0x0B;
        T1CON=0x30;     //TMR1  PRESCAL=8
        TMR1H=0xF9;
        TMR1L=0x40;     //TMR1 INTERRUPT =5ms
        TMR1ON=1;
        TMR2ON=1;
        TMR0=83;

      	#asm
		MOVLW	0X20
		MOVWF	_FSR
CLEAR_RAM1:
		CLRF	0
		INCF	_FSR,F
		BTFSS	_FSR,7
		GOTO	CLEAR_RAM1
		CLRF	_FSR
        #endasm

        ei();
	}
//*************************************************
//
//		AD转换子程序
//	入口:AD_Chnnel
//	出口:ADRES
//*************************************************
unsigned char	AD_Convert(unsigned char AD_Chnnel)
{
	ADCON0=AD_Chnnel;
	DelayUs(10);
	ADGO=1;			//STATR AD CONVERT
	DelayUs(10);
	do
		{
			NOP();
		}
	while(!ADIF);
	ADIF=0;
	ADON=0;			//关闭AD模块
	return(ADRES);
}

//*************************************************
//
//		AD采样子程序
//
//*************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -