📄 wushua.c
字号:
//*************************************//
// //
// 无刷电动自行车控制程序 //
// 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 + -