1、电动车控制器C语言源代码电动车控制器C语言源代码#defi ne _E_BIKE_W79E83X_C_ #i nclude intrin s.h#in clude E_BIKE_W79E83X.H #i ncludeW79E834.h/*主函数*/void ma in (void)Init(); /初始化In it_IO(); / 初始化端口H_Sample(); /霍尔信号采样Phase_Cha nge(); / 相位变换AutoHelpEN(1,0x1AA,200);/*第一个参数设定助力功能允许不否,1为允许,0为禁止第二个参数设定助力力量(PWM占空比),数值围:00x355,数值越大
2、力量 越大第三个参数设定助力时间,数值越大,时间越长*/Keep_SpeedEN(1,0x20,6);/*第一个参数设定定速巡航功能允许不否,1为允许,0为禁止 第二个参数设定定速巡航最低速设置第三个参数设定在巡航点保持多长时间后才进入巡航*/Curre nt_Lim(0xB48);/*过流保护上限值设定0xB00对应限电流最大大约为2.6A0xB80对应限流值最大大约为3.8A*/LowVoltage_Lim(0x9B0);/*欠压保护下限值设定电池电压为47.9V时ADC采样值为0xB6 = 0xB60推算电池电压为41V时的采样值为0x9B = 0x9B0推算电池电压为40V时的采样值为
3、0x98 = 0x980*/EABS_Set(1,1);/*第一个参数为滑行充电功能使能,1为允许,0为禁止第二个参数为电刹车功能使能,1为允许,0为禁止*/Speed_LimHW(0,0,0,1);/*硬件控制最大速度参数只能有一个为1。第一个参数对应15km/h第二个参数对应20km/h第三个参数对应30km/h第四个参数对应40km/h*/Speed_LimSW(0x01);/*软件控制最大速度参数数值由0x000x20,数值越小速度越大,反之则越小*/while(1)_nop_();AutoHelpEN(0,0x1AA,100);Keep_SpeedEN(1,0x20,6);/Curr
4、e nt_Lim(0xB50);LowVoltage_Lim(0x9B0);EABS_Set(O,O);Speed_LimHW(0,0,0,1);/* I/O端口初始化*/void In it_IO(void)/P0 端口设置/P0M 仁 0xBE;P0M2=0x01;/*P0M1.Y P0M2.Y=00设置I/O端口为普通双向模式P0M1.Y P0M2.Y=01设置I/O端口为推拉模式P0M1.Y P0M2.Y=10设置I/O端口为输入,高阻,模式P0M1.Y P0M2.Y=11设置I/O端口为开漏模式*/P0ID=0x78; /设置四个AD端口 0数字输入禁止P0=0xFF;/P1 端口设
5、置/P1M 1=0x1C;P1M2=0xC0;P1=0xFF;/P2 端口设置/P2M1= 0x01;P2M2=0x1E;P2=0xFF;/*初始化程序*/void In it(void)un sig ned char i;/PWM 设置/ PWMP PWMn 高电平,反之低电平PWMPH=0X03;PWMPL=0X55;PWM0H=0X00;PWMOL=OXOO;PWM1H=0X00;PWM1L=0X00;PWM2H=0X00;PWM2L=0X00;PWMCON仁0XC7; /打开PWM电路,三个PWM 口反相输出PWMCON3=0xF0;/- 飞车保护 /EA=1;/*do ADCCON=
6、1;ADCCO N&=0xef;ADCCON|=0x08;ADC_Ready=0;while(ADC_Ready);while (ADCH0x60);*/- 相位检测/while(P02=0)H_Sample();Phase_Detect();.for (i=0;i32;i+)Curre nt_Bufferi=0;for (i=0;i20;i+)Speed_Bufferi=0;for (i=0;iCurre nt_BufferCurre nt_P)Current_SUM -= Current_BufferCurrent_P;Curre nt_BufferCurre nt_P=ADCH;Curr
7、e nt_SUM += ADCH;Curre nt_P+;if(Curre nt_P31)Curren t_P=0; if(Speed_REQ) /转把电压采样Speed_REQ=0;if(Speed_SUMSpeed_BufferSpeed_P) Speed_SUM-=Speed_BufferSpeed_P; Speed_BufferSpeed_P=ADCH;Speed_SUM+=ADCH;Speed_P+;if(Speed_P = 14)Speed_P=0;if(Voltage_REQ) /电源电压采样Voltage_REQ=0;if(Voltage_SUMVoltage_BufferVo
8、ltage_P)Voltage_SUM -= Voltage_BufferVoltage_P;Voltage_BufferVoltage_P=ADCH;Voltage_SUM += ADCH;Voltage_P+;if(Voltage_P15)Voltage_P=0;PWM_ADJ();UB=UB;/*定时器0中断处理函数*/ = In terrupt Cycle: 100uS =void T0M1_ISR(void) interrupt 1UB=UB;UB=UB;ADC_Ready=0;Curre nt_REQ=1;Speed_REQ=0;Voltage_REQ=0;ADCCON=2;Cou
9、n t_Speed+;KS_CNT+;AH_C oun t+;if(Cou nt_Speed5)/17ADCCON=4;Curre nt_REQ=0;Speed_REQ=1;Coun t_Speed=0;Coun t_Voltage+;if( Cou nt_Voltage5)/50ADCCON=3;Speed_REQ=0;Voltage_REQ=1;Cou nt_Voltage=0;/* Keep Speed Setti ng */KS_Fi nish();/*Fu nction Set*/if(AH_Cou nt = 100)AutoHelp(); / 自助力AH_C ount = 0;if
10、(KS_CNT = 3000)KS_CNT = 0;Keep_Speed(); / 巡航定速Volt_Low(); / 欠压保护if(P02=0)Brake_Sett in g(); / 杀V车ADCCO N&=0xef;ADCCON|=0x08;EADC=1;PWM_ADJ();/*定时器1中断处理函数*/void T1M1_ISR(void) interrupt 3 _nop_();*定时器2捕获模式中断处理函数*/void Timer2_ISR() in terrupt 13 us ing 2 .*Motor Speed*/Motor_Speed = TH2;TH2 = 0;TL2 =
11、0;H_Sample(); /霍尔信号采集Phase_Cha nge(); / 相位变换/*定时器2溢出中断处理函数*/void T2_ISR() in terrupt 8 TF2 = 0;Motor_Speed = 0x50;Block_Detect(); / 堵转保护*外部中断处理函数,过流中断*/void INT1_ISR() in terrupt 2 Curren tOver_C oun t+;if(Curre ntOver_Cou nt = 5) / 防抖处理PWM_Duty_min = 1;Curre ntOver_Cou nt = 0;/*定时器3中断处理函数,采叏捕获模式*/v
12、oid H_Sample(void) CAPCON1 &= 0xF8;H1= P12;H2=P07;H3=P20;doState 1= H12;State1+=H21;State1+=H3;_nop_();_nop_();State2=H12;State2+=H21;State2+=H3;while(State1!=State2); / 状态去抖H_State=State1;./*根据电机霍尔换向信号给出相应控制信号 *上桥臂:VT,UT,WT* 下桥臂:VB,UB,WB*/void Phase_Cha nge(void) if(EABS_Flag)if(!AutoHelp_Flag)UB =
13、 1;VB = 1;WB = 1;_nop_();UT = 1;VT = 1;WT = 1;else if(PWM_Duty_mi n)UT=O;VT=O;WT=O;UB=1;VB=1;WB=1; / 电机停转elseswitch(H_State)case 6: / 110,V3,V4VT=0;UT=0;VB=1;WB=1;_nop_();WT=1;UB=0;break;case 2: / ,V4,V5case 7:UT=0;WB=0;VB=1;WB=1;_nop_();VT=1;UB=0;break;case 3: / 011,V5,V6UT=0;WT=0;UB=1;VB=1;_nop_()
14、;VT=1;WB=0;break;case 1: / 001,V6,V1WT=0;VT=0;UB=1;VB=1;_nop_();UT=1;WB=0;break;case 5: / 101,V1,V2case 0:WT=0;VT=0;UB=1;WB=1;_nop_();VB=0;UT=1;break;case 4: / 100,V2,V3UT=0;VT=0;UB=1;WB=1;_nop_();WT=1;VB=0;break;case 9:UT=0;VT=0;WT=0;UB=1;VB=1;WB=1;break;default:break;/*if(PWM_Duty_m in)UT=0;VT=0;W
15、T=0;UB=1;VB=1;WB=1; / 电机停转*/*相位检测程序*上桥臂:VT,UT,WT*下桥臂:VB,UB,WB*/void Phase_Detect(void)WT=0;UT=0;VT=0;switch(H_State)case 6: / 110,V3,V4UB=0;VB=1;WB=1;break;case 2: / ,V4,V5case 7:UB=0;VB=1;WB=1;break;case 3: / 011,V5,V6UB=1;VB=1;WB=0;break;case 1: / 001,V6,V1UB=1;VB=1;WB=0;break;case 5: / 101,V1,V2c
16、ase 0:UB=1;VB=0;WB=1;break;case 4: / 100,V2,V3UB=1;VB=0;WB=1;break;default:break;/* PWM值转换程序*在限流允许下,将转把电压ADC值转换为PWMn的值*电流超过限流值时,做限流处理*/void PWM_ADJ(void)/=没有超过限流最大值的情冴=/if(Curre nt_SUM Curre nt_Max)if(Speed_SUM Speed_Low) /-没有转把电压,由Speed_Low的值决定转把电压最小值-/ if(!KeepSpeed_Flag)if(!AutoHelp_Flag) /定速,助力功能下电机正常转动,否则电机停转PWM_Duty=O;PWM_Duty_m in=1; / 停转标志PWM_Duty_Max = 0;if(Motor_Speed 0x010)if(P02=1)if(EABS_SlipEN)EABS_Flag = 1;if(PWM_Duty_Max0x06F0)PWM_Duty_Max = 0x06E8; / 最大值限制PWM_Duty_Max=PWM_Duty_Max
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1