电动车控制器C语言源代码

上传人:daj****de 文档编号:180399518 上传时间:2023-01-06 格式:DOCX 页数:36 大小:62.23KB
返回 下载 相关 举报
电动车控制器C语言源代码_第1页
第1页 / 共36页
电动车控制器C语言源代码_第2页
第2页 / 共36页
电动车控制器C语言源代码_第3页
第3页 / 共36页
点击查看更多>>
资源描述
#define _E_BIKE_W79E83X_C_#include intrins.h#include E_BIKE_W79E83X.H#include,W79E834.h,( f*主函数*i* T1* * ,ri* *T、*v* T、Tj *T、T* *,rlT* *2、*T、T*T、*7 * T、1、*/void main(void)Init_IO(); / 初始化端口H_Sample();/霍尔信号采样Phase_Change(); / 相位变换AutoHelpEN(l,0xlAA,200);严第一个参数设定助力功能允许与否,1为允许,0为禁止第二个参数设定助力力量(PWM占空比),数值范围:00x355 ,数值越大,力量 越大第三个参数设定助力时间,数值越大,时间越长*/Keep_SpeedEN(lz0x20,6);严第一个参数设定定速巡航功能允许与否,1为允许,0为禁止第二个参数设定定速巡航最低速设置第三个参数设定在巡航点保持多长时间后才进入巡航*/Current_Lim(0xB48);/*过流保护上限值设定OxBOO对应限电流最大大约为2.6A0xB80对应限流值最大大约为3.8A*/LowVoltage_Lim(0x9B0);/*欠压保护下限值设定电池电压为47.9V时ADC采样值为0xB6 = = 0xB60推算电池电压为41V时的采样值为0x9B = 0X9B0推算电池电压为40V时的采样值为0x98 = 0x980*/EABS_Set(l,l);/*第一个参数为滑行充电功能使能,1为允许,0为禁止第二个参数为电刹车功能使能,1为允许,0为禁止*/Speed_LimHW(0,0/0,l);/*硬件控制最大速度参数只能有一个为lo第一个参数对应15km/h第二个参数对应20km/h第三个参数对应30km/h第四个参数对应40km/h*/Speed_LimSW(OxO 1);/*软件控制最大速度参数数值由0x000x20,数值越小速度越大,反之则越小*/while(l)_nop_();/AutoHelpEN(0,0xlAAz100);/Keep_SpeedEN(lz0x20z6);/Current_Lim(0xB50);/LowVoltage_Lim(0x9B0);/EABS_Set(OzO);/Speed_LimHW(0,0,0,1);( f* I/O端口初始化*v*i*T、*i*1、*v*i*1、*i*T、*i*v*i*i* *1、*i*i*v*T、*T、*i*,ri* *1、*i*/void Init_IO(void)/-P0端口设置“/P0Ml=0xBE;P0M2=0x01;/初始化程序P0M1.Y P0M2.Y=00设置I/O端口为普通双向模式P0M1.Y P0M2.Y=01设置I/O端口为推拉模式POM1.Y P0M2.Y=10设置I/O端口为输入(高阻)模式POM1.Y P0M2.Y=ll设置I/O端口为开漏模式*/P0ID=0x78;/设置四个AD端口 0数字输入禁止PO=OxFF;/-P1端口设置/PlMl=OxlC;PlM2=0xC0;Pl=OxFF;/-P2端口设置一/P2Ml=0x01;P2M2=0xlE;P2=0xFF;(f*/*void Init(void)unsigned char i;/-“PWM设置-“/ PWMP PWMn高电平,反之低电平PWMPH=0X03;PWMPL=0X55;PWMOH=OXOO;PWMOL=OXOO;PWM1H=OXOO;PWM1L=OXOO;PWM2H=0X00;PWM2L=0X00;PWMCON1=OXC7; /打开PWM电路,三个PWM 口反相输出PWMCON3=OxFO;/-飞车保护/EA=1;/*do ADCCON=1;ADCCO N&=0xef;ADCCON|=0x08;ADC_Ready=O;while(ADC_Ready);while (ADCH0x60);*/相位检测/while(P02=0)H_Sample();Phase_Detect();/-变量初始化/for (i=0;i32;i+)Current_Bufferi=O;for (i=0;i20;i+)Speed_Bufferi=O;for (i=0;i*v*,ri* *v* * xxT*1、* 1 T、*T1* *i*(* *i*i*i*v* *v*i*1、*T、*i*i*/void ADC_ISR(void) interrupt 11UB=UB;UB=UB;/EADC=0;ADC_Ready=l;ADCCON &二 0xE7;if(Current_REQ) 电流采样Current_REQ=O;if(Curre nt_SUMCurre nt_BufferCurre nt_P)Current_SUM 二 Cur re nt_BufferCurre nt_P;Current_BufferCurrent_P=ADCH;Current_SUM += ADCH;Current_P+;if(Curre nt_P31)Current_P=O;if(Speed_REQ) /转把电压采样Speed_REQ=O;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=O;if(Voltage_REQ) /电源电压采样Voltage_REQ=0; if(Voltage_SUMVoltage_BufferVoltage_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;( f*定时器0中断处理函数*v* x% 1、T*1、*b* T、*7 *T、*b* ,ri*i*b*v* *T、* ,ri*T、*T、*T、*T、*/ = Interrupt Cycle: lOOuS =void TOMl_ISR(void) interrupt 1UB=UB;UB=UB;ADC_Ready=O;Curre nt_REQ=l;Speed_REQ=O;Voltage_REQ=0;ADCC0N=2;Coun t_Speed+;KS_CNT+;AH_Count+;if(Count_Speed5)/17ADCCON=4;Cur re nt_REQ=0;Speed_REQ=l;Coun t_Speed=0;Coun t_Voltage+;if( Count_Voltage5)/50ADCCON=3;Speed_REQ=O;Voltage_REQ=l;Count_Voltage=0;* Keep Speed Setting * KS_Finish();/*Function Set*/if(AH_Count = 100)AutoHelp(); / 自助力AH_Count = 0;if(KS_CNT = 3000)KS_CNT = 0;Keep_Speed(); / 巡航定速Volt_Low(); / 欠压保护if(P02=0)Brake_Setting(); / 刹车ADCCO N&=0 xef;ADCCON |=0x08;EADC=1;PWM_ADJ();(f*定时器1中断处理函数*i* x% P* *v* T1* * Tj *1、*T、T* *1、*,rrr* *T、*T、*1、*/void TlMl_ISR(void) interrupt 3_nop_();(f jS*定时器2捕获模式中断处理函数*i* x% P* *v* T1* * Tj *1、*T、T* *1、*,rrr* *T、*T、*1、*/void Timer2_ISR() interrupt 13 using 2*Motor Speed*/MotorSpeed = TH2;TH2 = 0;TL2 = 0;H_Sample(); /霍尔信号采集Phase_Change(); / 相位变换( t*定时器2溢出中断处理函数*I夕卜部中断处理函数,过流中断 x% *7 *I* x% *T、*v* T* T*T、*T、*T0 *T、*1、T、*T、*1、*T、T*1、*b*v* *1*i*i*T、*i* T、*T*T、*1 *T、*7 *T、*/*/void T2_ISR() interrupt 8TF2 = 0;Motor_Speed = 0x50;Block_Detect();堵转保护( t*void INT1_ISR() interrupt 2CurrentOver_Count+;if(CurrentOver_Count = 5)/ 防扌理PWM_Duty_mi n = i;Curre ntOver_Count = 0;(zys *v*i* T、*i*i* T、*i*T、T、*T、*T、*T、*T、*T、*i*T、*T、*i* T、*定时器3中断处理函数z采取捕获模式* xy% *T、V*T、*1、*i* ,r(* ,rri*T*T、* T* T* ,rrT* T、T、*T、*7 *T、*T*T、*/void H_Sample(void)CAPCONI &二 0xF8;H1=P12;H2=P07;H3=P20;doStatel=Hl2; Statel+=H2*1、*I*i*I* 1*I*I*v*I* 1*I* *v*T、*i*i*i*T、*i*i*T、*i*i*i*v*/void Phase_Change(void)if(EABS_Flag)if(!AutoHelp_Flag)UB = 1;VB = 1;WB = 1;_nop_();UT = 1;VT = 1;WT = 1;else if(PWM_Duty_min)UT=0;VT=0;WT=0;UB=1;VB=1;WB=1;/ 电机停转elseswitch(H_State)case 6:/ 110zV3,V4VT=O;UT=O;VB=1;WB=1;_nop_();WT=1;UB=O;break;case 2:/ 010zV4,V5case 7:UT=O;WB=O;VB=1;WB=1;_nop_();VT=1;UB=O;break;case 3:/ 011zV5,V6UT=O;WT=O;UB=1;VB=1;_nop_();VT=1;WB=O;break;case 1:/ 001zV6,VlWT=O;VT=O;UB=1;VB=1;_nop_();UT=1;WB=O;break;case 5:/ 1O1ZV1,V2case 0:WT=0;VT=0;UB=l;WB=l;_nop_();VB=0;UT=l;break;case 4:/ 100,V2,V3UT=O;VT=O;UB=1;WB=1;_nop_();WT=1;VB=O;break;case 9:UT=O;VT=O;WT=O;UB=1;VB=1;WB=1;break;default: break;/*if(PWM_Duty_min)UT=O;VT=O;WT=O;UB= 1;VB= 1;WB= 1;/ 电机停转*/( t*相位检测程序* 上桥臂:VT , UT , WT* 下桥臂:VB , UB , WB*i*i*i* *i*i*b*b*T、*i*T、*i*i*i*i*i*i*b*v* *b*i*i*e*1、*b*T、*i*i*/void Phase_Detect(void)WT=0;UT=0;VT=0;switch(H_State)case 6:/ 110zV3,V4UB=O;VB=1;WB=1; break;case 2:/ 010zV4,V5case 7:UB=O;VB=1;WB=1; break;case 3:/ 011,V5zV6UB=1;VB=1;WB=O; break;case 1:/ 001,V6,VlUB=1;VB=1;WB=O; break;case 5:/ 1O1,V1,V2case 0:UB=1;VB=O;WB=1; break;case 4:/ 100,V2,V3UB=1;VB=O;WB=1; break;default: break;(f jX* PWM值转换衙* 在限流允许下,将转把电压ADC值转换为PWMn的值 * 电流超过限流值时,做限流处理ijij* xy% *v* 1、*1、*1、*T、*i* *1*T T* *1、*1、*/void PWM_ADJ(void)/=没有超过限流最大值的情况二二二二if(Current_SUM Current_Max)if(Speed_SUM Speed_Low)没有转把电压,由Speed_Low的值决定转把电压最小值/if(!KeepSpeed_Flag)if(!AutoHelp_Flag) 定速,助力功能下电机正常转动,否则电机停转/PWM_Duty=0;/PWM_Duty_min=l; 停转标志/PWM_Duty_Max = 0;if(Motor_Speed 0x010)if(P02=l)if(EABS_SlipEN)EABS_Flag = 1;if(PWM_Duty_Max0x06F0)PWM_Duty_Max = 0x06E8;/ 最大值限制PWM_Duty_Max=PWM_Duty_Maxl; / 由转把电压转换为 PWMn 的值if(AutoHelp_Flag)PWM_Duty_Max=AH_Duty; / 助力下为 PWMn 赋值EABS_Flag = 0;if(KeepSpeed_Flag)PWM_Duty_Max=KS_PWM_Duty; / 定速模式下为 PWMn 赋值AutoHelp_Flag = 0;/定速巡航状态时无助力if(PWM_Duty SP_Lim)PWM_Duty+; /转把电压相对应的PWMn值缓慢增加仃 0X0 =ZncChlMd/ 仃二 U!Ui_A4na_hJMdQX厂OMOd) J!(w XM ) IK0 UhIMd w / XddOXO $ MnaWMd) = 1_MnaH/Vd f8MnaWMd = HA4na_H/Vdna_lAlMd9S|9/細 uwMd / SncFwMd(乙0X0 激II篦垦 UHMd 60型曲Of笳 / -A4na_WMd( A4na_WMd)J!9S|9PWM_Duty_L = 0x20; 测试之用PWM_Setting();( t*过流保护上限值设定* 0x1600对应限电流最大大约为2.6A* 0x1700对应限流值最大大约为3.8A*Ii* xy% *T、*T、*i* T、*T、*v*i*i*i* *v* T、*T、*T、*T、*T、*T、* xy% *T、*T、*i* T、*T、*v*i*i*i* *v* T、*T、*T、*T、*T、*T、*/*/void Current_Lim(unsigned int CM)Cur re nt_Max = CM;( t*void Volt_Low(void)if(Voltage_SUM 200)Power_Off=l;elsePower_Off=0;Voltage_Count = 0;( f*欠压保护下限值设定 * 电池电压为47.9V时ADC采样值为0xB6 = 0xB60* 推算电池电压为41V时的采样值为0x9B = = 0X9B0* 推算电池电压为40V时的采样值为0x98 = = 0x980*I* xy% *T0 *i* *|* *T、*i* *T、*i* T、*T、*v*i* T*1、*T、*T、*T、T*T、* *y*/void LowVoltage_Lim(unsigned int CM)Voltage_Mi n = CM;( f*软件控制最大速度 * 分为四个档位23 4 分别对应 15km/h , 20km/h , 30km/h f 40km/h*i* xy% *T0 *i* i* *T、*i* *T、*i* T、*T、*v*i* T*1、*T、*T、*T、*T1* *T、* *y*/void Speed_LimSW(unsigned char SG)SP_Lim = SG;(t 1*硬件控制最大速度 * 分为四个档位 SGi z SG2 z SG3 z SG4 分别对应 15km/h , 20km/h # 30km/h , 40km/h*i* x% *TJ *1、*T、*1、*i* T、*T、T*T* *T、*T、*T*T、*T、*T、*/void Speed_LimHW(bit SGI,bit SG乙bit SG3,bit SG4)SP_Lim = 0x01;if(SG4)SP_Lim = 0x01;else if(SG3)SP_Lim = 0x03;else if(SG2)SP_Lim = 0x05; else if(SGl)SP_Lim = 0x08;( t*堵转保护程序*i* *TJ *1、*T、*1、*i* T、*T、T*T* *T、*T、*T*T、*T、*T、*/void Block_Detect(void)if(Current_SUM Current_Max - 0x80)Block_CNT+;elseBlock_CNT = 0; if(Block_CNT = 20) PWM_Duty_mi n = 1;Block_Flag = 1;AutoHelp_Flag = 0;KeepSpeed_Flag = 0;UT=0;VT=0;WT=0;UB=1;VB=1;WB=1;/ 电机停转(*刹车功能T* xy% p* T*T、*i*T1* T*T、*T、T,rlT*1、*T1*T、*T、*i* T、*T、*T、* ,ri* *1、*,ri*T、*/void Brake_Setting(void)unsigned char i; KeepSpeed_Flag = 0; AutoHelp_Flag = 0; PWM_Duty_mi n = 1; Block_Flag = 0;UB = 1;VB = 1;WB = 1;Speed_SUM = 0;for(i=0;i20;i+)Speed_Bufferi = 0;if(EABS_BrakeEN) / 电子刹车if(Speed_SUM *T、*1、*v* *T、*i* *T、*T、*1、*T、*1、*T*/*void Slip_Settjng(void)if(EABS_SlipEN)VB = 1;WB = 1;_nop_();EABS_Flag = 1;UT = 1;VT = 1;WT= 1;( f*电刹车功能使能* EBS_EN :滑行充电功能使能* EBB_EN :电刹车功能使能*I* x% *i* *v* T、*T、* T、T、*T、*T、*/void EABS_Set(bit EBS_EN,bit EBB_EN)EABS_SlipEN = EBS_EN;EABS_BrakeEN = EBB_EN;(f |S*1:1自动程序助力*电动车中轴速度传感器(单开关霍尔信号),当转动中轴时严生高低电平信号。*当芯片连续接收到6个占空比大于50%的方波信号时输出驱动信号,* PWM打开为50%*I* 1*1、*I*I* *T、*T、*i*v1*i* T*1、*T、*1、*T、*T1、*i1*/void AutoHelp(void)PWM_Duty_mi n = 0;设定转把不转时才有助力功能if(Speed_SUM 40) 低电平超过一定值后认为没有助力AH_CNTH=0; /高电平计数值清零AH_CNTL=0; 低电平计数值清零AH_CT=0; /占空比大于50%的方波(脉冲)计数值清零else 状态改变if(AH_CNTHAH_CNTL)AH_CT+; /占空比大于50%的方波(脉冲)计数值赠加elseAH_CT=O;/不是连续大于50%的方波AH_CNTL=O;SenBak=P01;/保存状态if(AH_CT=6)/连续3个占空比大于50%的方波(脉冲)AutoHelp_Flag=l;启动助力标志AH_CT=0;/占空比大于50%的方波(脉冲)计数值清零AH_CNTL=0;/低电平计数值清零AH_CNTH=0;/高电平计数值清零AH_KT=AH_Time;/只有一定的助力时间助力端口为高电平elseif(P01=SenBak)AH_CNTH+; /高电平计数if(AH_CNTH60) /持续高电平时间过长则认为同样没有助力 AH_CNTH=O;AH_CNTH=O;AH_CT=O;elseSenBak=P01;AH_CNTH=O; /高电平计数值清零有转把信号则关闭助力功能elseAH_CNTL=O;AH_CNTH=O;AH_CT=O;AutoHelp_Flag=0;if(AutoHelp_Flag=l) / 有助力存在AH_KT-;if(AH_KT*1、*i*1、*i* *T、*v*i*T* *T、*T、*T、*T、*v* T、*/void AutoHelpEN(bit A_EN,unsigned int A_Duty,unsigned char A_Time)AH_EN = A_EN;AH_Duty = A_Duty;AH_Time = A_Time;(f jS*巡航定速功能*v* ,ri* *T、*1、*i*1、*i* *T、*v*i*T* *T、*T、*T、*T、*v* T、*/void Keep_Speed(void)if( !KeepSpeed_Flag)KS_Point = 1;if (Speed_SUM (Speed_Low + KS_LowSpeed) / 转速在一定值之上时才可 定速if(Speed_SUM+0x40) KS_TempData) 转把已经旋动低于范围,重 新寻找綢点KS_Count = 0;/巡航计数归0KS_TempData = Speed_SUM; / 保持状态值KS_Point = 0;if (KS_Point) /在巡航(定速)点上KS_Count+; /巡航定速时间计数if(KS_Count KS_Time) /转把在某个位置(速度保持了一段时间)停 留了一段时间KS_Count = KS_Time;KeepSpeed_Flag = 1;/巡航定速标志位置位if(!KS_EN)KeepSpeed_Flag = 0;( f*巡航定速功能结束*i1*i* X、*v*i*e*1、*T、*v*b*v1* *i*i*i* * *i *i*i*i*i1*i*1、*i*i1*/void KS_Finish(void)if(KeepSpeed_Flag)if (Speed_SUM *T、*T、*1、1 *T、* *T、*T、V*T、*T、*T、*/void Keep_SpeedEN(bit K_EN,unsigned char K_LowSpeed,unsigned char K_Time)KS_EN = K_EN;KS_LowSpeed = K_LowSpeed;KS_Time = K_Time;( t*ijij* xy% *v*1、*v* 1、*1、*T、*i*i*T*T*1* T*T、*0、*1、T*T、*,r*1、*/void PWM_Setting(void)PWMOH=PWM_Duty_H;PWMOL二 PWM_Duty_L;PWMlH=PWM_Duty_H;PWMiL二PWM_Duty_L;PWM2H二PWM_Duty_H;PWM2L=PWM_Duty_L;PWMC0N1 |= 0x40;( t*T、* *i* T、T、* *y ,ri* T、*T、T、T、* * * *i*T、
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!