电动车论坛
标题:
W79E83x电动自行车控制器方案
[打印本页]
作者:
yjz
时间:
2008-6-12 07:20
标题:
W79E83x电动自行车控制器方案
华邦方案,贴上来让同志们参考
部分程序模块:
**********/#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();
}
}
作者:
zwmcu
时间:
2008-6-12 08:44
顶,这能转了!
作者:
ckks
时间:
2008-6-12 11:20
华帮台湾的 性能怎要产资源呢?
作者:
dsq
时间:
2008-6-12 11:32
ding
作者:
scott_allen
时间:
2008-6-12 12:09
我可爱的杨工,您在哪里啊????你的电路设计风格,我似乎看到你了,一直想联系你,但从你离开深圳后,就再也没见过你了
作者:
云清扬
时间:
2008-6-12 15:05
方振电子总是能给论坛带来惊喜,每次的主题贴都能带来控制器方面深层次的讨论.敬业精神值得我等学习!!
[
本帖最后由 云清扬 于 2008-6-12 15:11 编辑
]
作者:
sheep
时间:
2008-6-14 16:18
好帖子!好帖子!!
作者:
ckks
时间:
2008-6-14 16:19
方振兄估计放弃 ATMEGA48 转向 台湾的 华邦了 祝方振越来越好 。
作者:
yjz
时间:
2008-6-14 20:39
ckks兄:
ATMEGA48的片上资源这么好,加上我们的方案被选为ATMEL代理向客户的宣传推广方案,现在我们的客户是越来越多,实在没理由放弃呀.
我是在网上看到华帮方案,觉得它也许能对搞开发的朋友有点用才发上来的.
最后,谢谢ckks兄的勉励^_^
作者:
deepwhite
时间:
2008-6-15 06:42
华邦2年前就联系过我们,这是他们的初版方案,做得很烂,二版以后就好多了。
看他们的PCB Layout呵呵,多准备点管子烧吧......
[
本帖最后由 deepwhite 于 2008-6-15 06:46 编辑
]
作者:
ckks
时间:
2008-6-17 20:55
想完全用芯片商的 共板量产 还不如早点关门 他们只保证电机转 其实芯片吗 在电动车上抗干扰没有过不了的 台湾芯片吗 供电电源做好点 多用点虑波电容 如 102 103 104 105 都用上。。。。
作者:
lw117
时间:
2008-6-17 22:45
很好,很强大。 没看懂!
作者:
cdzhangfan
时间:
2008-12-15 10:49
谢谢。。。。。
欢迎光临 电动车论坛 (http://ev5s.cn/bbs/)
Powered by Discuz! X3.2