电动车控制器C语言源代码
.
#define _E_BIKE_W79E83X_C_ #include "intrins.h"
#include "E_BIKE_W79E83X.H" #include"W79E834.h"
/********************************************************************
*********
* 主函数
*********************************************************************
*********/
void main(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端口初始化
*********************************************************************
*********/
void Init_IO(void)
{
//------P0端口设置------//
P0M1=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端口设置------//
P1M1=0x1C;
P1M2=0xC0;
P1=0xFF;
//------P2端口设置------//
P2M1=0x01;
P2M2=0x1E;
P2=0xFF;
}
/********************************************************************
**********
* 初始化程序
*********************************************************************
*********/
void Init(void)
{
unsigned char i;
//------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;
// Settings 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_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_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中断处理函数
*********************************************************************
*********/
// ========== 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_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_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中断处理函数
*********************************************************************
*********/
void T1M1_ISR(void) interrupt 3 {
_nop_();
}
/********************************************************************
**********
* 定时器2捕获模式中断处理函数
*********************************************************************
*********/
void Timer2_ISR() interrupt 13 using 2 .
.
{
//*******Motor Speed*******//
Motor_Speed = TH2;
TH2 = 0;
TL2 = 0;
H_Sample(); // 霍尔信号采集
Phase_Change(); // 相位变换
}
/********************************************************************
**********
* 定时器2溢出中断处理函数
*********************************************************************
*********/
void T2_ISR() interrupt 8 {
TF2 = 0;
Motor_Speed = 0x50;
Block_Detect(); // 堵转保护
}
/********************************************************************
**********
* 外部中断处理函数,过流中断
*********************************************************************
*********/
void INT1_ISR() interrupt 2 {
CurrentOver_Count++;
if(CurrentOver_Count >= 5) // 防抖处理
.
.
{
PWM_Duty_min = 1;
CurrentOver_Count = 0;
}
}
/********************************************************************
**********
* 定时器3中断处理函数,采叏捕获模式 *********************************************************************
*********/
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); // 状态去抖
H_State=State1; .
. }
/********************************************************************
**********
* 根据电机霍尔换向信号给出相应控制信号 * 上桥臂: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;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;
_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;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;
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_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; // 滑行充电
}
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_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>0x06F0)
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; // 定速巡航状态时无助力
}
if(PWM_Duty < PWM_Duty_Max)
{
if(Motor_Speed > SP_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)
PWM_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)
{ // 欠压状态
Voltage_Count++;
if(Voltage_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,20km/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)
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(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;i<20;i++)
{
.
.
Speed_Buffer[i] = 0;
}
if(EABS_BrakeEN) // 电子刹车
{
if(Speed_SUM < Speed_Low)
{
PWM_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:电刹车功能使能
*********************************************************************
*********/
void EABS_Set(bit EBS_EN,bit EBB_EN) {
EABS_SlipEN = EBS_EN;
EABS_BrakeEN = EBB_EN;
}
/********************************************************************
**********
* 1:1自动程序助力
* 电动车中轴速度传感器(单开关霍尔信号),当转动中轴时产生高低电平信号。 * 当芯片连续接收到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) // 状态未变
{
AH_CNTL++; // 低电平计数
if(AH_CNTL>40) // 低电平超过一定值后认为没有助力
{
AH_CNTH=0; // 高电平计数值清零
AH_CNTL=0; // 低电平计数值清零
AH_CT=0; // 占空比大于50%的方波,脉冲,计数值清零
}
}
else // 状态改变
{
if(AH_CNTH>AH_CNTL)
{
AH_CT++; // 占空比大于50%的方波,脉冲,计数值赠加 .
.
}
else
{
AH_CT=0; // 不是连续大于50%的方波
}
AH_CNTL=0;
SenBak=P01; // 保存状态
if(AH_CT>=6) // 连续3个占空比大于50%的方波,脉冲,
{
AutoHelp_Flag=1; // 启动助力标志
AH_CT=0; // 占空比大于50%的方波,脉冲,计数值清零
AH_CNTL=0; // 低电平计数值清零
AH_CNTH=0; // 高电平计数值清零
AH_KT=AH_Time; // 只有一定的助力时间
}
}
}
//~~助力端口为高电平~~//
else
{
if(P01==SenBak)
{
AH_CNTH++; // 高电平计数
if(AH_CNTH>60) // 持续高电平时间过长则认为同样没有助力
{
AH_CNTH=0;
AH_CNTH=0; .
.
AH_CT=0;
}
}
else
{
SenBak=P01;
AH_CNTH=0; // 高电平计数值清零
}
}
}
//----有转把信号则关闭助力功能----//
else
{
AH_CNTL=0;
AH_CNTH=0;
AH_CT=0;
AutoHelp_Flag=0;
}
if(AutoHelp_Flag==1) // 有助力存在
{
AH_KT--;
if(AH_KT<2) // 助力只持续一定时间
AutoHelp_Flag=0;
}
if(KeepSpeed_Flag==1) // 电动车处在巡航状态
{
AH_CT=0;
AutoHelp_Flag=0; // 关闭助力功能 .
.
}
if(!AH_EN)
{
AutoHelp_Flag = 0;
}
}
/********************************************************************
**********
* 自动助力允许函数
* 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(void)
{
if(!KeepSpeed_Flag)
.
.
{
KS_Point = 1;
if (Speed_SUM > (Speed_Low + KS_LowSpeed)) // 转速在一定值之上时才可定速
{
if((Speed_SUM+0x40) < KS_TempData) // 转把已经旋动超过范围,重新寻找巡航点
{
KS_Count = 0; // 巡航计数归0
KS_TempData = Speed_SUM; // 保持状态值
KS_Point = 0;
}
else if((Speed_SUM-0x40) > KS_TempData) //转把已经旋动低于范围,重新寻找巡航点
{
KS_Count = 0; // 巡航计数归0
KS_TempData = Speed_SUM; // 保持状态值
KS_Point = 0;
}
if (KS_Point) // 在巡航,定速,点上
{
KS_Count++; // 巡航定速时间计数
if(KS_Count > KS_Time) // 转把在某个位置,速度保持了一段时间,停留了一段时间
{
KS_Count = KS_Time;
KeepSpeed_Flag = 1; // 巡航定速标志位置位 .
.
KS_PWM_Duty = PWM_Duty_Max; // 巡航定速的PWM值
}
}
}
}
if(!KS_EN)
{
KeepSpeed_Flag = 0;
}
}
/********************************************************************
**********
* 巡航定速功能结束
*********************************************************************
*********/
void KS_Finish(void)
{
if(KeepSpeed_Flag)
{
if (Speed_SUM < Speed_Low) // 转速归0
{
KS_Z1=1;
if(KS_Z2) // 当转把再次旋动并归0时退出巡航状态
{
KS_Count=0;
KeepSpeed_Flag=0; // 标志位清0
KS_Z1=0;
KS_Z2=0;
}
.
.
}
else
{
if(KS_Z1) // 第一次归0
{
KS_Z2=1; // 巡航状态下转把再次转动
}
}
}
}
/********************************************************************
**********
* 巡航定速功能允许
* K_EN允许巡航功能。
* K_LowSpeed巡航最低速设置
* K_Time设定转把保持多长时间后才进入巡航。 *********************************************************************
*********/
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; }
/********************************************************************
**********
* PWM设定
.
. *********************************************************************
*********/
void PWM_Setting(void) {
PWM0H=PWM_Duty_H;
PWM0L=PWM_Duty_L;
PWM1H=PWM_Duty_H;
PWM1L=PWM_Duty_L;
PWM2H=PWM_Duty_H;
PWM2L=PWM_Duty_L;
PWMCON1 |= 0x40; }
/********************************************************************
**********
.