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

上传人:b****7 文档编号:23815559 上传时间:2023-05-21 格式:DOCX 页数:38 大小:21.44KB
下载 相关 举报
电动车控制器C语言源代码.docx_第1页
第1页 / 共38页
电动车控制器C语言源代码.docx_第2页
第2页 / 共38页
电动车控制器C语言源代码.docx_第3页
第3页 / 共38页
电动车控制器C语言源代码.docx_第4页
第4页 / 共38页
电动车控制器C语言源代码.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

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

《电动车控制器C语言源代码.docx》由会员分享,可在线阅读,更多相关《电动车控制器C语言源代码.docx(38页珍藏版)》请在冰豆网上搜索。

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

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

#define_E_BIKE_W79E83X_C_

#include"intrins.h"

#include"E_BIKE_W79E83X.H"

#include"W79E834.h"

/*****************************************************************************

*主函数

******************************************************************************/

voidmain(void)

{

Init();//初始化

Init_IO();//初始化端口

H_Sample();//霍尔信号采样

Phase_Change();//相位变换

AutoHelpEN(1,0x1AA,200);

/*

第一个参数设定助力功能允许与否,1为允许,0为禁止

第二个参数设定助力力量(PWM占空比),数值范围:

0~0x355,数值越大,力量越大

第三个参数设定助力时间,数值越大,时间越长

*/

Keep_SpeedEN(1,0x20,6);

/*

第一个参数设定定速巡航功能允许与否,1为允许,0为禁止

第二个参数设定定速巡航最低速设置

第三个参数设定在巡航点保持多长时间后才进入巡航

*/

Current_Lim(0xB48);

/*

过流保护上限值设定

0xB00对应限电流最大大约为2.6A

0xB80对应限流值最大大约为3.8A

*/

LowVoltage_Lim(0x9B0);

/*

欠压保护下限值设定

电池电压为47.9V时ADC采样值为0xB6==>0xB60

推算电池电压为41V时的采样值为0x9B==>0x9B0

推算电池电压为40V时的采样值为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);

/*

软件控制最大速度

参数数值由0x00~0x20,数值越小速度越大,反之则越小

*/

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端口初始化

******************************************************************************/

voidInit_IO(void)

{

//------P0端口设置------//

P0M1=0xBE;

P0M2=0x01;

/*

P0M1.YP0M2.Y=00设置I/O端口为普通双向模式

P0M1.YP0M2.Y=01设置I/O端口为推拉模式

P0M1.YP0M2.Y=10设置I/O端口为输入(高阻)模式

P0M1.YP0M2.Y=11设置I/O端口为开漏模式

*/

//P0ID=0x78;//设置四个AD端口0数字输入禁止

P0=0xFF;

//------P1端口设置------//

P1M1=0x1C;

P1M2=0xC0;

P1=0xFF;

//------P2端口设置------//

P2M1=0x01;

P2M2=0x1E;

P2=0xFF;

}

/******************************************************************************

*初始化程序

******************************************************************************/

voidInit(void)

{

unsignedchari;

//------PWM设置------//

//PWMP>PWMn高电平,反之低电平

PWMPH=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_Detect();

}

//------变量初始化------//

for(i=0;i<32;i++)

{

Current_Buffer[i]=0;

}

for(i=0;i<20;i++)

{

Speed_Buffer[i]=0;

}

for(i=0;i<16;i++)

{

Voltage_Buffer[i]=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;

Count_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=0x50;TL0=0x50;//设定定时器的初值

TH1=0xE0;TL1=0xE0;//设定定时器的初值

TMOD=0x22;//T0选为定时器(八位)模式2,TL0自动加载TH0中的初值

CKCON&=0X00;//定时器选择为1/12系统时钟

ET0=1;//允许定时器中断

TR0=1;//启动定时器

ET1=1;

TR1=1;

//-----外部中断设定-----//

EX1=1;//允许外部中断1

IT1=0;//电平触发中断1

AUXR1|=0x04;//打开ADC电路

EADC=1;//允许ADC中断

ADCCON&=0xE7;

//SettingsofTimer2capturemode

CKCON=0x60;

CAPCON0=0xA8;

CAPCON1=0x00;

T2MOD=0xF0;

IE1|=0x80;//enablecapturemodeinterrupt

RCAP2L=0x00;//自动重装载低位

RCAP2H=0x00;//自动重装载高位

IE1|=0x40;

//EA=1;//enableinterrupt

T2CON|=0x04;//enabletimer2

//***************************//

KS_EN=1;

KS_Time=8;

//***************************//

}

/******************************************************************************

*ADC中断处理程序

******************************************************************************/

voidADC_ISR(void)interrupt11

{

//UB=~UB;UB=~UB;

//EADC=0;

ADC_Ready=1;

ADCCON&=0xE7;

if(Current_REQ)//电流采样

{

Current_REQ=0;

if(Current_SUM>Current_Buffer[Current_P])

Current_SUM-=Current_Buffer[Current_P];

Current_Buffer[Current_P]=ADCH;

Current_SUM+=ADCH;

Current_P++;

if(Current_P>31)

Current_P=0;

}

if(Speed_REQ)//转把电压采样

{

Speed_REQ=0;

if(Speed_SUM>Speed_Buffer[Speed_P])

Speed_SUM-=Speed_Buffer[Speed_P];

Speed_Buffer[Speed_P]=ADCH;

Speed_SUM+=ADCH;

Speed_P++;

if(Speed_P==14)

Speed_P=0;

}

if(Voltage_REQ)//电源电压采样

{

Voltage_REQ=0;

if(Voltage_SUM>Voltage_Buffer[Voltage_P])

Voltage_SUM-=Voltage_Buffer[Voltage_P];

Voltage_Buffer[Voltage_P]=ADCH;

Voltage_SUM+=ADCH;

Voltage_P++;

if(Voltage_P>15)

Voltage_P=0;

}

//PWM_ADJ();

//UB=~UB;

}

/******************************************************************************

*定时器0中断处理函数

******************************************************************************/

//==========InterruptCycle:

100uS===================

voidT0M1_ISR(void)interrupt1

{

//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_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;

//********KeepSpeedSetting******//

KS_Finish();

}

}

//***FunctionSet***//

if(AH_Count>=100)

{

AutoHelp();//自助力

AH_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中断处理函数

******************************************************************************/

voidT1M1_ISR(void)interrupt3

{

_nop_();

}

/******************************************************************************

*定时器2捕获模式中断处理函数

******************************************************************************/

voidTimer2_ISR()interrupt13using2

{

//*******MotorSpeed*******//

Motor_Speed=TH2;

TH2=0;

TL2=0;

H_Sample();//霍尔信号采集

Phase_Change();//相位变换

}

/******************************************************************************

*定时器2溢出中断处理函数

******************************************************************************/

voidT2_ISR()interrupt8

{

TF2=0;

Motor_Speed=0x50;

Block_Detect();//堵转保护

}

/******************************************************************************

*外部中断处理函数,过流中断

******************************************************************************/

voidINT1_ISR()interrupt2

{

CurrentOver_Count++;

if(CurrentOver_Count>=5)//防抖处理

{

PWM_Duty_min=1;

CurrentOver_Count=0;

}

}

/******************************************************************************

*定时器3中断处理函数,采取捕获模式

******************************************************************************/

voidH_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);//状态去抖

H_State=State1;

}

/******************************************************************************

*根据电机霍尔换向信号给出相应控制信号

*上桥臂:

VT,UT,WT

*下桥臂:

VB,UB,WB

******************************************************************************/

voidPhase_Change(void)

{

if(EABS_Flag)

{

if(!

AutoHelp_Flag)

{

UB=1;

VB=1;

WB=1;

_nop_();

UT=1;

VT=1;

WT=1;

}

}

elseif(PWM_Duty_min)

{

UT=0;VT=0;WT=0;

UB=1;VB=1;WB=1;//电机停转

}

else

{

switch(H_State)

{

case6:

//110,V3,V4

VT=0;UT=0;VB=1;WB=1;

_nop_();

WT=1;UB=0;

break;

case2:

//010,V4,V5

case7:

UT=0;WB=0;VB=1;WB=1;

_nop_();

VT=1;UB=0;

break;

case3:

//011,V5,V6

UT=0;WT=0;UB=1;VB=1;

_nop_();

VT=1;WB=0;

break;

case1:

//001,V6,V1

WT=0;VT=0;UB=1;VB=1;

_nop_();

UT=1;WB=0;

break;

case5:

//101,V1,V2

case0:

WT=0;VT=0;UB=1;WB=1;

_nop_();

VB=0;UT=1;

break;

case4:

//100,V2,V3

UT=0;VT=0;UB=1;WB=1;

_nop_();

WT=1;VB=0;

break;

case9:

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

******************************************************************************/

voidPhase_Detect(void)

{

WT=0;UT=0;VT=0;

switch(H_State)

{

case6:

//110,V3,V4

UB=0;VB=1;WB=1;

break;

case2:

//010,V4,V5

case7:

UB=0;VB=1;WB=1;

break;

case3:

//011,V5,V6

UB=1;VB=1;WB=0;

break;

case1:

//001,V6,V1

UB=1;VB=1;WB=0;

break;

case5:

//101,V1,V2

case0:

UB=1;VB=0;WB=1;

break;

case4:

//100,V2,V3

UB=1;VB=0;WB=1;

break;

default:

break;

}

}

/******************************************************************************

*PWM值转换程序

*在限流允许下,将转把电压ADC值转换为PWMn的值

*电流超过限流值时,做限流处理

******************************************************************************/

voidPWM_ADJ(void)

{

//=====没有超过限流最大值的情况====//

if(Current_SUM

{

if(Speed_SUM

{//---没有转把电压,由Speed_Low的值决定转把电压最小值---//

if(!

KeepSpeed_Flag)

{

if(!

AutoHelp_Flag)

{//定速,助力功能下电机正常转动,否则电机停转

//PWM_Duty=0;

//PWM_Duty_min=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;//滑行充电

}

el

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1