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

📄 e_bike_w79e83x.c

📁 华邦单片机的控制器原码,用于华邦的79e83x单片机的开发.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
*	Application: Demo code for E_Bike in W79E83X
*	Edition:	Version:1.0
*	Company: Winbond Electronics(Shanghai),Ltd.
*       Author:  NM01 team
*       Contact: Tel:021-62365999转1854 Mobil:13762016364
*	Time: March 2007
*******************************************************************************/
#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(0,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:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -