電動車控制器C語言源代碼_第1頁
電動車控制器C語言源代碼_第2頁
電動車控制器C語言源代碼_第3頁
電動車控制器C語言源代碼_第4頁
電動車控制器C語言源代碼_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、電動車控制器C語言源代碼. #define _E_BIKE_W79E83X_C_ #include "intrins.h" #include "E_BIKE_W79E83X.H" #include"W79E834.h" /* * 主函數(shù) */ void main(void) Init(); / 初始化 Init_IO(); / 初始化端口 H_Sample(); / 霍爾信號采樣 Phase_Change(); / 相位變換 AutoHelpEN(1,0x1AA,200); /* 第一個參數(shù)設定助力功能允許不否,1為允許,0為禁止 第

2、二個參數(shù)設定助力力量(PWM占空比),數(shù)值范圍:00x355,數(shù)值越大,力量越大 第三個參數(shù)設定助力時間,數(shù)值越大,時間越長 */ Keep_SpeedEN(1,0x20,6); /* 第一個參數(shù)設定定速巡航功能允許不否,1為允許,0為禁止 第二個參數(shù)設定定速巡航最低速設置 . . 第三個參數(shù)設定在巡航點保持多長時間后才進入巡航 */ Current_Lim(0xB48); /* 過流保護上限值設定 0xB00對應限電流最大大約為2.6A 0xB80對應限流值最大大約為3.8A */ LowVoltage_Lim(0x9B0); /* 欠壓保護下限值設定 電池電壓為47.9V時ADC采樣值為0

3、xB6 => 0xB60 推算電池電壓為41V時的采樣值為0x9B => 0x9B0 推算電池電壓為40V時的采樣值為0x98 => 0x980 */ EABS_Set(1,1); /* 第一個參數(shù)為滑行充電功能使能,1為允許,0為禁止 第二個參數(shù)為電剎車功能使能,1為允許,0為禁止 */ Speed_LimHW(0,0,0,1); /* 硬件控制最大速度 參數(shù)只能有一個為1。 第一個參數(shù)對應15km/h 第二個參數(shù)對應20km/h . . 第三個參數(shù)對應30km/h 第四個參數(shù)對應40km/h */ Speed_LimSW(0x01); /* 軟件控制最大速度 參數(shù)數(shù)值由0

4、x000x20,數(shù)值越小速度越大,反之則越小 */ while(1) _nop_(); /AutoHelpEN(0,0x1AA,100); /Keep_SpeedEN(1,0x20,6); /Current_Lim(0xB50); /LowVoltage_Lim(0x9B0); /EABS_Set(0,0); /Speed_LimHW(0,0,0,1); /* * I/O端口初始化 */ void Init_IO(void) /-P0端口設置-/ P0M1=0xBE; . . P0M2=0x01; /* P0M1.Y P0M2.Y=00 設置I/O端口為普通雙向模式 P0M1.Y P0M2.Y

5、=01 設置I/O端口為推拉模式 P0M1.Y P0M2.Y=10 設置I/O端口為輸入,高阻,模式 P0M1.Y P0M2.Y=11 設置I/O端口為開漏模式 */ /P0ID=0x78; / 設置四個AD端口0數(shù)字輸入禁止 P0=0xFF; /-P1端口設置-/ P1M1=0x1C; P1M2=0xC0; P1=0xFF; /-P2端口設置-/ P2M1=0x01; P2M2=0x1E; P2=0xFF; /* * 初始化程序 */ void Init(void) unsigned char i; /-PWM設置-/ . . / PWMP > PWMn 高電平,反之低電平 PWMPH

6、=0X03; PWMPL=0X55; PWM0H=0X00; PWM0L=0X00; PWM1H=0X00; PWM1L=0X00; PWM2H=0X00; PWM2L=0X00; PWMCON1=0XC7; / 打開PWM電路,三個PWM口反相輸出 PWMCON3=0xF0; /-飛車保護-/ EA=1; /*do ADCCON=1; ADCCON&=0xef; ADCCON|=0x08; ADC_Ready=0; while(ADC_Ready); while (ADCH>0x60);*/ /-相位檢測-/ while(P02=0) H_Sample(); Phase_Det

