#include <W79E825.H> #define CT P07 #define BT P10 #define AT P11 // set to PWM register unsigned char PWM_Duty_H,PWM_Duty_L;//,Status_Tmp;//Add_DEC; // Time base for 电流、转把、电压 unsigned char TB_ACH1,TB_ACH2,TB_ACH3; // Buffer for 电流、电压 unsigned char ADC_Buffer[16],ADC_Point; unsigned char ADC_Point2,ADC_Buffer2[14]; // 电流处理数据 unsigned int ADC_SUM1,INT_tmp1,INT_tmp2,ADC_SUM2,ADC_SUM3; unsigned char ADC_CH,ADC_H,ADC_L; // ADC request Flag bit ADC_REQ; // ADC_ready request Flag unsigned char ADC_RD; unsigned char PWM_TMR,PWM_MAX_H,PWM_MAX_L; unsigned int PWM_tmp; bit PWM_REQ,PWM_0_Duty; bit BRK_F; unsigned char DS_CNT,KS_TM;//,KS_CNT bit DS_Start,DS_Flag,ZB_Z1,ZB_Z2; unsigned int KS_ADCSUM2; unsigned char KS_PWM_H,KS_PWM_L; //故障指示部分数据 unsigned char Error_Type; //智能助力功能部分数据 bit SenBak,AH_F,AH_Prt,AH_Start; unsigned char AH_TM, AH_ST, AH_CT; unsigned char AH_CNTL, AH_CNTH;// AH_Cy; //信号H时间 信号周期 // 过流保护部分数据 unsigned int Volt_L,ADC_SUM_tmp; unsigned char Vstep,Vstep2,Vstep1; bit PowerOff;//,PowerOff_bak; //堵转处理部分数据 bit DZ_Flag; unsigned char DZ_CNT; unsigned char Detect_Tmp_BAK; //************* 飞车保护 *************************** bit FeiChe_F; //********* 超静音 ****************************** unsigned char CJY_CNT,CYJ_TM,DutyH_B,DutyL_B; bit CJY_F,PG_start; //*********************************************** //* 上电初始化程序 void Reset_Initial(void) { //unsigned int i; P1M1=0x3c;//3f; P1M2=0xc3;//c0; P1=0xc0; P0M1=0x7c; P0M2=0x83; P0ID=0x78; P0=3; P2M1=0x01; P2M2=0x02; P2=00; TH0=0Xba;TL0=0Xba; TH1=0x00;TL1=0x00; TMOD=0x22;// timer 0 work in mode1 CKCON&=0X00; // time source as clk/12 ET0=1;// enable timer0 interrupt TR0=1; TR1=1; ET1=1; PWMCON1=0Xc0; PWMPH=0X01;// 设置PWM的状态 PWMPL=0X77; PWM0H=0X00; PWM0L=0Xcc; PWM1H=2; PWM1L=0X00; PWM2H=2; PWM2L=0X00; PWM3H=2; PWM3L=0X00; PWMCON1=0Xc0; AUXR1|=0x04; // 打开ADC电路 EADC=1; // 允许ADC中断 Error_Type=0; PWM_Duty_H=0; PWM_Duty_L=0; ADC_Point=0; ADC_SUM1=0; ADC_REQ=0; ADC_RD=0X55; ADC_SUM2=0; PWM_REQ=0; PWM_TMR=0; PWM_MAX_H=0; PWM_MAX_L=0; PWM_0_Duty=1; PowerOff=0; ADC_SUM_tmp=0x630; DS_Flag=0; DZ_Flag=0; CYJ_TM=0; EA=1; //设置程序开始运行标志,超静音用 PG_start=1; ADC_H=0XFF; while(ADC_H>0x50) { ADCCON=1; ADCCON&=0xef; ADCCON|=0x08; while(ADC_RD==0X55); } EA=0; while(P02==0) { PWM1H=0;PWM2H=0;PWM3H=0; PWM1L=0;PWM2L=0;PWM3L=0; PWMCON1=0Xe0; Vstep=P1; Vstep=Vstep>>2; Vstep&=0x07; switch(Vstep) { case 3://6 BT=0;AT=0;CT=1; break; case 1: //4 BT=0;AT=0;CT=1; break; case 5: //5 case 0: //0 BT=0;CT=0;AT=1; break; case 4: //1 BT=0;CT=0;AT=1; break; case 6: //3 AT=0;CT=0;BT=1; break; case 2: //2 case 7: //7 CT=0;AT=0;BT=1; default: break; } } } //*********************************************** // ADC 转换设置程序 void ADC_Convert(void) { if(ADC_CH==3) {ADCCON=2;} if(ADC_CH==2) {ADCCON=1;} if(ADC_CH==1) {ADCCON=0;} ADCCON&=0xef;ADCCON|=0x08; } //*********************************************** // ADC中断服务程序 void ADC_ISR() interrupt 11 { ADC_RD=0XAA; ADCCON&=0xe7; ADC_H=ADCH; ADC_L=ADCCON&0xc0; } //*********************************************** // 欠压检测设定程序 void ADC_Volt() { TB_ACH3--; if(TB_ACH3<2) { TB_ACH3=20; ADC_CH=3; } } //*********************************************** // 定时器 0 中断服务程序 void T0M1_ISR(void) interrupt 1 { if(CJY_F==1) { CJY_CNT++; if(CJY_CNT>CYJ_TM) { CJY_CNT=0; CJY_F=0; } } PWM_TMR++; if(PWM_TMR==10) { PWM_TMR=0; PWM_REQ=1; } TB_ACH1--; if(TB_ACH1<2) { ADC_REQ=1; ADC_CH=1; TB_ACH1=10; TB_ACH2--; if(TB_ACH2<2) { ADC_CH=2; TB_ACH2=10; } ADC_Volt(); } } //*********************************************** // 自动程序助力 void Autohelp() { if(PWM_0_Duty==1) {if (P20==0) { if(P20==SenBak) { AH_CNTL++; if(AH_CNTL>180) { AH_CNTH=0; AH_CNTL=0; AH_CT=0; } } else { if(AH_CNTH>AH_CNTL) { AH_CT++; } else { AH_CT=0; } AH_CNTL=0; SenBak=P20; if(AH_CT>4) { AH_F=1; AH_CT=0; AH_CNTL=0; AH_CNTH=0; AH_ST=200; } } } else { if(P20==SenBak) { AH_CNTH++; if(AH_CNTH>240) { AH_CNTH=0; AH_CNTH=0; AH_CT=0; } } else { SenBak=P20; AH_CNTH=0; } } } else { AH_CNTL=0; AH_CNTH=0; AH_CT=0; AH_F=0; } if(AH_F==1) { AH_ST--; if(AH_ST<2) AH_F=0; } if(DS_Flag==1) { AH_CT=0; AH_F=0; } } // ********************************************** // 定速设定程序 void KeepSpeed() { if(DS_Flag==0) { DS_Start=0; if (ADC_SUM2>0x508) { PWM_tmp=ADC_SUM2+0x4a; if(PWM_tmp<KS_ADCSUM2) { DS_CNT=0; KS_ADCSUM2=ADC_SUM2; DS_Start=1; } PWM_tmp=ADC_SUM2-0x4a; if(PWM_tmp>KS_ADCSUM2) { DS_CNT=0; KS_ADCSUM2=ADC_SUM2; DS_Start=1; } if (DS_Start==0) { DS_CNT++; if(DS_CNT>70) { DS_CNT=70; DS_Flag=1; KS_PWM_H=PWM_MAX_H; KS_PWM_L=PWM_MAX_L; } } } } else { if (ADC_SUM2<0x380) { ZB_Z1=1; if(ZB_Z2==1) { DS_CNT=0; DS_Flag=0; ZB_Z1=0; ZB_Z2=0; } } else { if(ZB_Z1==1) { ZB_Z2=1; } } } } //*********************************************** // 堵转程序 void DZ_Process() { unsigned int DZ_T1; DZ_T1=ADC_SUM_tmp-0x50; if(ADC_SUM1>DZ_T1) { DZ_CNT++; if(DZ_CNT>70) { DZ_CNT=0; DZ_Flag=1; } } DZ_T1=ADC_SUM_tmp-0x100; if(ADC_SUM1<DZ_T1) { DZ_CNT=0; } } //*********************************************** // 定时器1 中断服务程序 void T1M1_ISR(void) interrupt 3 { AH_TM++; if (AH_TM>30) { AH_TM=0; Autohelp(); KS_TM++; if(KS_TM>3) { KS_TM=0; if(P15==0) { KeepSpeed(); } DZ_Process(); } } } //*********************************************** // 加速程序 void speed(void) { unsigned char Detect_Tmp; Detect_Tmp = P1; Detect_Tmp = Detect_Tmp>>2; Detect_Tmp &= 0X07; if(Detect_Tmp != Detect_Tmp_BAK) { Detect_Tmp=P1; Detect_Tmp=Detect_Tmp>>2; Detect_Tmp&=0X07; if(Detect_Tmp != Detect_Tmp_BAK) { Detect_Tmp_BAK = Detect_Tmp; DZ_CNT=0; CJY_F=0; CYJ_TM=0; if(ADC_SUM1>0x730) { CJY_F=1; CYJ_TM=1; } if(ADC_SUM1>0x7a0) CYJ_TM=2; if(ADC_SUM1>0x810) CYJ_TM=3; } } if(DZ_Flag==1) Detect_Tmp=9; if(PowerOff==1) { Detect_Tmp=9; DS_CNT=0; DS_Flag=0; } if(DS_Flag==0) { if(AH_F==0) { if(PWM_0_Duty==1) Detect_Tmp=9; } } if(FeiChe_F==1) Detect_Tmp=9; DutyH_B=PWM_Duty_H; DutyL_B=PWM_Duty_L; if(PG_start==0) { if(CJY_F==1) { DutyH_B=0x01; DutyL_B=0x77; } } else { CJY_F=0; } PG_start=0; if(P02==0)//刹车处理 { Detect_Tmp=9; DS_CNT=0; DS_Flag=0; ZB_Z1=0; ZB_Z2=0; AH_F=0; AH_CT=0; PWM_Duty_H=0; PWM_Duty_L=0; PWM_MAX_H=0; PWM_MAX_L=0; } switch(Detect_Tmp) { case 3://6 PWM3H=0X00;PWM3L=0X00; //Phase 1 PWM2H=0X00;PWM2L=0X00; BT=0;AT=0; PWMCON1=0XE0; PWM1H=DutyH_B;PWM1L=DutyL_B; CT=1; break; case 1: //4 PWM3H=0X00;PWM3L=0X00; //Phase 1 PWM1H=0X00;PWM1L=0X00; BT=0;AT=0; PWMCON1=0XE0; PWM2H=DutyH_B;PWM2L=DutyL_B; CT=1; break; case 5: //5 case 0: //0 PWM3H=0X00;PWM3L=0X00; //Phase 1 PWM1H=0X00;PWM1L=0X00; BT=0;CT=0; PWMCON1=0XE0; PWM2H=DutyH_B;PWM2L=DutyL_B; AT=1; break; case 4: //1 PWM1H=0X00;PWM1L=0X00; //Phase 1 PWM2H=0X00;PWM2L=0X00; BT=0;CT=0; PWMCON1=0XE0; PWM3H=DutyH_B;PWM3L=DutyL_B; AT=1; break; case 6: //3 PWM1H=0X00;PWM1L=0X00; //Phase 1 PWM2H=0X00;PWM2L=0X00; AT=0;CT=0; PWMCON1=0XE0; PWM3H=DutyH_B;PWM3L=DutyL_B; BT=1; break; case 2: //2 case 7: //7 PWM3H=0X00;PWM3L=0X00; //Phase 1 PWM2H=0X00;PWM2L=0X00; CT=0;AT=0; PWMCON1=0XE0; PWM1H=DutyH_B;PWM1L=DutyL_B; BT=1; break; case 9: PWM1H=0X00;PWM1L=0X00; //Phase 7 PWM3H=0X00;PWM3L=0X00; PWM2H=0;PWM2L=0; AT=0; CT=0; BT=0; break; default: break; } PWMCON1|=0X40; } void ADC_VoltSum() { unsigned int ttmp; ttmp=ADC_SUM3>>4; ADC_SUM3-=ttmp; ADC_SUM3+=ADCH; if(ADC_SUM3<0xabb)//A20 { Volt_L=ADC_SUM3-0x9c0; } else { Volt_L=0; } if(ADC_SUM3<0x9c0) { PowerOff=1; //PowerOff_bak=1; Volt_L=0; } if(ADC_SUM3>0xa35) { PowerOff=0; } Vstep=0; Vstep1=1; while(Volt_L>0x25) { Vstep++; if(Vstep>8) Vstep=8; Volt_L-=0x20; } if(ADC_SUM3<0xabb) { Vstep2=8-Vstep; if(Vstep2>8) Vstep2=0; } else { Vstep2=0; } } void Monitor_ADC(void) { unsigned int MA_T; if(ADC_RD==0XAA) { ADC_RD=0X55; if(ADC_CH==1) { ADC_SUM1-=ADC_Buffer[ADC_Point]; ADC_Buffer[ADC_Point]=ADC_H; ADC_SUM1+=ADC_H; ADC_Point++; if(ADC_Point==16) ADC_Point=0; } if(ADC_CH==2) { if(ADC_SUM2>ADC_Buffer2[ADC_Point2]) { ADC_SUM2-=ADC_Buffer2[ADC_Point2]; } ADC_Buffer2[ADC_Point2]=ADC_H; ADC_SUM2+=ADC_H; ADC_Point2++; if(ADC_Point2==13) ADC_Point2=0; PWM_0_Duty=0; if(ADC_SUM2<0x03d0) { PWM_MAX_H=0; PWM_MAX_L=0; PWM_0_Duty=1; DZ_CNT=0; DZ_Flag=0; } else { if(ADC_SUM2>0x0c00) { FeiChe_F=1; } MA_T=ADC_SUM2; if(MA_T>0x0a75) { MA_T=0x0a75; } if(MA_T>0x3a0) {PWM_tmp=MA_T-0x3a0;} else {PWM_tmp=0;} //欠压处理*************** if(PowerOff==1) { PWM_tmp=0; } PWM_MAX_H=PWM_tmp>>10; PWM_MAX_L=PWM_tmp>>2; } } if(ADC_CH==3) { ADC_VoltSum(); } } EA=1; if(AH_F==1) { PWM_MAX_H=1; PWM_MAX_L=0x55; } else { if(DS_Flag==1) { PWM_MAX_H=KS_PWM_H; PWM_MAX_L=KS_PWM_L; } } EA=0; if(ADC_REQ==1) { EA=0; ADC_Convert(); ADC_REQ=0; } } // 欠压处理**************** void PWM_ADJ(void) { unsigned int SUB_tmp; //ADC_SUM_tmp if(Vstep1==1) { Vstep1=0; SUB_tmp=0x50; ADC_SUM_tmp=0x880; while(Vstep2>0) { Vstep2--; ADC_SUM_tmp-=SUB_tmp; SUB_tmp-=7; //6 指数曲线斜率 } } if(ADC_SUM1 < ADC_SUM_tmp-5) { INT_tmp1 = PWM_Duty_H*256 + PWM_Duty_L; INT_tmp2 = PWM_MAX_H*256 + PWM_MAX_L; if(INT_tmp1 >= INT_tmp2) { PWM_Duty_H = PWM_MAX_H; PWM_Duty_L = PWM_MAX_L; } else { PWM_Duty_L++; if(PWM_Duty_L>0xfe) { PWM_Duty_L=0; PWM_Duty_H++; } } } if(ADC_SUM1>ADC_SUM_tmp+5) { INT_tmp1=PWM_Duty_H*256+PWM_Duty_L; if(INT_tmp1<0x30) { PWM_Duty_H=0; PWM_Duty_L=0; } else { if(PWM_Duty_L<2) { if(PWM_Duty_H==0) { PWM_Duty_L=0; PWM_Duty_H=0; } else { PWM_Duty_L=254; PWM_Duty_H=0; } } else { PWM_Duty_L--; } } } } ///////////////////////////////////////////////////////////// void main(void) { Reset_Initial(); while(1) { Monitor_ADC(); if(PWM_REQ==1) { PWM_REQ=0; PWM_ADJ(); } speed(); } }
电路在此下载,电路.rar