凌欧通用FOC框架解析(5.程序环流程)

目录

一.程序环流程

       (1). 在ADC中断内

<0>.母线电压采样

<1>.定义的一个宏

<2>.霍尔角度处理

<3>.软件过流,uvw采的电流,功率环,功率拟合的东西

<4>.硬件过流

<5>.调试RTT的

<6>.电流环

0.单跑PWM

1.电流采样

2.更具电阻数量进行采样

3.如果时双电阻就再算一个W的电阻

4.Clark变换

5.采样完成,进入小状态机 OpenCloseAngleSwitch()-角度处理

6.纯sVpwm角度需要自己来,更具负载大小调整,空载为大,电流检测用

7.正式使用的-GET_ELECT_ANGLE()

8.获取角度后DSP

9.进行Park变换

10.调制一下

11.进行完成后给到PWM

12.最后就是占空比的改变

13.观察器估算

14.电流的刹车,三下管全开

15.自动弱磁,转速达不到了


本文章用于个人学习使用,也是出于个人学习习惯,喜欢在过程中做记录方便后期查看,程序和视频教程在凌欧官网可以获取,希望咱们国产芯片越来越好,之后我也会持续更新这些文档,以及自己的使用心得


官网:南京凌鸥创芯电子有限公司

培训视频:培训视频-南京凌鸥创芯电子有限公司

一.程序环流程

       (1). 在ADC中断内

<0>.母线电压采样

<1>.定义的一个宏

结构体:电流内环

<2>.霍尔角度处理

void Hall_ElecAnglePWM_Process(stru_HallProcessDef *this)
{
    // 增加 Hall PWM 定时器计数,用于记录当前的计数状态。
    this->wHallPWMTimerCnt++; // Hall PWM定时器计数器自增

    // 快速增加电角度的标志处理
    if (this->bFastAddElecAngleFlg) // 如果快速增加电角度标志被设置
    {
        u16 t_addAngleStep; // 定义一个变量表示每步增加的电角度值

        t_addAngleStep = HALL_FAST_ADD_DPP; // 默认快速增加步长为预定义的宏值

        // 如果存在霍尔损坏标志,则将步长减半
        if (this->stru_HallRepare.bBrokenHallFlg)
        {
            t_addAngleStep = HALL_FAST_ADD_DPP / 2; // 步长减半
        }

        // 如果目标电角度为正值
        if (this->nEndElectricalAngle > 0)
        {
            // 如果目标角度大于当前步长
            if (this->nEndElectricalAngle > t_addAngleStep)
            {
                // 减少目标电角度,增加实际电角度
                this->nEndElectricalAngle -= t_addAngleStep;
                this->nElectrical_Angle += t_addAngleStep;
            }
            else
            {
                // 如果剩余角度小于步长,说明调整完成,清除快速增加标志
                this->bFastAddElecAngleFlg = 0;
            }
        }
        else // 如果目标电角度为负值
        {
            // 如果目标角度小于当前步长的负值
            if (this->nEndElectricalAngle < -t_addAngleStep)
            {
                // 增加目标电角度(负方向),减少实际电角度
                this->nEndElectricalAngle += t_addAngleStep;
                this->nElectrical_Angle -= t_addAngleStep;
            }
            else
            {
                // 如果剩余角度小于步长,说明调整完成,清除快速增加标志
                this->bFastAddElecAngleFlg = 0;
            }
        }
    }

    // Hall 信号角度处理的两种模式
    if (this->bCloseLoopAngleFlg) // 如果是闭环模式
    {
        closeLoopAnglePLL(this); // 调用闭环角度锁相环函数处理
    }
    else // 如果是开环模式
    {
        reduceToqueAnglePll(this); // 调用开环减扭角度处理函数
    }
}

GPT:

<3>.软件过流,uvw采的电流,功率环,功率拟合的东西

       F-过流

       P-功率环功率拟合

       sC-电流最大值读取,和半个周期的积分读取,缺相保护时候用