7、ect(); . . /-變量初始化-/ for (i=0;i<32;i+) Current_Bufferi=0; for (i=0;i<20;i+) Speed_Bufferi=0; for (i=0;i<16;i+) Voltage_Bufferi=0; Current_P=0; Speed_P=0; Voltage_P=0; Speed_SUM=0; / PWM_MAX=0; Current_SUM=0; Voltage_SUM=0; H_State=0; Old_State=0; PWM_Duty=0; / PWM_MAX=0; Count_Current=0; Co

8、unt_Speed=0; Count_Voltage=0; . . Speed_REQ=0; Current_REQ=0; Voltage_REQ=0; ADC_Ready=0; /PWM_Duty=0; PWM_Duty_min=0; /* KeepSpeed_Flag = 0; KS_Z1 = 0; KS_Z2 = 0; Motor_Speed = 0x50; /* AutoHelp_Flag = 0; Current_Max=0xcffe; Speed_Low=0x0500; /Speed_High=0x1c37; /Speed_MAX=0x1c00; /-定時器的設置-/ TH0=0x

9、50;TL0=0x50; / 設定定時器的初值 TH1=0xE0;TL1=0xE0; / 設定定時器的初值 TMOD=0x22; / T0選為定時器,八位,模式2,TL0自動加載TH0中的初值 CKCON&=0X00; / 定時器選擇為1/12系統(tǒng)時鐘 ET0=1; / 允許定時器中斷 TR0=1; / 啟動定時器 ET1=1; TR1=1; . . /-外部中斷設定-/ EX1 = 1; / 允許外部中斷1 IT1 = 0; / 電平觸収中斷1 AUXR1|=0x04; / 打開ADC電路 EADC=1; / 允許ADC中斷 ADCCON &= 0xE7; / Setting

10、s of Timer2 capture mode CKCON=0x60; CAPCON0=0xA8; CAPCON1=0x00; T2MOD=0xF0; IE1 |= 0x80; / enable capture mode interrupt RCAP2L = 0x00; /自動重裝載低位 RCAP2H = 0x00; /自動重裝載高位 IE1 |= 0x40; /EA=1; / enable interrupt T2CON |= 0x04;/enable timer2 /*/ KS_EN = 1; KS_Time = 8; /*/ /* . . * ADC中斷處理程序 */ void ADC

11、_ISR(void) interrupt 11 /UB=UB;UB=UB; /EADC=0; ADC_Ready=1; ADCCON &= 0xE7; if(Current_REQ) / 電流采樣 Current_REQ=0; if(Current_SUM>Current_BufferCurrent_P) Current_SUM -= Current_BufferCurrent_P; Current_BufferCurrent_P=ADCH; Current_SUM += ADCH; Current_P+; if(Current_P>31) Current_P=0; if(

12、Speed_REQ) / 轉把電壓采樣 Speed_REQ=0; if(Speed_SUM>Speed_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_SUM>Voltage_BufferVoltage_P) Voltage_SUM -= Voltage_BufferV

13、oltage_P; Voltage_BufferVoltage_P=ADCH; Voltage_SUM += ADCH; Voltage_P+; if(Voltage_P>15) Voltage_P=0; /PWM_ADJ(); /UB=UB; /* * 定時器0中斷處理函數(shù) */ / = Interrupt Cycle: 100uS = void T0M1_ISR(void) interrupt 1 /UB=UB; /UB=UB; ADC_Ready=0; Current_REQ=1; . . Speed_REQ=0; Voltage_REQ=0; ADCCON=2; Count_Sp

14、eed+; KS_CNT+; AH_Count+; if(Count_Speed>5)/17 ADCCON=4; Current_REQ=0; Speed_REQ=1; Count_Speed=0; Count_Voltage+; if( Count_Voltage>5)/50 ADCCON=3; Speed_REQ=0; Voltage_REQ=1; Count_Voltage=0; /* Keep Speed Setting */ KS_Finish(); /*Function Set*/ if(AH_Count >= 100) AutoHelp(); / 自助力 AH_

15、Count = 0; . . if(KS_CNT >= 3000) KS_CNT = 0; Keep_Speed(); / 巡航定速 Volt_Low(); / 欠壓保護 if(P02=0) Brake_Setting(); / 剎車 ADCCON&=0xef;ADCCON|=0x08; EADC=1; PWM_ADJ(); /* * 定時器1中斷處理函數(shù) */ void T1M1_ISR(void) interrupt 3 _nop_(); /* * 定時器2捕獲模式中斷處理函數(shù) */ void Timer2_ISR() interrupt 13 using 2 . . /*M

16、otor Speed*/ Motor_Speed = TH2; TH2 = 0; TL2 = 0; H_Sample(); / 霍爾信號采集 Phase_Change(); / 相位變換 /* * 定時器2溢出中斷處理函數(shù) */ void T2_ISR() interrupt 8 TF2 = 0; Motor_Speed = 0x50; Block_Detect(); / 堵轉保護 /* * 外部中斷處理函數(shù),過流中斷 */ void INT1_ISR() interrupt 2 CurrentOver_Count+; if(CurrentOver_Count >= 5) / 防抖處理

17、. . PWM_Duty_min = 1; CurrentOver_Count = 0; /* * 定時器3中斷處理函數(shù),采叏捕獲模式 */ void H_Sample(void) CAPCON1 &= 0xF8; H1=P12; H2=P07; H3=P20; do State1=H1<<2; State1+=H2<<1; State1+=H3; _nop_(); _nop_(); State2=H1<<2; State2+=H2<<1; State2+=H3; while(State1!=State2); / 狀態(tài)去抖 H_State

18、=State1; . . /* * 根據(jù)電機霍爾換向信號給出相應控制信號 * 上橋臂:VT,UT,WT * 下橋臂:VB,UB,WB */ 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; / 電機停轉 else . . switch(H_State) case 6: / 110,V3,V4 VT=0;UT=0;

19、VB=1;WB=1; _nop_(); WT=1;UB=0; break; case 2: / 010,V4,V5 case 7: UT=0;WB=0;VB=1;WB=1; _nop_(); VT=1;UB=0; break; case 3: / 011,V5,V6 UT=0;WT=0;UB=1;VB=1; _nop_(); VT=1;WB=0; break; case 1: / 001,V6,V1 WT=0;VT=0;UB=1;VB=1; _nop_(); UT=1;WB=0; break; case 5: / 101,V1,V2 case 0: WT=0;VT=0;UB=1;WB=1; _

20、nop_(); VB=0;UT=1; break; . . case 4: / 100,V2,V3 UT=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_min) UT=0;VT=0;WT=0; UB=1;VB=1;WB=1; / 電機停轉 */ /* * 相位檢測程序 * 上橋臂:VT,UT,WT * 下橋臂:VB,UB,WB */ void Phase_Detect(void) WT=0;UT=0;

21、VT=0; switch(H_State) . . case 6: / 110,V3,V4 UB=0;VB=1;WB=1; break; case 2: / 010,V4,V5 case 7: UB=0;VB=1;WB=1; break; case 3: / 011,V5,V6 UB=1;VB=1;WB=0; break; case 1: / 001,V6,V1 UB=1;VB=1;WB=0; break; case 5: / 101,V1,V2 case 0: UB=1;VB=0;WB=1; break; case 4: / 100,V2,V3 UB=1;VB=0;WB=1; break;

22、default:break; /* * PWM值轉換程序 * 在限流允許下,將轉把電壓ADC值轉換為PWMn的值 * 電流超過限流值時,做限流處理 . . */ 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_mi

23、n=1; / 停轉標志 /PWM_Duty_Max = 0; if(Motor_Speed < 0x010) if(P02=1) if(EABS_SlipEN) EABS_Flag = 1; if(PWM_Duty_Max<0x55) PWM_Duty_Max = 0x055; / 滑行充電 else PWM_Duty_Max = 0; . . PWM_Duty_min=1; / 停轉標志 PWM_Duty=0; else PWM_Duty_Max = 0; PWM_Duty_min=1; / 停轉標志 PWM_Duty=0; else PWM_Duty_Max = 0; PWM_

24、Duty_min=1; / 停轉標志 PWM_Duty=0; Block_Flag = 0; else if(P02 = 1) /-轉把電壓有效-/ PWM_Duty_Max=Speed_SUM-Speed_Low; / 對應轉把電壓的最大計算值 EABS_Flag = 0; if(PWM_Duty_min) if(!Block_Flag) . . PWM_Duty_min = 0; / 退出無有效轉把電壓狀冴 Phase_Change(); / 相序對應 /*if(LowNoise_Flag) PWM_Duty_Max += 0x200; */ if(PWM_Duty_Max>0x06

25、F0) PWM_Duty_Max = 0x06E8; / 最大值限制 PWM_Duty_Max=PWM_Duty_Max>>1; / 由轉把電壓轉換為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; / 定速巡航狀態(tài)時無助力 if(PWM_Duty < PWM_Duty_Max) if(Motor_Speed > S

26、P_Lim) PWM_Duty+; / 轉把電壓相對應的PWMn值緩慢增加 . . else if(PWM_Duty > 3) PWM_Duty-; / 轉把電壓相對應的PWMn值緩慢減小 else PWM_Duty = 0; /=超過限流最大值的情冴=/ else if(PWM_Duty > 0x02) PWM_Duty-; / PWMn值減小 else PWM_Duty=0; PWM_Duty_H = PWM_Duty>>8; PWM_Duty_L = (PWM_Duty & 0x0FF); / 對應PWMn的值,高、低位, if (Power_Off) P

