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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、電動(dòng)車控制器C語言源代碼. #define _E_BIKE_W79E83X_C_ #include intrins.h #include E_BIKE_W79E83X.H #includeW79E834.h /* * 主函數(shù) */ void main(void) Init(); / 初始化 Init_IO(); / 初始化端口 H_Sample(); / 霍爾信號(hào)采樣 Phase_Change(); / 相位變換 AutoHelpEN(1,0x1AA,200); /* 第一個(gè)參數(shù)設(shè)定助力功能允許不否,1為允許,0為禁止 第二個(gè)參數(shù)設(shè)定助力力量(PWM占空比),數(shù)值范圍:00x355,數(shù)值越大,

2、力量越大 第三個(gè)參數(shù)設(shè)定助力時(shí)間,數(shù)值越大,時(shí)間越長(zhǎng) */ Keep_SpeedEN(1,0x20,6); /* 第一個(gè)參數(shù)設(shè)定定速巡航功能允許不否,1為允許,0為禁止 第二個(gè)參數(shù)設(shè)定定速巡航最低速設(shè)置 . . 第三個(gè)參數(shù)設(shè)定在巡航點(diǎn)保持多長(zhǎng)時(shí)間后才進(jìn)入巡航 */ Current_Lim(0xB48); /* 過流保護(hù)上限值設(shè)定 0xB00對(duì)應(yīng)限電流最大大約為2.6A 0xB80對(duì)應(yīng)限流值最大大約為3.8A */ LowVoltage_Lim(0x9B0); /* 欠壓保護(hù)下限值設(shè)定 電池電壓為47.9V時(shí)ADC采樣值為0xB6 = 0xB60 推算電池電壓為41V時(shí)的采樣值為0x9B = 0

3、x9B0 推算電池電壓為40V時(shí)的采樣值為0x98 = 0x980 */ EABS_Set(1,1); /* 第一個(gè)參數(shù)為滑行充電功能使能,1為允許,0為禁止 第二個(gè)參數(shù)為電剎車功能使能,1為允許,0為禁止 */ Speed_LimHW(0,0,0,1); /* 硬件控制最大速度 參數(shù)只能有一個(gè)為1。 第一個(gè)參數(shù)對(duì)應(yīng)15km/h 第二個(gè)參數(shù)對(duì)應(yīng)20km/h . . 第三個(gè)參數(shù)對(duì)應(yīng)30km/h 第四個(gè)參數(shù)對(duì)應(yīng)40km/h */ Speed_LimSW(0x01); /* 軟件控制最大速度 參數(shù)數(shù)值由0x000x20,數(shù)值越小速度越大,反之則越小 */ while(1) _nop_(); /Aut

