📄 e_bike_w79e83x.c
字号:
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;
}
/******************************************************************************
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -