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 + -
显示快捷键?