危险刹车信号灯;急刹爆闪灯

电动车论坛

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 4483|回复: 12
打印 上一主题 下一主题

W79E83x电动自行车控制器方案

[复制链接]
跳转到指定楼层
1#
发表于 2008-6-12 07:20:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
华邦方案,贴上来让同志们参考

部分程序模块:

**********/#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=0WM2H=0WM3H=0;
        PWM1L=0WM2L=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
2#
发表于 2008-6-12 08:44:01 | 只看该作者
顶,这能转了!
3#
发表于 2008-6-12 11:20:41 | 只看该作者
华帮台湾的  性能怎要产资源呢?
4#
发表于 2008-6-12 11:32:14 | 只看该作者
ding
5#
发表于 2008-6-12 12:09:08 | 只看该作者
我可爱的杨工,您在哪里啊????你的电路设计风格,我似乎看到你了,一直想联系你,但从你离开深圳后,就再也没见过你了
6#
发表于 2008-6-12 15:05:59 | 只看该作者
方振电子总是能给论坛带来惊喜,每次的主题贴都能带来控制器方面深层次的讨论.敬业精神值得我等学习!!

[ 本帖最后由 云清扬 于 2008-6-12 15:11 编辑 ]
7#
发表于 2008-6-14 16:18:27 | 只看该作者
好帖子!好帖子!!
8#
发表于 2008-6-14 16:19:27 | 只看该作者
方振兄估计放弃 ATMEGA48 转向 台湾的 华邦了  祝方振越来越好  。
9#
 楼主| 发表于 2008-6-14 20:39:26 | 只看该作者
ckks兄:

ATMEGA48的片上资源这么好,加上我们的方案被选为ATMEL代理向客户的宣传推广方案,现在我们的客户是越来越多,实在没理由放弃呀.

我是在网上看到华帮方案,觉得它也许能对搞开发的朋友有点用才发上来的.

最后,谢谢ckks兄的勉励^_^
10#
发表于 2008-6-15 06:42:20 | 只看该作者
华邦2年前就联系过我们,这是他们的初版方案,做得很烂,二版以后就好多了。

看他们的PCB Layout呵呵,多准备点管子烧吧......

[ 本帖最后由 deepwhite 于 2008-6-15 06:46 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|电动车论坛 ( 京ICP证041302号 )

GMT+8, 2025-12-9 07:37 , Processed in 0.093600 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表