目录
5.采样完成,进入小状态机 OpenCloseAngleSwitch()-角度处理
6.纯sVpwm角度需要自己来,更具负载大小调整,空载为大,电流检测用
本文章用于个人学习使用,也是出于个人学习习惯,喜欢在过程中做记录方便后期查看,程序和视频教程在凌欧官网可以获取,希望咱们国产芯片越来越好,之后我也会持续更新这些文档,以及自己的使用心得
一.程序环流程
(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:存储计算出的最大电流振幅值。
*/
}
功能描述
-
运行状态检测:
- 检查系统状态是否处于 "运行" 状态 (
RUN
),确保后续功能只在正常运行阶段执行。
- 检查系统状态是否处于 "运行" 状态 (
-
故障电流检测(
FaultCurrentCheck
):- 用于检测是否存在电流过大或短路等异常情况。
-
功率计算(
PowerCalc
):- 通过电机的D-Q坐标系的电流和电压分量,计算有功功率、无功功率等指标,用于能量管理或系统监控。
-
当前角度提取:
- 提取当前电机转子的电角度(
wElectAngle
的高16位),用于后续振幅计算。
- 提取当前电机转子的电角度(
-
电流振幅计算(
CurrentAmplitudeCalc
):- 根据当前三相电流值和角度信息,计算电流的最大振幅值(
struImaxCurrent
),为控制算法提供参考。
- 根据当前三相电流值和角度信息,计算电流的最大振幅值(
<4>.硬件过流
-
功能描述:
- 此段代码的主要功能是检测硬件的过流事件。如果检测到过流,触发对应的保护机制。
-
详细解释:
-
MCPWM_EIF & BIT4
和MCPWM_EIF & BIT5
:MCPWM_EIF
是用于存储事件标志的寄存器(Event Interrupt Flag)。BIT4
和BIT5
分别对应硬件的两个特定事件标志位,用于指示是否发生了过流事件。MCPWM_EIF & BIT4
和MCPWM_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); // 返回结构体,包含正弦和余弦值
}
核心模块说明
-
DSP_SC |= BIT2;
- 功能:
- 设置 DSP 状态寄存器
DSP_SC
的 BIT2 位,启用 CORDIC(COordinate Rotation DIgital Computer)模块进行三角函数计算。
- 设置 DSP 状态寄存器
- 解释:
- CORDIC 是一种高效的数字算法,能够通过迭代计算得到正弦和余弦值。
- 此处通过设置寄存器位,启动 CORDIC 模块硬件加速计算。
- 功能:
-
DSP_CORDIC_THETA = hAngle;
- 功能:
- 将输入角度
hAngle
加载到 CORDIC 模块的角度寄存器中。
- 将输入角度
- 解释:
DSP_CORDIC_THETA
是专用于存储角度的寄存器,其值由调用函数的输入参数hAngle
提供。- 输入值
hAngle
通常采用定点表示法。
- 功能:
-
Local_Components.hSin = DSP_CORDIC_SIN;
- 功能:
- 从 CORDIC 模块的正弦寄存器
DSP_CORDIC_SIN
中读取正弦值,并存储到Local_Components
的hSin
成员中。
- 从 CORDIC 模块的正弦寄存器
- 解释:
- 这是通过硬件计算完成的,精度和速度高于软件实现的算法。
- 功能:
-
Local_Components.hCos = DSP_CORDIC_COS;
- 功能:
- 从 CORDIC 模块的余弦寄存器
DSP_CORDIC_COS
中读取余弦值,并存储到Local_Components
的hCos
成员中。
- 从 CORDIC 模块的余弦寄存器
- 解释:
- 同正弦值的计算方式,这里的余弦值由硬件模块完成计算。
- 功能:
-
返回值:
- 返回一个
stru_TrigComponents
类型的结构体,包含正弦值 (hSin
) 和余弦值 (hCos
)。
- 返回一个
9.进行Park变换
10.调制一下
11.进行完成后给到PWM
12.最后就是占空比的改变
这是一个结构体函数
占空比