main.c
来自「PSOC 电动自行车代码 器件采用CYPRESS新电动自行车器件CY8C245」· C语言 代码 · 共 928 行 · 第 1/2 页
C
928 行
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "adc.h"
#include "para.h"
#include "isr.h"
#include "i2c.h"
#pragma interrupt_handler Timer_ISR_C
#pragma interrupt_handler HALL_ISR_C
#pragma interrupt_handler PWM_ISR_C
#pragma interrupt_handler COMP_ISR_C
void HALL_ISR_C(void);
void PWM_ISR_C(void);
void COMP_ISR_C(void);
void system_init(void);
void lock_motor_50us(PROC_PROCESS *ppc);
void get_work_parameters(SYSSTAT *st);
void check_cruise_entry(SYSSTAT *st,PROC_PROCESS *ppc);
void init_bus_current(ADC *adres,PROC_PROCESS *ppc,SYSSTAT *st);
void adjust_motor_run_maxcurrent(PROC_PROCESS *ppc,SYSSTAT *st);
void battery_voltage_detect(ADC *adr,BATVCHK *bv,SYSSTAT *st,PROC_PROCESS *ppc);
void process_speed_command(SYSSTAT *st,PROC_PROCESS *ppc,ADC *adres);
void inactive_ctrl(SYSSTAT *st,PROC_PROCESS *ppc);
void delay_cycle(unsigned int cs);
void motor_ctrlout(PROC_PROCESS *ppc);
unsigned char system_status_indicator(DISP_STRU *dsreg,SYSSTAT *st);
unsigned char get_ctrlout_setni(PROC_PROCESS *ppc,SYSSTAT *st);
unsigned char LEAKAGE_CURRENT_CHECK(SYSSTAT *st,PROC_PROCESS *ppc,ADC *sp);
unsigned char check_mosfet(SYSSTAT *st,PROC_PROCESS *ppc,ADC *sp,unsigned char intfg);
unsigned char block_run_process(SYSSTAT *st,PROC_PROCESS *ppc);
unsigned char sample_adc(unsigned char chan);
unsigned char cruisein_count,halfsecond;
void debugled(void);
PROC_PROCESS proc_process;
ADC adc;
SYSSTAT sysstat;
BATVCHK batvchk;
DISP_STRU dispreg;
void debugled(void)
{
while(1){
proc_process.msg.PRT1DRbak&=~LEDPORT;
PRT1DR=proc_process.msg.PRT1DRbak;
delay_cycle(200);
proc_process.msg.PRT1DRbak|=LEDPORT;
PRT1DR=proc_process.msg.PRT1DRbak;
delay_cycle(200);
}
}
void debug_motor(void)
{
PWM_WritePulseWidth(0x7f);
proc_process.msg.position_prev=0x1;
proc_process.msg.pwmena=3;
while(1){
get_ctrlout_setni(&proc_process,&sysstat);
proc_process.msg.portena=proc_process.msg.ctrlout_set;
motor_ctrlout(&proc_process);
delay_cycle(20000);
proc_process.msg.position_prev=proc_process.msg.position_next;
}
}
void debug_analog(void){
I2CSBuff.b[0]=sysstat.msg.st0;
I2CSBuff.b[1]=sysstat.msg.st1;
I2CSBuff.b[3]=adc.msg.battery_voltage;
I2CSBuff.b[4]=adc.msg.bus_current;
I2CSBuff.b[5]=proc_process.msg.speed_command;
I2CSBuff.b[6]=proc_process.msg.RATED_CURRENT;
I2CSBuff.b[7]=proc_process.msg.current_dcoffset;
}
void debug_portout(void){
I2CSBuff.b[0]=sysstat.msg.st0;
I2CSBuff.b[1]=sysstat.msg.st1;
I2CSBuff.b[2]=PRT1GS;
I2CSBuff.b[3]=PRT1DR;
I2CSBuff.b[4]=proc_process.msg.duty_cycle;
I2CSBuff.b[5]=proc_process.msg.ctrlout_set;
I2CSBuff.b[6]=proc_process.msg.portena;
I2CSBuff.b[7]=proc_process.msg.position_prev;//adc.msg.bus_current;
}
void main()
{
unsigned tt2;
system_init();
vI2CInit();
lock_motor_50us(&proc_process);
get_work_parameters(&sysstat);
init_bus_current(&adc,&proc_process,&sysstat);
check_mosfet(&sysstat,&proc_process,&adc,0);
// sysstat.msg.st1&=~bitSSIDE_DRV_LEAKAGE_OVI;
adc.msg.battery_voltage=sample_adc(battery_v_chan);
adc.msg.brake_voltage=sample_adc(brake_in_chan);
// ADC_CR0=battery_v_chan|ADC_CR0_ADEN|ADC_CR0_START;
// ADC_CR0|=ADC_CR0_ADEN;
// set_init_sample_channel();
PWM_Start();
PWM_EnableInt();
INT_MSK0 = INT_MSK0 | 0X22; //Enable GPIO interrupt
PRT0IE = 0X2A;
adc.msg.samplechannel=BATTERY;
while(ADC_CR0&ADC_CR0_ADC_READY)
{
tt2=ADC_DL;
}
ADC_CR0=battery_v_chan+ADC_CR0_ADC_EN+ADC_CR0_ADC_START;
// PRT1GS = (PRT1GS & 0x33)|(PWMH1+PWMH0+PWML1+PWML0);
// PRT2GS = (PRT2GS & 0x3f)|(PWMH2+PWML2);
// PWM_WritePulseWidth(0x7f);
// while(1){
// delay_cycle(2000);
// PWM_WritePulseWidth(0XfF);
// delay_cycle(2000);
// PWM_WritePulseWidth(0X00);
// }
//
// I2CSBuff.b[0]=proc_process.msg.max_leakagecurrent;//0xaa;
// I2CSBuff.b[1]=sysstat.msg.st0;
// I2CSBuff.b[2]=sysstat.msg.st1;
// I2CSBuff.b[3]=adc.msg.ts_voltage;
// I2CSBuff.b[4]=adc.msg.battery_voltage;
// I2CSBuff.b[5]=adc.msg.brake_voltage;
// I2CSBuff.b[6]=0xaa;//proc_process.msg.speed_command;
// I2CSBuff.b[7]=proc_process.msg.current_dcoffset;
//=========
// debug_motor();
//========
M8C_EnableGInt;
while(1)
{
adjust_motor_run_maxcurrent(&proc_process,&sysstat);
if(sysstat.msg.st3&bitmain_loop_timerce)
{
debug_analog();
// I2CSBuff.b[0]=sysstat.msg.st0;
// I2CSBuff.b[1]=sysstat.msg.st1;
// I2CSBuff.b[2]=PRT1GS;
// I2CSBuff.b[3]=PRT1DR;
// I2CSBuff.b[4]=proc_process.msg.duty_cycle;
// I2CSBuff.b[5]=proc_process.msg.ctrlout_set;
// I2CSBuff.b[6]=proc_process.msg.portena;
// I2CSBuff.b[7]=proc_process.msg.position_prev;//adc.msg.bus_current;
sysstat.msg.st3&=~bitmain_loop_timerce;//sysstat.bits.main_loop_timerce=0;
check_cruise_entry(&sysstat,&proc_process);
process_speed_command(&sysstat,&proc_process,&adc);
battery_voltage_detect(&adc,&batvchk,&sysstat,&proc_process);
if(halfsecond>HALFSECOND){
halfsecond=0;
block_run_process(&sysstat,&proc_process);
sysstat.msg.st3^=bithalfs;//sysstat.bits.halfs=sysstat.bits.halfs? 0:1;
}
else
halfsecond++;
system_status_indicator(&dispreg,&sysstat);
}
}
}
void system_init(void)
{
unsigned char i;
i=0;
while(i<35)
{
proc_process.val[i]=0;
i++;
}
sysstat.val[0]=0;
sysstat.val[1]=0;
sysstat.val[2]=0;
sysstat.val[3]=0;
sysstat.msg.st1|=bitts_reset;
adc.val[0]=0;
adc.val[1]=0;
adc.val[2]=0;
adc.val[3]=0;
adc.val[4]=0;
batvchk.val[0]=0;
batvchk.val[1]=0;
batvchk.val[2]=0;
batvchk.val[3]=0;
dispreg.val[0]=0;
dispreg.val[1]=0;
dispreg.val[2]=0;
dispreg.val[3]=0;
inactive_ctrl(&sysstat,&proc_process);
ADC_CR0 = ADC_CR0_CH_P00|ADC_CR0_ADC_EN;
ADC_CR1 = 0x00;
CMPPRG_SetRef(CMPPRG_REF0_188);
CMPPRG_Start(CMPPRG_HIGHPOWER);
PGA_SetGain(PGA_G8_00);
PGA_Start(PGA_HIGHPOWER);
}
void lock_motor_50us(PROC_PROCESS *ppc)
{
// detect low side mosfet
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33);// on all low side mosfet
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f);
PRT1DR=ppc->msg.PRT1DRbak;
PRT2DR=ppc->msg.PRT2DRbak;
delay_cycle(100);
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33)|0x88;
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f)|0x80;
PRT1DR=ppc->msg.PRT1DRbak;
PRT2DR=ppc->msg.PRT2DRbak;
}
void motor_ctrlout(PROC_PROCESS *ppc)
{
unsigned char temp,temp2,pwmp1,pwmp2,port1,port2;
// PWM_WritePulseWidth(ctrl->msg.duty_cycle);
temp=ppc->msg.portena;
if((temp&0xfc)==0)
{
PRT1GS = (PRT1GS & 0x33);
PRT2GS = (PRT2GS & 0x3f);
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33)|0x88;
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f)|0x80;
}
else
{
if(ppc->msg.pwmena&bitPWMON)
{
if(ppc->msg.pwmena&bitLPWMON)
temp2=0;
else{
temp2=ppc->msg.portena&0xe0;
temp=ppc->msg.portena&0x1f;
}
}
else
{
temp=0;
temp2=ppc->msg.portena;
}
//hside 662 lside 773
pwmp2=0;
pwmp1=0;
port1=0;
port2=0;
if(temp&0x10)pwmp2=PWMH2;
else
if(temp&0x80)pwmp2=PWML2;
if(temp&0x08)pwmp1=PWMH1;
else
if(temp&0x40)pwmp1=PWML1;
if(temp&0x04)pwmp1|=PWMH0;
else
if(temp&0x20)pwmp1|=PWML0;
//hside
if(temp2&0x10)port2=PWMH2;
else
if(temp2&0x80)port2=PWML2;
if(temp2&0x08)port1=PWMH1;
else
if(temp2&0x40)port1|=PWML1;
if(temp2&0x04)port1|=PWMH0;
else
if(temp2&0x20)port1|=PWML0;
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33)| (port1&0x44)|(~port1 & 0x88);
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f)| (port2&0x40)|(~port2 & 0x80);
PRT1GS = (PRT1GS & 0x33)| pwmp1;
PRT2GS = (PRT2GS & 0x3f)| pwmp2;
}
PRT1DR=ppc->msg.PRT1DRbak;
PRT2DR=ppc->msg.PRT2DRbak;
}
unsigned char io_check(unsigned char *reg, unsigned char bitmask)
{
unsigned char check_count,tstbit;
check_count=0;
tstbit=*reg&bitmask;
while(check_count>16)
{
if(tstbit==*reg&bitmask)
{
check_count++;
}
else
{
tstbit=*reg&bitmask;
check_count=0;
}
}
return(tstbit);
}
unsigned char sample_adc(unsigned char chan)
{
unsigned char count;
unsigned int adres;
count=8;
while(ADC_CR0&ADC_CR0_ADC_READY)
adres=ADC_DL;
adres=0;
// ADC_CR0=0;//chan+ADC_CR0_ADC_EN;
// delay_cycle(20);
ADC_CR0=chan+ADC_CR0_ADC_EN;
// delay_cycle(3);
while(count)
{
ADC_CR0=chan+ADC_CR0_ADC_EN+ADC_CR0_ADC_START;
while(ADC_CR0&ADC_CR0_ADC_START)//!ADC_CR0&ADC_CR0_ADC_READY)//(ADC_CR0&ADC_CR0_ADC_START)&&
{
count=count;
}
adres+=ADC_DL;
count--;
}
// ADC_CR0=0;
adres=(adres/8)&0xff;
count=(unsigned char)adres;
return(count);
}
void get_work_parameters(SYSSTAT *st)
{
if(sample_adc(cruise_sele_ena_chan)>0x50)
st->msg.st0|=bitcruise_ena;//st->bits.cruise_ena=1;
else
st->msg.st0&=~bitcruise_ena;//st->bits.cruise_ena=0;
if(sample_adc(hallphase_sele_ena_chan)>0x50)
st->msg.st0|=bithallphase60;//st->bits.hallphase60=0;
else
st->msg.st0&=~bithallphase60;//st->bits.hallphase60=1;
if(sample_adc(abs_sele_ena_chan)>0x50)
st->msg.st0|=bitabs_ena;//st->bits.abs_ena=1;
else
st->msg.st0&=~bitabs_ena;//st->bits.abs_ena=0;
}
void adjust_motor_run_maxcurrent(PROC_PROCESS *ppc,SYSSTAT *st)
{
unsigned char para1,para2;
if(st->msg.st2&bitBLOCK_RUN_P1S_OK)//st->bits.BLOCK_RUN_P1S_OK)
para2=SHUTOFF_1ST_MAXCURRENT;
else if(ppc->msg.speed_profile<=0x60)//&&->speed_profile<0x74)
para2=LOWSPEEDRUN_MAXCURRENT;
else
{
para1=(ppc->msg.speed_profile-0x60)/4;
if(ppc->msg.speed_profile==0xff)
para2=(LOWSPEEDRUN_MAXCURRENT-0x0d-0x0a-3);
else if(ppc->msg.speed_profile>0xe0)
para2=(LOWSPEEDRUN_MAXCURRENT-0x0d-0x0a-0x06-1-1);
else if(ppc->msg.speed_profile>0xa8)
{ para1=(ppc->msg.speed_profile-0xa9)>>2;
para2=(LOWSPEEDRUN_MAXCURRENT-0x0d-0x0a-1)-(para1>>1);
}
else if(ppc->msg.speed_profile>0x7c)
{
para1=(ppc->msg.speed_profile-0x7d)>>1;
para2=(LOWSPEEDRUN_MAXCURRENT-0x0d-1)-(para1>>1);
}
else
{
para1=ppc->msg.speed_profile-0x61;
para2=(LOWSPEEDRUN_MAXCURRENT-1)-(para1>>1);
}
}
if(st->msg.st0&bitabs_ena)//st->bits.abs_ena)
para2+= ppc->msg.current_dcoffset;
if(para2<ppc->msg.IERR_BY_BATDOWN)
ppc->msg.RATED_CURRENT=ppc->msg.LSPWM_SWITCH_I;
else
{
para1=para2-ppc->msg.IERR_BY_BATDOWN;
if(para1<ppc->msg.LSPWM_SWITCH_I)
ppc->msg.RATED_CURRENT=ppc->msg.LSPWM_SWITCH_I;
else
ppc->msg.RATED_CURRENT=para1;
}
}
void check_cruise_entry(SYSSTAT *st,PROC_PROCESS *ppc)
{
unsigned char count,count_L;
if(!(st->msg.st0&bitBRAKE_VALID))//st->bits.BRAKE_VALID)
{
if(st->msg.st0&bitcruise_ena)//st->bits.cruise_ena)
{
count=8;count_L=0;
while(count)
{
if(!CRUISE_IN)
count_L++;
count--;
}
if(count_L==8)
{
if(st->msg.st2&bitcruisein_altfg)//st->bits.cruisein_altfg)
{
cruisein_count=0;
}
else
{
cruisein_count++;
if(cruisein_count>2)
{
st->msg.st2|=bitcruisein_altfg;//st->bits.cruisein_altfg=1;
if(st->msg.st0&bitcruise_on)//st->bits.cruise_on)
st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
else if(ppc->msg.speed_profile)
st->msg.st0|=bitcruise_on;//st->bits.cruise_on=1;
else
{
st->msg.st2&=~bitcruisein_altfg;//st->bits.cruisein_altfg=0;
cruisein_count=0;
}
}
}
}
else
{
st->msg.st2&=~bitcruisein_altfg;//st->bits.cruisein_altfg=0;
cruisein_count=0;
}
}
}
else
st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
}
const unsigned char spcmdindx[47]={ 0x08 , 0x08 , 0x0c , 0x10 , 0x14 , 0x18 , 0x1C\
, 0x20 , 0x24 , 0x28 , 0x2C , 0x30 , 0x34 , 0x38\
, 0x3C , 0x41 , 0x46 , 0x4B , 0x53 , 0x5A , 0x61\
, 0x68 , 0x70 , 0x78 , 0x80 , 0x88 , 0x90 , 0x98\
, 0xA0 , 0xA8 , 0xB0 , 0xB8 , 0xC0 , 0xC7 , 0xCD\
, 0xD3 , 0xD9 , 0xDE , 0xE2 , 0xE6 , 0xEA , 0xF0\
, 0xF5 , 0xFA , 0xFF , 0xFF , 0xFF };
void process_speed_command(SYSSTAT *st,PROC_PROCESS *ppc,ADC *adres)
{
unsigned char Vts,indx,spcmd;
if(st->msg.st1&bitLOW_BATTERY)//st->bits.LOW_BATTERY)
{
st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
st->msg.st1&=~bitmotor_run;//st->bits.motor_run=0;
ppc->msg.speed_command=0;
}
else
{
if(!(st->msg.st0&bitABS_BRAKE_ENA))//st->bits.ABS_BRAKE_ENA)
{
if(!(st->msg.st0&bitcruise_on))//st->bits.cruise_on)
{
Vts=adres->msg.ts_voltage;
if((Vts>=TS_SAMPLE_MIN)&&(Vts<ts_sample_maxlimit))
{
if(Vts>=TS_SAMPLE_MAX) spcmd=0xff;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?