27、WM_Duty_min = 1; / 欠壓保護 /PWM_Duty_H = 0x01; . . /PWM_Duty_L = 0x20; /測試之用 PWM_Setting(); /* * 過流保護上限值設定 * 0x1600對應限電流最大大約為2.6A * 0x1700對應限流值最大大約為3.8A */ void Current_Lim(unsigned int CM) Current_Max = CM; /* * 欠壓保護程序 */ void Volt_Low(void) if(Voltage_SUM < Voltage_Min) / 欠壓狀態(tài) Voltage_Count+; if(V

28、oltage_Count > 200) Power_Off=1; else . . Power_Off=0; Voltage_Count = 0; /* * 欠壓保護下限值設定 * 電池電壓為47.9V時ADC采樣值為0xB6 => 0xB60 * 推算電池電壓為41V時的采樣值為0x9B => 0x9B0 * 推算電池電壓為40V時的采樣值為0x98 => 0x980 */ void LowVoltage_Lim(unsigned int CM) Voltage_Min = CM; /* * 軟件控制最大速度 * 分為四個檔位1,2,3,4分別對應15km/h,20k

29、m/h,30km/h,40km/h */ void Speed_LimSW(unsigned char SG) SP_Lim = SG; . . /* * 硬件控制最大速度 * 分為四個檔位SG1,SG2,SG3,SG4分別對應15km/h,20km/h,30km/h,40km/h */ void Speed_LimHW(bit SG1,bit SG2,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(SG1

30、) SP_Lim = 0x08; /* * 堵轉保護程序 */ void Block_Detect(void) if(Current_SUM > Current_Max - 0x80) Block_CNT+; . . else Block_CNT = 0; if(Block_CNT >= 20) PWM_Duty_min = 1; Block_Flag = 1; AutoHelp_Flag = 0; KeepSpeed_Flag = 0; UT=0;VT=0;WT=0; UB=1;VB=1;WB=1; / 電機停轉 /* * 剎車功能 */ void Brake_Setting(v

31、oid) unsigned char i; KeepSpeed_Flag = 0; AutoHelp_Flag = 0; PWM_Duty_min = 1; Block_Flag = 0; UB = 1; VB = 1; WB = 1; Speed_SUM = 0; for(i=0;i<20;i+) . . Speed_Bufferi = 0; if(EABS_BrakeEN) / 電子剎車 if(Speed_SUM < Speed_Low) PWM_Duty_H = 0x01; PWM_Duty_L = 0x00; EABS_Flag = 1; UT = 1; VT = 1; W

32、T = 1; else UT = 0; VT = 0; WT = 0; PWM_Setting(); /* * 滑行充電功能 */ /*void Slip_Setting(void) . . if(EABS_SlipEN) UB = 1; VB = 1; WB = 1; _nop_(); EABS_Flag = 1; UT = 1; VT = 1; WT = 1; /* * 電剎車功能使能 * EBS_EN:滑行充電功能使能 * EBB_EN:電剎車功能使能 */ void EABS_Set(bit EBS_EN,bit EBB_EN) EABS_SlipEN = EBS_EN; EABS_B

33、rakeEN = EBB_EN; /* * 1:1自動程序助力 * 電動車中軸速度傳感器(單開關霍爾信號),當轉動中軸時產(chǎn)生高低電平信號。 * 當芯片連續(xù)接收到6個占空比大于50%的方波信號時輸出驅動信號, . . * PWM打開為50% */ void AutoHelp(void) if(!Block_Flag) PWM_Duty_min = 0; /-設定轉把不轉時才有助力功能-/ if(Speed_SUM < Speed_Low) /助力端口為低電平/ if (P01=0) if(P01=SenBak) / 狀態(tài)未變 AH_CNTL+; / 低電平計數(shù) if(AH_CNTL>

34、40) / 低電平超過一定值后認為沒有助力 AH_CNTH=0; / 高電平計數(shù)值清零 AH_CNTL=0; / 低電平計數(shù)值清零 AH_CT=0; / 占空比大于50%的方波,脈沖,計數(shù)值清零 else / 狀態(tài)改變 if(AH_CNTH>AH_CNTL) AH_CT+; / 占空比大于50%的方波,脈沖,計數(shù)值贈加 . . else AH_CT=0; / 不是連續(xù)大于50%的方波 AH_CNTL=0; SenBak=P01; / 保存狀態(tài) if(AH_CT>=6) / 連續(xù)3個占空比大于50%的方波,脈沖, AutoHelp_Flag=1; / 啟動助力標志 AH_CT=0;

35、/ 占空比大于50%的方波,脈沖,計數(shù)值清零 AH_CNTL=0; / 低電平計數(shù)值清零 AH_CNTH=0; / 高電平計數(shù)值清零 AH_KT=AH_Time; / 只有一定的助力時間 /助力端口為高電平/ else if(P01=SenBak) AH_CNTH+; / 高電平計數(shù) if(AH_CNTH>60) / 持續(xù)高電平時間過長則認為同樣沒有助力 AH_CNTH=0; AH_CNTH=0; . . AH_CT=0; else SenBak=P01; AH_CNTH=0; / 高電平計數(shù)值清零 /-有轉把信號則關閉助力功能-/ else AH_CNTL=0; AH_CNTH=0;

36、AH_CT=0; AutoHelp_Flag=0; if(AutoHelp_Flag=1) / 有助力存在 AH_KT-; if(AH_KT<2) / 助力只持續(xù)一定時間 AutoHelp_Flag=0; if(KeepSpeed_Flag=1) / 電動車處在巡航狀態(tài) AH_CT=0; AutoHelp_Flag=0; / 關閉助力功能 . . if(!AH_EN) AutoHelp_Flag = 0; /* * 自動助力允許函數(shù) * A_EN:允許助力功能 * A_Duty:助力占空比 * A_Time:助力時間 */ 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; /* * 巡航定速功能 */ void Keep_Speed(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論