if (struFOC_CtrProc.eSysState == RUN) // 检查系统状态是否为 "运行" 状态
{
    // 功能 1:故障电流检测
    FaultCurrentCheck(&struFOC_CurrLoop.mStatCurrUVW);  
    /*
    功能描述:
        检测电机的UVW三相静态电流是否存在过流故障。
    参数说明:
        struFOC_CurrLoop.mStatCurrUVW:结构体指针,包含当前三相电流数据。
    */

    // 功能 2:功率计算
    PowerCalc(&struFOC_CurrLoop.mStatCurrDQ, &struFOC_CurrLoop.mStatVoltDQ, &struPower);  
    /*
    功能描述:
        根据电流和电压的D-Q分量计算功率。
    参数说明:
        struFOC_CurrLoop.mStatCurrDQ:静态 DQ 坐标系的电流数据。
        struFOC_CurrLoop.mStatVoltDQ:静态 DQ 坐标系的电压数据。
        struPower:功率结构体,存储计算结果(包括有功、无功功率等)。
    */

    // 功能 3:计算当前角度的三相电流振幅
    struCurrentAmplitude.bTheta = (struFluxOB_Param.wElectAngle >> 16); 
    /*
    功能描述:
        提取当前电角度(高16位),用于后续的振幅计算。
    参数说明:
        struFluxOB_Param.wElectAngle:电机观测器提供的电角度信息(32位数据)。
        bTheta:存储提取后的电角度,用于振幅计算。
    */

    // 功能 4:电流振幅计算
    CurrentAmplitudeCalc(&struFOC_CurrLoop.mStatCurrUVW, &struCurrentAmplitude, &struImaxCurrent); 
    /*
    功能描述:
        根据三相静态电流(UVW),结合当前角度,计算电流振幅。
    参数说明:
        struFOC_CurrLoop.mStatCurrUVW:当前三相静态电流数据。
        struCurrentAmplitude:包含角度信息的振幅结构体。
        struImaxCurrent:存储计算出的最大电流振幅值。
    */
}

