目录
前面
Speed_and_Position_Estimator
获取HALL信号
HALL状态更新
计算转速
位置判断
ADC相电流/总线电流电压
获取AD值
计算实际值
低速高速切换
SlowLoopControl
FastLoopControl
最后
前面
前面分析了BLDC的开环与闭环,接下来分析PMSM或者说FOC的算法框架。
MBD-有感(Hall)开环BLDC控制模型(上) · 语雀
MBD-有感(Hall)开环BLDC控制模型(下) · 语雀
MBD-有感(Hall)BLDC闭环控制模型 · 语雀
Speed_and_Position_Estimator
所在位置:

内部框架:

获取HALL信号
使用的是中断触发,而且还是双边沿触发。

HALL状态更新
其实就是触发一次中断,就反转变量HALL_A_Input

计算转速
这里采用的是下降沿检测霍尔信号,两个下降沿之间的时间对应的就是HALL信号的变化周期。

周期=计数值(TIME_CNT)*100us的定时器(C_LST)
频率=1/周期 单位是秒,这里得到的是 转/秒
转化成 转/分钟,需要*60:Vrpm=60/(TIME_CNT*C_LST)
最后实际转速,还要除以极对数pp:Vrpm=60/(TIME_CNT*C_LST/pp)
如下图1部分所示

rpm2rad/s公式:1 rpm = 1(r)/1(min) = 1(r)/60(s) = 2π (rad)/60(s) =π/30 (rad/s)


位置判断
这个就没啥好讲的,HALl值=A+2B+4C,分别对应不同的扇区。

ADC相电流/总线电流电压
FOC控制需要获取三相电流,这一步与电路图密切相关。

获取AD值
内部结构如下

这里有一个问题一直没搞懂,为什么ADC_IB是靠ADC1中断直接引出来的一个data?而不是像ADC_IA一样靠配置好通道然后读取一个值。


计算实际值

获取三相电流,这里是双电阻采样,由两相电流计算出三相电流,这里注意使用了多次浮点数相关的运算。

获取总线电流,总线电压。

低速高速切换

切换逻辑,其实搞得也不太明白,有些地方不懂

感觉像是通过一个计数器来计算。

SlowLoopControl

低速环主要任务如下:

在Generate_Speed_Reference模块中:

在Compute_Positioning_Mode模块中:

在Speed_Controller模块中:

FastLoopControl

在模块里:

很常见的FOC算法模型,坐标变换,PI调节,输出PWM。
放几个比较有意思的点
电流环DQ轴PI控制器:

PWM输出模块:

计算电角度模块ComputeElectricAngle:

输入转速rad/s,经过计算(2*pi/60)*PP*Nmax*(C_LST/2/pi)*(2^31),可以得到电角度。
最后
转的很好




















