电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)

本文首先简单介绍AP32013i_Inverter_TC27xC的硬件组成,然后说明其软件框架,数据结构,最后是源码分析。


一, AP32013i_Inverter_TC27xC属于Hybrid kit AURIX,即AURIX系列(英飞凌32bit单片机的一个系列)的混合套件。主要应用驱动电机。

其环境如下图:需要直流电源12V和高压电源(Vdc),上位机(PC),电机支持。其中电机功率和电流不能超过Hybrid kit AURIX中的功率器件,电机类型:永磁同步电机(表贴,内嵌均可)和异步电机均可。

电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)_第1张图片

其主要硬件组件如下图(如有不全,请原谅)

电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)_第2张图片

二,软件构架

其软件构架风格是分层构架。采用传统的三层架构:底层是驱动层(iLLD),中间是服务层,上层是应用层。

电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)_第3张图片

软件主流程:主要流程分成,BOOT,配置载入,硬件初始化,自检,应用程序初始化,运行。其中配置载入包括:EEPROM中数据:以EFS形式;和用户通过上位机通讯修改的配置。

电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)_第4张图片

其运行的架构风格是前后台架构,各个前台和后台同步如下图:

电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)_第5张图片

为了支持上述的同步,其硬件配置如下:(原版为3种PWM源:ATOM,TOM,CCU6,这里只图解ATOM)。在ATOM中配置两个中断服务函数LB30_Isr_M0_Period和LB30_Isr_M0_Trigger,同时用寄存器直接在Trigger ponint配置成P2.7输出和VADC采集的输入源,而主要FOC算法则跑在VADC采集后中断服务函数LB30_Isr_Adc_M0中,这样保证在运行FOC算法时,电机的位置速度,电流反馈信号都采集完毕。

电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)_第6张图片

三,数据结构:

主要数据结构分成两块:硬件相关的数据(g_Lb)和运行相关的数据(g_appLibrary)。如下图

电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)_第7张图片

电机控制算法FOC-研究英飞凌AP32013i_Inverter_TC27xC_1_22心得(二)_第8张图片

其中重要的LB30数据结构和Db3x数据结构

typedef struct
{

    LB_FileBoardVersion  *boardVersion;
    LB_FileConfiguration configuration;

    struct
    {
        IfxQspi_SpiMaster         *qspi0;        /**< \brief QSPI0 driver data.  */
        Ifx_Efs                   *efsConfig;    /**< Ifx_At25xxx file system (configuration) */
        IfxAsclin_Asc             asc0;         /**< \brief ASC 0 interface */
        IfxAsclin_Asc             asc1;         /**< \brief ASC 1 interface */
        IfxPort_Pin               asc1Rs232Select;
        IfxMultican_Can           can;          /**< \brief CAN driver */
        IfxMultican_Can_Node      canNodes[2];  /**< \brief CAN nodes */
        IfxPort_Pin               can0ErrN;
        IfxPort_Pin               can0En;
        IfxPort_Pin               can0StbN;
        IfxGtm_Atom_Timer         timerOneMs;          /**< \brief 1ms interrupt */
        IfxGtm_Atom_Timer         timerTenMs;          /**< \brief PWM timer driver */
        IfxQspi_SpiMaster         qspi2;               /**< \brief QSPI2 driver data.  */
        IfxQspi_SpiMaster         qspi3;               /**< \brief QSPI3 driver data.  */
        IfxQspi_SpiMaster_Channel sscAd2s1210;         /**< \brief SSC channel for AD2S1210. */
        IfxGpt12_IncrEnc          encoder;             /**< \brief GPT12-based encoder object */
        Ad2s1210                  ad2s1210;            /**< \brief AD2S1210 based resolver object */
        IfxDsadc_Dsadc            dsadc;
        IfxDsadc_Rdc              dsadcRdc0;           /**< \brief DSADC-based resolver object */
        IfxPort_Pin               Resolver0GainSel[4]; /**< \brief Resolver 0 Gain settings */
        IfxPort_Pin               Resolver1GainSel[4]; /**< \brief Resolver 1 Gain settings */
        IfxPort_Pin               ResolverOutputSel;   /**< \brief Select between AD2S1210 and Resolver 0 */

        IfxTlf35584_Driver               tlf35584;            /**< TLF35584 driver */
        IfxQspi_SpiMaster_Channel sscTlf35584;         /**< \brief SSC channel for TLF35584 */

        IfxVadc_Adc_Group         group[7];
        LB30_Inverter             inverter;
        IfxPort_Pin               digitalInputs[4];     /**< \brief General purpose digital inputs */
        IfxPort_Pin               digitalOutputs[4];    /**< \brief General purpose digital outputs */
    }driver;

    struct
    {
        AppAnalogInput currents[ECU_PHASE_PER_MOTOR_COUNT];
        AppAnalogInput vDc;
        AppAnalogInput igbtTemp[ECU_PHASE_PER_MOTOR_COUNT];

        AppAnalogInput motorTemp;

        AppAnalogInput in[4];
        AppAnalogInput tempBoard;
        AppAnalogInput vAna50;
        AppAnalogInput vRef50;
        AppAnalogInput vDig33;
        AppAnalogInput kl30;
    }analogInput;

    struct
    {
        IfxStdIf_DPipe    asc0;
        IfxStdIf_DPipe    asc1;
        IfxStdIf_Pos      encoder;
        IfxStdIf_Pos      ad2s1210;
        IfxStdIf_Pos      dsadcRdc0;
        IfxStdIf_Inverter inverter;
    }  stdIf;

    AppDbStdIf *driverBoardStdif;

    Ifx_MotorModelConfigF32_File *motorConfiguration;
    boolean disableCurrentSensorCheck;		/**< \brief If TRUE, the current sensors are disable */
    struct
    {
    	boolean pwmEnabled; /** If true, PWM duty cycles will be updated */
    	boolean running;		/** If true, selftest pwm is running */
    	Ifx_TimerValue duty[3]; /** PWM duty cycle values (reference)*/
    	Ifx_TimerValue dutyFaulty[3]; /** PWM duty cycle values (error injection) */
    }selftest;
}LB30
typedef struct
{
    boolean                isBoardVersion;       /**< \Brief TRUE if the driver board version file is loaded */
    boolean                isBoardConfiguration; /**< \Brief TRUE if the driver board configuration file is loaded */

    LB_FileBoardVersion    boardVersion;
    Db3x_FileConfiguration configuration;

    struct
    {
        Ifx1edi2002as_Driver             oneEdi2001as[6]; /**< 1EDI2002AS drivers ={U top, U Bottom, V Top,, V Bottom W Top, W Bottom}*/
        IfxQspi_SpiMaster_Channel sscOneEdi2001as; /**< \brief SSC channel for Edi2001AS */

        IfxQspi_SpiMaster_Channel sscEeprom;       /**< \brief SSC channel for EEPROM */
        Ifx_At25xxx               eeprom;          /**< Ifx_At25xxx driver */
        Ifx_Efs                   efsConfig;       /**< Ifx_At25xxx file system: Configuration */
        Ifx_Efs                   efsBoard;        /**< Ifx_At25xxx file system: Production data */
    }driver;
}Db3x;

 

四,源码分析:

1. 嵌入式特点:把大量配置和运行变量编成了几个全局变量,各种跨文件调用。但是一旦抓住主要数据结构可读性就增加了,更容易理解。

2. 为了兼容硬件和通用型,大量使用空指针。在初始化时用代码指向地址(包括变量和函数),往往跳转3次以上。给阅读带来困难。


 

你可能感兴趣的:(算法)