4、oHelpEN(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端口設(shè)置-/ P0M1=0xBE; . . P0M2=0x01; /* P0M1.Y P0M2.Y=00 設(shè)置I/O端口為普通雙向模式 P0M1.Y P0M2.Y=01 設(shè)置I/O端口為推拉模式 P0M1.Y P0M2.Y=10 設(shè)置I/O端口為輸入,高阻,

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

6、; PWM1L=0X00; PWM2H=0X00; PWM2L=0X00; PWMCON1=0XC7; / 打開PWM電路,三個(gè)PWM口反相輸出 PWMCON3=0xF0; /-飛車保護(hù)-/ EA=1; /*do ADCCON=1; ADCCON&=0xef; ADCCON|=0x08; ADC_Ready=0; while(ADC_Ready); while (ADCH0x60);*/ /-相位檢測(cè)-/ while(P02=0) H_Sample(); Phase_Detect(); . . /-變量初始化-/ for (i=0;i32;i+) Current_Bufferi=0; for

7、(i=0;i20;i+) Speed_Bufferi=0; for (i=0;iCurrent_BufferCurrent_P) Current_SUM -= Current_BufferCurrent_P; Current_BufferCurrent_P=ADCH; Current_SUM += ADCH; Current_P+; if(Current_P31) Current_P=0; if(Speed_REQ) / 轉(zhuǎn)把電壓采樣 Speed_REQ=0; if(Speed_SUMSpeed_BufferSpeed_P) Speed_SUM-=Speed_BufferSpeed_P; Sp

8、eed_BufferSpeed_P=ADCH; Speed_SUM+=ADCH; Speed_P+; . . if(Speed_P = 14) Speed_P=0; 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_A

9、DJ(); /UB=UB; /* * 定時(shí)器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_Speed+; KS_CNT+; AH_Count+; if(Count_Speed5)/17 ADCCON=4; Current_REQ=0; Speed_REQ=1; Count_Speed=0; Count_Voltage

10、+; if( Count_Voltage5)/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_Count = 0; . . if(KS_CNT = 3000) KS_CNT = 0; Keep_Speed(); / 巡航定速 Volt_Low(); / 欠壓保護(hù) if(P02=0) Brake_Setting(); / 剎車 ADCCON&

11、=0xef;ADCCON|=0x08; EADC=1; PWM_ADJ(); /* * 定時(shí)器1中斷處理函數(shù) */ void T1M1_ISR(void) interrupt 3 _nop_(); /* * 定時(shí)器2捕獲模式中斷處理函數(shù) */ void Timer2_ISR() interrupt 13 using 2 . . /*Motor Speed*/ Motor_Speed = TH2; TH2 = 0; TL2 = 0; H_Sample(); / 霍爾信號(hào)采集 Phase_Change(); / 相位變換 /* * 定時(shí)器2溢出中斷處理函數(shù) */ void T2_ISR() int

12、errupt 8 TF2 = 0; Motor_Speed = 0x50; Block_Detect(); / 堵轉(zhuǎn)保護(hù) /* * 外部中斷處理函數(shù),過流中斷 */ void INT1_ISR() interrupt 2 CurrentOver_Count+; if(CurrentOver_Count = 5) / 防抖處理 . . PWM_Duty_min = 1; CurrentOver_Count = 0; /* * 定時(shí)器3中斷處理函數(shù),采叏捕獲模式 */ void H_Sample(void) CAPCON1 &= 0xF8; H1=P12; H2=P07; H3=P20; do S

13、tate1=H12; State1+=H21; State1+=H3; _nop_(); _nop_(); State2=H12; State2+=H21; State2+=H3; while(State1!=State2); / 狀態(tài)去抖 H_State=State1; . . /* * 根據(jù)電機(jī)霍爾換向信號(hào)給出相應(yīng)控制信號(hào) * 上橋臂: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 =

14、 1; WT = 1; else if(PWM_Duty_min) UT=0;VT=0;WT=0; UB=1;VB=1;WB=1; / 電機(jī)停轉(zhuǎn) else . . switch(H_State) case 6: / 110,V3,V4 VT=0;UT=0;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=

15、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; _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_Dut

16、y_min) UT=0;VT=0;WT=0; UB=1;VB=1;WB=1; / 電機(jī)停轉(zhuǎn) */ /* * 相位檢測(cè)程序 * 上橋臂:VT,UT,WT * 下橋臂:VB,UB,WB */ void Phase_Detect(void) WT=0;UT=0;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: /

17、 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; default:break; /* * PWM值轉(zhuǎn)換程序 * 在限流允許下,將轉(zhuǎn)把電壓ADC值轉(zhuǎn)換為PWMn的值 * 電流超過限流值時(shí),做限流處理 . . */ void PWM_ADJ(void) /=沒有超過限流最大值的情冴=/ if(Current_SUM Current_Max) if(Speed_SUM Speed_Low) /-沒

18、有轉(zhuǎn)把電壓,由Speed_Low的值決定轉(zhuǎn)把電壓最小值-/ if(!KeepSpeed_Flag) if(!AutoHelp_Flag) / 定速,助力功能下電機(jī)正常轉(zhuǎn)動(dòng),否則電機(jī)停轉(zhuǎn) /PWM_Duty=0; /PWM_Duty_min=1; / 停轉(zhuǎn)標(biāo)志 /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_Max1; / 由轉(zhuǎn)把電

19、壓轉(zhuǎn)換為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)時(shí)無助力 if(PWM_Duty SP_Lim) PWM_Duty+; / 轉(zhuǎn)把電壓相對(duì)應(yīng)的PWMn值緩慢增加 . . else if(PWM_Duty 3) PWM_Duty-; / 轉(zhuǎn)把電壓相對(duì)應(yīng)的PWMn值緩慢減小 else PWM_Duty = 0; /=超過

20、限流最大值的情冴=/ else if(PWM_Duty 0x02) PWM_Duty-; / PWMn值減小 else PWM_Duty=0; PWM_Duty_H = PWM_Duty8; PWM_Duty_L = (PWM_Duty & 0x0FF); / 對(duì)應(yīng)PWMn的值,高、低位, if (Power_Off) PWM_Duty_min = 1; / 欠壓保護(hù) /PWM_Duty_H = 0x01; . . /PWM_Duty_L = 0x20; /測(cè)試之用 PWM_Setting(); /* * 過流保護(hù)上限值設(shè)定 * 0x1600對(duì)應(yīng)限電流最大大約為2.6A * 0x1700對(duì)應(yīng)限

21、流值最大大約為3.8A */ void Current_Lim(unsigned int CM) Current_Max = CM; /* * 欠壓保護(hù)程序 */ void Volt_Low(void) if(Voltage_SUM 200) Power_Off=1; else . . Power_Off=0; Voltage_Count = 0; /* * 欠壓保護(hù)下限值設(shè)定 * 電池電壓為47.9V時(shí)ADC采樣值為0xB6 = 0xB60 * 推算電池電壓為41V時(shí)的采樣值為0x9B = 0x9B0 * 推算電池電壓為40V時(shí)的采樣值為0x98 = 0x980 */ void LowVol

22、tage_Lim(unsigned int CM) Voltage_Min = CM; /* * 軟件控制最大速度 * 分為四個(gè)檔位1,2,3,4分別對(duì)應(yīng)15km/h,20km/h,30km/h,40km/h */ void Speed_LimSW(unsigned char SG) SP_Lim = SG; . . /* * 硬件控制最大速度 * 分為四個(gè)檔位SG1,SG2,SG3,SG4分別對(duì)應(yīng)15km/h,20km/h,30km/h,40km/h */ void Speed_LimHW(bit SG1,bit SG2,bit SG3,bit SG4) SP_Lim = 0x01; if(

23、SG4) SP_Lim = 0x01; else if(SG3) SP_Lim = 0x03; else if(SG2) SP_Lim = 0x05; else if(SG1) SP_Lim = 0x08; /* * 堵轉(zhuǎn)保護(hù)程序 */ 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

24、 = 0; UT=0;VT=0;WT=0; UB=1;VB=1;WB=1; / 電機(jī)停轉(zhuǎn) /* * 剎車功能 */ void Brake_Setting(void) 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;i20;i+) . . Speed_Bufferi = 0; if(EABS_BrakeEN) / 電子剎車 if(Speed_SUM Speed_Low) P

25、WM_Duty_H = 0x01; PWM_Duty_L = 0x00; EABS_Flag = 1; UT = 1; VT = 1; WT = 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:電剎車功能使能

26、 */ void EABS_Set(bit EBS_EN,bit EBB_EN) EABS_SlipEN = EBS_EN; EABS_BrakeEN = EBB_EN; /* * 1:1自動(dòng)程序助力 * 電動(dòng)車中軸速度傳感器(單開關(guān)霍爾信號(hào)),當(dāng)轉(zhuǎn)動(dòng)中軸時(shí)產(chǎn)生高低電平信號(hào)。 * 當(dāng)芯片連續(xù)接收到6個(gè)占空比大于50%的方波信號(hào)時(shí)輸出驅(qū)動(dòng)信號(hào), . . * PWM打開為50% */ void AutoHelp(void) if(!Block_Flag) PWM_Duty_min = 0; /-設(shè)定轉(zhuǎn)把不轉(zhuǎn)時(shí)才有助力功能-/ if(Speed_SUM 40) / 低電平超過一定值后認(rèn)為沒有助力 A

27、H_CNTH=0; / 高電平計(jì)數(shù)值清零 AH_CNTL=0; / 低電平計(jì)數(shù)值清零 AH_CT=0; / 占空比大于50%的方波,脈沖,計(jì)數(shù)值清零 else / 狀態(tài)改變 if(AH_CNTHAH_CNTL) AH_CT+; / 占空比大于50%的方波,脈沖,計(jì)數(shù)值贈(zèng)加 . . else AH_CT=0; / 不是連續(xù)大于50%的方波 AH_CNTL=0; SenBak=P01; / 保存狀態(tài) if(AH_CT=6) / 連續(xù)3個(gè)占空比大于50%的方波,脈沖, AutoHelp_Flag=1; / 啟動(dòng)助力標(biāo)志 AH_CT=0; / 占空比大于50%的方波,脈沖,計(jì)數(shù)值清零 AH_CNTL=

28、0; / 低電平計(jì)數(shù)值清零 AH_CNTH=0; / 高電平計(jì)數(shù)值清零 AH_KT=AH_Time; / 只有一定的助力時(shí)間 /助力端口為高電平/ else if(P01=SenBak) AH_CNTH+; / 高電平計(jì)數(shù) if(AH_CNTH60) / 持續(xù)高電平時(shí)間過長(zhǎng)則認(rèn)為同樣沒有助力 AH_CNTH=0; AH_CNTH=0; . . AH_CT=0; else SenBak=P01; AH_CNTH=0; / 高電平計(jì)數(shù)值清零 /-有轉(zhuǎn)把信號(hào)則關(guān)閉助力功能-/ else AH_CNTL=0; AH_CNTH=0; AH_CT=0; AutoHelp_Flag=0; if(AutoHelp_Flag=1) / 有助力存在 AH_KT-; if(AH_KT (Speed_Low + KS_LowSpeed) / 轉(zhuǎn)速在一定值之上時(shí)才可定速 if(Speed_SUM+0x4

溫馨提示

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

評(píng)論

0/150

提交評(píng)論