找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

15万转无感FOC: 风机水泵吸尘器,冰箱空调压缩机

  [复制链接]
11#
a20084666 发表于 2022-1-15 14:40:02 | 只看该作者
最近出的都是干货
回复 支持 反对

使用道具 举报

12#
 楼主| Angus 发表于 2022-1-20 14:35:43 | 只看该作者
本帖最后由 Angus 于 2022-11-11 10:21 编辑

这里讲一下代码中的 PI 运算。

模拟 PID 运算公式 :

去掉微分运算,再把公式离散化,公式变为:


采用增量式算法:


下面是转速 PI 运算的代码
代码600 行:增量 = Kp*[本次误差 - 上次误差] + Ki * 本次误差
代码 601 行,temp32 = U(n-1) + 增量。
603 ~ 605行,计算结果 temp32 做限幅后,再赋值给电流设定值变量 Iq_set_f12

  

这里不能对 Iq_set_f12 先赋值,再对Iq_set_f12 做限幅检查。因为ADC 中断的优先级更高,计算时若产生 ADC 中断,Iq_set_f12 的中间结果在 ADC 中断里做电流 PI 运算,数值就不对了。  



PI 系数 Kp_Speed, Ki_Speed 是有12小数的,所以 601 行应右移 12 ,未右移,就是计算结果保留了 12 位小数。做电流PI 运算时会做小数位的对齐。







回复 支持 1 反对 0

使用道具 举报

13#
 楼主| Angus 发表于 2022-1-23 21:36:38 | 只看该作者
本帖最后由 Angus 于 2023-6-8 20:58 编辑

这里讲一下 Clark 变换

求 I_alpha, I_beta,  就是求电流向量的实部和虚部。A相在0度,B相在120度,C相在-120度,三个电流写成复数形式分别为


求三个电流的“失量和” 。 三相电流的“标量和=0“,即Ia+Ib+Ic = 0,这个不用求。


因为在下MOS 导通时测电流,显然下MOS导通时间长时,电流ADC 受PWM 开关影响就小,值相对准确一些。
如果 C 相下 MOS 导通时间短、就用 Ia 和 Ib 计算电流向量, Ic = -Ia-Ib 代入向量求和公式,得到

消去 Ia 或 Ib 的公式,请读者自己推导

等幅变换中电流向量若是 I,  则对应相电流峰值是 I*2/3。所以上式求出的电流向量,乘2/3后才与控制量对应,  这样公式就变成了

上式这个电流向量的模,正好与相电流的峰值,数值上相等。
下面来看代码,
126~136行,按扇区,选择下MOS导通时间长的两相, 求I_alpha, I_beta,为了减小计算误差先增加小数,数值乘8
138行,1/3 的开方=0.57735 =18919/32768, 所以乘18919再右移15位就是乘1/3的开方,右移小了3位,等于是把结果乘了8


执行完138行后,就求出了 I_alpha,I_beta 。接下来坐标变换求出了有3位小数的 Id 和 Iq 电流









回复 支持 1 反对 0

使用道具 举报

14#
匿名  发表于 2022-10-27 10:15:53
请楼主再给讲解一下变量标幺值,看不懂
回复 支持 反对

使用道具

15#
 楼主| Angus 发表于 2022-10-27 21:48:02 | 只看该作者
本帖最后由 Angus 于 2024-4-1 10:43 编辑

电压的基准值是 0.1V。最大值是 16383,若超过此值, 乘4后大于等于65536做坐标旋转会溢出,即最大工作电压是 1638.3V。 在ADC中断里, 读出母线电压ADC值,就换计算出0.1V 的数值,然后赋给变量 V_BUS_0v1

具体代码如下:  母线电压,电路上是俩220K 串4K1电阻分压后到ADC 引脚,所以分压比 (220*2+4.1)/4.1,  12位ADC 参考电压是5V,  所以  ADC值换算成电压公式是:
电压 =   5V * ADC值 / 4096  再乘分压比(444.1/4.1), 这个公式右边再乘10 就是0.1V数值,简化后 = ADC值*5416/4096 。代码中 355 行, 加1024是四舍五入,右移 11位是除 2048,少除了2后面补上。

把当前电压 ADC 值看作 X,
459行是求出了 2X。
460行是 2X + 2Y,  这是母线电压的4倍, 成了 25mV 的数值,  用25mV数值去做 SVPWM计算,  哪怕工作电压不到10V,也有足够的计算精度。最大电压 1638.3V 的数据乘4后得65532, 坐标变换也不会溢出。
461行是 (2X + 2Y)/4 = (X+Y)/2, 这是一阶低通滤波 Y(n) = [Y(n-1) + X(n)]/2。


SVPWM 能输出的无失真相电压,最大值是 0.577倍的母线电压,再大, 就是削顶的正弦电压了。 227行,选择一个相电压上限值。增加17位小数后,赋值给 Vq_Limit_f17,Vd_Limit_f17 (后缀 _f17 表示17位小数) 用于电流PI 运算结果的上限值。  电流PI 运算结果有17位小数,  电压上限在这里先增加17 小数,比在PI 运算结果限幅时再增加17位小数,节省代码。




回复 支持 反对

使用道具 举报

16#
 楼主| Angus 发表于 2022-10-27 22:01:04 | 只看该作者
本帖最后由 Angus 于 2023-2-19 11:09 编辑

电流的基准是ADC 的值。一般电流ADC 数值较小,换算后会损失精度,所以不换算。ADC中断里,读出电流ADC 值乘 8 后再坐标旋转,求得 dq 轴电流赋给 Id_Measure_f3 ,Iq_Measure_f3 ,此处后缀 _f3,表示有 3 位小数。
在做电流PI 运算前,对直流量 Iq_Measure_f3 又做了一次滤波,并增加了一位小数赋值给 Iq_Meas_LPF_f4, 后缀 _f4 表示有 4位小数。

回复 支持 反对

使用道具 举报

17#
匿名  发表于 2022-10-28 15:00:31
十分感谢楼主解答,顺便请教一下这个代码有没有试过比较大的电感和电阻电机,如果一般冰箱压缩机的电阻有几欧姆到十几欧姆,电感几十到一百多mH,油烟机的风机电感和电阻也很大,惯量也大,可以试试效果。
回复 支持 反对

使用道具

18#
 楼主| Angus 发表于 2022-10-28 21:26:09 | 只看该作者
本帖最后由 Angus 于 2022-10-29 12:44 编辑

下载代码后,不做改动,电感最大可到100mH,电阻最大可到500欧。
如果电感再大,可把电感除10后再赋值给Ld/Lq,然后把单位常量Unit_Magnify 也除10就可以。
目前我测试过的电机,电感最大的是220V的电机:50220/49220uH;电感最小的是航模电调用的一个小电机:11/9uH。
回复 支持 反对

使用道具 举报

19#
匿名  发表于 2022-10-29 20:00:21
谢谢!再请教一下,Angle_q是不是开环时候假定的转子Q轴角度,同步以后就是观测器算出来的真实转子Q轴角度?
回复 支持 反对

使用道具

20#
 楼主| Angus 发表于 2022-10-29 20:57:14 | 只看该作者
游客 223.104.219.x 发表于 2022-10-29 20:00
谢谢!再请教一下,Angle_q是不是开环时候假定的转子Q轴角度,同步以后就是观测器算出来的真实转子Q轴角度 ...

是的。
另一角度看,Angle_q 总是是坐标旋转的角度。起转时软件控制角度,同步时用估算的角度。
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU