/*******************************************************************************
* 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(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)
评论4