⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 e_bike_w79e83x.c

📁 华邦单片机的控制器原码,用于华邦的79e83x单片机的开发.
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -