整车控制器VCU

控制目的:

    让车上的部件能协调工作,明白司机意图并可操作

性能要求:

    可靠性、舒适性、可控性

硬件架构:

    采用Freescal汽车控制芯片:MC9S12XEP100-144LQFP  主频最高80M,还有一个协处理器,用于处理中断、CAN报文收发

控制部件:

1、部件通过CAN总线控制:

BMS系统、车载充电机、充电桩、绝缘检测仪、电机控制器一体机、数据采集终端、真空泵、助理转向泵、DCDC 

根据载波率的负载,将部件放在不同的总线上

整车控制器VCU_第1张图片

2、通过MCU信号控制:

 1、模拟量输入:

采样周期使用的是0.4ms,加速踏板、制动踏板、真空泵气压传感器、低压电瓶电压采集

整车控制器VCU_第2张图片

 2、数字量输入:

前进档、后退档、二档电开关、是否进入测试模式判断

整车控制器VCU_第3张图片

 3、数字量输出:

12v兼容接触器、交流充电接触器、交流预充电接触器、直流充电接触器、真空泵控制接触器

整车控制器VCU_第4张图片

整车控制器VCU_第5张图片

 4、模拟量当作开关量:

制动开关信号、直流插枪信号、手刹信号、交流插枪信号

 5、PWM波输入:

充电PWM波

整车控制器VCU_第6张图片

软件架构:

由Bootloader和应用程序构成

Bootloader

目的:串口烧录、CAN烧录(通过CCP协议),内存分配

应用程序

目的:处理信号输入输出、完成整车控制策略、进入汽车不同的模式(充电、前进、后退、停止、故障、调试、紧急)、踏板解析(matlab算法)

实现过程

通过周期中断分时完成多任务,每隔50ms更新输入信号、输出信号、故障检测,每隔100ms故障显示,每隔400ms故障处理,根据can总线上的设备特性分时发送can报文,控制can连接部件

void main(void)
{
    DisableInterrupts;
    Start_init();
    EnableInterrupts;
    for(;;)
    {
        if(task_level_2ms == OPEN)
        {
            task_level_2ms = LOCKED;
        }
        if(task_level_4ms == OPEN)
        {
interrupt VectorNumber_Vpit0 void Timer_Interrupt0_isr()   //主CPU周期中断0服务函数
{

    //  XGSWT  = 0x0202;//软件触发中断1,用于AD扫描,滤波等
  
    	if(pc_counter<6000)
       	{
        	pc_counter++;
       	}
     	else
       	{
       		pc_counter=1;

       	}
   
    //pc_counter++;
    if((pc_counter % 2) == 0)
    {
        task_level_2ms = OPEN;
    }

CAN报文

1、在每个部件发送过来的报文中要有life值,检测部件通信中断

2、报文中有部件的故障号,判断部件发生了什么故障

3、can报文的收发任务(通过中断,会有不固定的延时)让协处理器去完成,避免can总线发送延时,影响控制策略

4、在主控处理器和协处理器中都有can收发处理函数,根据共享内存,相同的变量名传值。

错误检测

1、对于加速、制动踏板,要有一个有效值范围

2、对输入信号都应该要检测

故障处理机制:定时检测故障

故障结构

typedef struct
{
    Word  ErrorSPN; //故障号
    Byte  ErrorStatus;//故障状态使能位、故障等级
    Byte  ErrorFMI;
    Byte  ErrorOC;     //故障次数
    Byte  ErrorProcessStatus; //故障处理状态
    Byte  ErrorTime[6]; //故障发生时间,年/月/日/时/分/秒
    LWord error_number_array;
} ErrorBlock;

故障处理

void BatteryErrorCheck(void) //50ms
{
    Byte i;
    
            if((prev_battery_ecu_life == battery_ecu_life)&&((charge_work_flag==1)||(switch_second==1) ) )
            {
                if(BMS_commu_count < 200) //=10s
                {
                    BMS_commu_count++;
                    if(BMS_commu_count >= 0xF0)
                        BMS_commu_count = 0xF0;
                }
                else
                {
                    Record_Error(&Error[35],ERROR_GRADE_1,1835,ERROR_PROCESS_STATUS_VSTOP,14);
                    

                }
            }
            else
            {
                Error[35].ErrorStatus &= ERROR_STATUS_DISABLE;	//清除故障有效位
                Error[35].ErrorProcessStatus = 0x00;            //清楚故障处理方式
                Error[35].error_number_array = 0;
                Error[35].ErrorSPN = 0;
                BMS_commu_count = 0;
                prev_battery_ecu_life = battery_ecu_life;
            }

软件调试

通过freemaster检测和更改变量,bootloader通过仿真器烧录,通过ccp标定控制参数,通过can卡截取报文,通过专门的can处理软件检测部件信息和vcu信息

MATLAB:

将matlab模块建立输入输出接口,编译后生产C代码文件,将其加入到工程中,即可编译

    drive_switch_explain_input();
    drive_switch_explain_step();
    drive_switch_explain_output();    //判断开关状态

    drive_pedal_explain0_input();
    drive_pedal_explain0_step();
    drive_pedal_explain0_output();   //踏板需求解析

    motor_power0_input();
    motor_power0_step();
    motor_power0_output();           //电机功率计算


你可能感兴趣的:(嵌入式)