在无刷电机(BLDC)矢量控制(FOC)中,高性能和实时性是控制系统的核心要求。中断是实现实时响应的关键技术,特别是在APM32M3514芯片的无感矢量控制算法中,快速环与慢速环的设计与实现高度依赖中断的调度与执行。本篇文章将详细解析APM32M3514中基于中断的FOC控制策略,以及快速环和慢速环的具体实现。
一、FOC算法中的快速环与慢速环
1. 快速环(电流环)- 职责: 调节电机电流,确保目标电流与实际电流的误差最小。
- 运行频率: 与PWM频率一致,通常在15kHz以上。
- 实现方法:
- 实时读取电流采样值(U相、V相)。
- 调用PI控制器计算控制量。
- 更新PWM占空比。
2. 慢速环(速度环)- 职责: 调节电机速度,生成目标电流值(如Iq_ref)。
- 运行频率: 通常为1kHz。
- 实现方法:
- 获取当前速度和目标速度。
- 调用PI控制器计算目标电流。
- 将目标电流传递给快速环。
二、中断在FOC算法中的应用
在APM32M3514的FOC控制中,主要使用以下中断:
- ADC中断: 负责采集电流和母线电压的实时数据,并驱动快速环状态机。
- 定时器中断: 实现慢速环分频与状态切换。
- 故障中断: 响应过流、欠压等硬件保护事件。
中断触发与执行顺序
- ADC中断触发快速环:
- 通过定时器的PWM更新事件触发ADC采样完成中断。
- 在中断中读取电流数据,并调用快速环状态机。
- 慢速环通过计数器分频执行:
- 快速环中每执行一定次数,标记慢速环执行标志。
- 慢速环在主循环中被调度。
- 故障中断优先级最高:
三、代码解析:快速环与慢速环
1. 快速环实现
快速环在ADC_COMP_IRQHandler中实现,核心逻辑如下:
代码片段
void ADC_COMP_IRQHandler(void)
{
ADC->STS = ADC->STS; // 清除中断标志位
static uint8_t u8ADCTimeCnt = 0;
if (u16Cnt <= 127) // 偏移校准
{
u16Cnt++;
u32IbSum += (int16_t)ADC_GetValue(CURR_CHANNEL_V);
u32IaSum += (int16_t)ADC_GetValue(CURR_CHANNEL_U);
}
else if (u16Cnt == 128) // 完成校准
{
u32IbSum = u32IbSum >> 7;
u32IaSum = u32IaSum >> 7;
Motor_type.Foc.stc_IuvwOffset.s16q15_V = u32IbSum << 3;
Motor_type.Foc.stc_IuvwOffset.s16q15_U = u32IaSum << 3;
}
else
{
/* 读取采样数据 */
Get_ADC_Result(&Motor_type);
/* 快速环状态机 */
s_STATE_FAST[eM1_MainState]();
/* 慢速环分频标志 */
if (++u8ADCTimeCnt >= Motor_type.User.u16SlowLoopDiv)
{
u8ADCTimeCnt = 0;
Motor_type.User.bSlowLoopFlag = 1;
}
}
}
逻辑分析
- 电流采样与校准:
- 快速环状态机调用:
- 根据当前主状态eM1_MainState,调用快速环对应的函数(如M1_Run_Fast)。
- 慢速环标志设置:
- 每运行一定次数快速环,设置慢速环标志以触发慢速环。
2. 慢速环实现
慢速环由主循环调度,标志位bSlowLoopFlag控制其执行。
if(Motor_type.User.bSlowLoopFlag)
{
WWDTFeedDog();
/* Slow Loop Statemachine */
s_STATE_SLOW[eM1_MainState]();
Motor_type.User.bSlowLoopFlag = 0;
}
逻辑分析
- 慢速环标志检测:
- 每此main循环检测标志bSlowLoopFlag是否置位。
- 调用状态机函数:
- 根据主状态eM1_MainState,调用对应的慢速环函数(如M1_Run_Slow)。
四、流程实现
以下为进入主循环后代码执行流程图
六、总结
- 主流程:
- 主函数负责系统初始化和主循环逻辑,其中主循环对慢速环标志进行检测并调用对应任务。
- ADC 中断:
- 负责快速环逻辑的核心实现,包括采样、PI控制器调用、PWM更新,以及分频触发慢速环。
- TMR1 中断:
|