整车控制器VCU

该博客详细介绍了整车控制器VCU的设计与实现,包括控制目的确保车辆部件协调工作,性能要求聚焦于可靠性、舒适性和可控性。硬件采用MC9S12XEP100芯片,通过CAN总线与多个部件通信。软件架构包含Bootloader和应用程序,Bootloader负责串口和CAN烧录,应用程序处理信号输入输出和控制策略。还提到了MATLAB在算法设计中的应用,以及故障检测和处理机制。

控制目的:

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

性能要求:

    可靠性、舒适性、可控性

硬件架构:

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

控制部件:

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

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

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

2、通过MCU信号控制:

 1、模拟量输入:

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

 2、数字量输入:

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

 3、数字量输出:

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

 4、模拟量当作开关量:

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

 5、PWM波输入:

充电PWM波


软件架构:

由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();           //电机功率计算


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值