功能描述

  1. 运行状态检测

    • 检查系统状态是否处于 "运行" 状态 (RUN),确保后续功能只在正常运行阶段执行。
  2. 故障电流检测(FaultCurrentCheck

    • 用于检测是否存在电流过大或短路等异常情况。
  3. 功率计算(PowerCalc

    • 通过电机的D-Q坐标系的电流和电压分量,计算有功功率、无功功率等指标,用于能量管理或系统监控。
  4. 当前角度提取

    • 提取当前电机转子的电角度(wElectAngle 的高16位),用于后续振幅计算。
  5. 电流振幅计算(CurrentAmplitudeCalc

    • 根据当前三相电流值和角度信息,计算电流的最大振幅值(struImaxCurrent),为控制算法提供参考。

<4>.硬件过流

  • 功能描述:

    • 此段代码的主要功能是检测硬件的过流事件。如果检测到过流,触发对应的保护机制。
  • 详细解释:

    • MCPWM_EIF & BIT4MCPWM_EIF & BIT5

      • MCPWM_EIF 是用于存储事件标志的寄存器(Event Interrupt Flag)。
      • BIT4BIT5 分别对应硬件的两个特定事件标志位,用于指示是否发生了过流事件。
      • MCPWM_EIF & BIT4MCPWM_EIF & BIT5 分别判断这两个标志位是否被置位(即是否发生相应事件)。
      • || 运算符表示只要任意一个标志位被置位,就进入 if 块。
    • MCPWM_EIF = BIT4 | BIT5;

      • 通过写入值 BIT4 | BIT5(两个标志位按位或),清除过流事件标志位。
      • 这种清除方式是硬件寄存器的一种典型设计,写入对应位值后,标志位会自动清零。
    • stru_Faults.B.HardCurretError = 1;

      • HardCurretError 标志位置为1,表示检测到硬件过流错误。
      • stru_Faults 是一个故障状态结构体,其中 B 是一个分组,HardCurretError 表示硬件过流故障标志。

<5>.调试RTT

<6>.电流环

void FOC_Model(stru_FOC_CtrProcDef *pCtrProc)

0.单跑PWM

1.电流采样

2.根据电阻数量进行采样

3.如果时双电阻就再算一个W的电阻

4.Clark变换

5.采样完成

        进入小状态机 OpenCloseAngleSwitch()-角度处理

6.纯sVpwm角度需要自己来,根据负载大小调整,空载为大,电流检测用
7.正式使用的-GET_ELECT_ANGLE()
8.获取角度后DSP

/*******************************************************************************
 函数名称:    stru_TrigComponents Trig_Functions(s16 hAngle)
 功能描述:    计算给定角度的正弦和余弦值
 输入参数:    s16 hAngle:输入角度值,单位为定点表示的整数(16位短整型)
 输出参数:    返回包含正弦和余弦值的结构体(stru_TrigComponents 类型)
 返回值:      stru_TrigComponents:结构体,包含正弦值 (hSin) 和余弦值 (hCos)
 其他说明:    使用了 CORDIC 模块进行快速三角函数计算
 修改日期      版本号          修改人            修改内容
 -----------------------------------------------------------------------------
 2020/8/5      V1.0           Howlet Li          创建
*******************************************************************************/

stru_TrigComponents Trig_Functions(s16 hAngle)
{
    stru_TrigComponents Local_Components;  // 定义结构体变量,用于存储计算结果

    DSP_SC |= BIT2;  // 设置 DSP 状态寄存器的 BIT2 位,启用 CORDIC 模块
    DSP_CORDIC_THETA = hAngle;  // 将输入角度加载到 CORDIC 模块的角度寄存器中

    Local_Components.hSin = DSP_CORDIC_SIN;  // 从 CORDIC 模块读取正弦值
    Local_Components.hCos = DSP_CORDIC_COS;  // 从 CORDIC 模块读取余弦值

    return (Local_Components);  // 返回结构体,包含正弦和余弦值
}

核心模块说明

  1. DSP_SC |= BIT2;

    • 功能:
      • 设置 DSP 状态寄存器 DSP_SC 的 BIT2 位,启用 CORDIC(COordinate Rotation DIgital Computer)模块进行三角函数计算。
    • 解释:
      • CORDIC 是一种高效的数字算法,能够通过迭代计算得到正弦和余弦值。
      • 此处通过设置寄存器位,启动 CORDIC 模块硬件加速计算。
  2. DSP_CORDIC_THETA = hAngle;

    • 功能:
      • 将输入角度 hAngle 加载到 CORDIC 模块的角度寄存器中。
    • 解释:
      • DSP_CORDIC_THETA 是专用于存储角度的寄存器,其值由调用函数的输入参数 hAngle 提供。
      • 输入值 hAngle 通常采用定点表示法。
  3. Local_Components.hSin = DSP_CORDIC_SIN;

    • 功能:
      • 从 CORDIC 模块的正弦寄存器 DSP_CORDIC_SIN 中读取正弦值,并存储到 Local_ComponentshSin 成员中。
    • 解释:
      • 这是通过硬件计算完成的,精度和速度高于软件实现的算法。
  4. Local_Components.hCos = DSP_CORDIC_COS;

    • 功能:
      • 从 CORDIC 模块的余弦寄存器 DSP_CORDIC_COS 中读取余弦值,并存储到 Local_ComponentshCos 成员中。
    • 解释:
      • 同正弦值的计算方式,这里的余弦值由硬件模块完成计算。
  5. 返回值:

    • 返回一个 stru_TrigComponents 类型的结构体,包含正弦值 (hSin) 和余弦值 (hCos)。
9.进行Park变换

10.调制一下

11.进行完成后给到PWM

12.最后就是占空比的改变

这是一个结构体函数

占空比

13.观察器估算

14.电流的刹车,三下管全开
15.自动弱磁,转速达不到了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值