|
|
华邦方案,贴上来让同志们参考
部分程序模块:
**********/#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 WM2H=0 WM3H=0;
PWM1L=0 WM2L=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;
}
}
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();
}
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|