找回密码
 立即注册

QQ登录

只需一步,快速开始

开启左侧

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

  [复制链接]
Angus 发表于 2016-8-10 16:46:56 | 显示全部楼层 |阅读模式
本帖最后由 Angus 于 2024-2-22 22:22 编辑

参考原理图 M451_FOC.pdf (39.23 KB, 下载次数: 3615)

M451_FOC基本原理.pdf

1.73 MB, 下载次数: 2490

回复

使用道具 举报

admin 发表于 2022-11-21 16:08:45 | 显示全部楼层
M451  可做 FOC + PFC 方案。 也可做 FOC + CAN通信 方案

七段式SVPWM 算法,一个PWM 周期有两次电流注入,所以电流频率是PWM 频率的两倍,PWM 频率若用10KHz(周期是 100us),电流频率主要是20KHz,所以噪音已比较小。

此M451 FOC 方案,PWM(ADC)中断耗时20us左右,所以另一组PWM  完全有时间做 PFC 控制。

我们推荐以下引脚配置, 同时留出CAN 通信引脚。PA2,PA3 可控制大功率 PFC 的主管和副管。
下载.png
牛卧堂
回复 支持 2 反对 0

使用道具 举报

 楼主| Angus 发表于 2023-3-30 11:36:26 | 显示全部楼层
本帖最后由 Angus 于 2023-3-31 21:58 编辑

这里讲一下电流 PI 参数的取值问题

电机可以看成一个电感串一个电阻,其拉氏变换是 1/(sL+R), PI 控制的拉氏变换是 (Kp + Ki/s) , 这俩公式看不懂的,请去复习一下拉氏变换
电流的 PI 控制图如下,x是电流设定值,y是电机的实际电流。PI 控制的输出是电压V,电压加到电机(电阻+电感), 又调整了电流大小,控制的最终结果是 y=x 。因为有积分运算,所以只要 x-y >0, PI 运算的结果V 就会一直增加,所以电机电流y也一直增加,直到 y=x。
屏幕截图 2023-03-30 101348.png

上图写成公式 无标题.png

公式化简 无标题.png

令 Ki = K*Kp, K是一个常数,公式变为 无标题.png



上式可变成 y 的二阶微分方程,求出 y  的解,用拉氏反变换的方法也可求出 y 的解。
当设定电流不变、即x=常数时,y 的解的形式是: 无标题.png
其中 x1,x2 是 S 的一元二次方程 无标题.png   的解。我们先不求解,讨论解的形式,比较简单。

S的一元二次方程有俩实数解时,y 的解中,e的指数是实数,y 的值指数变化(增加或衰减)趋于终值C0,没有振荡。
如果上述一元二次方程的解是复数,e的指数是复数,按欧拉公式,就是y的解是三角函数、乘e指数。y的解有三角函数,就是电流 y 有振荡。PI 控制效果、是振荡式趋于稳定值C0,这是我们不希望的。
上述S的二次方程有实根,必须满足: 无标题.png

上式可写成 无标题.png ,第二个括号内的值 >=0,就满足整个公式>=0。

从第二个括号内式子 4RKp - 4LkKp >=0 得出 R - LK >= 0,即 K <= R/L
所以,Ki 满足下式,  电流响应就不会有振荡:
无标题.png
这就是 Ki 取值的理论依据,实际上 PI 控制环路还有PWM  滞后一个周期等其它微小滞后因素,Ki 的这个临界值,比 R/L*Kp 还大一点,也就是只要Kp的取值不会引起振荡,Ki 取值 = R/L*Kp 也不会振荡。

回复 支持 2 反对 0

使用道具 举报

 楼主| Angus 发表于 2022-1-23 21:36:38 | 显示全部楼层
本帖最后由 Angus 于 2023-6-8 20:58 编辑

这里讲一下 Clark 变换

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

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

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

等幅变换中电流向量若是 I,  则对应相电流峰值是 I*2/3。所以上式求出的电流向量,乘2/3后才与控制量对应,  这样公式就变成了
5.png
上式这个电流向量的模,正好与相电流的峰值,数值上相等。
下面来看代码,
126~136行,按扇区,选择下MOS导通时间长的两相, 求I_alpha, I_beta,为了减小计算误差先增加小数,数值乘8
138行,1/3 的开方=0.57735 =18919/32768, 所以乘18919再右移15位就是乘1/3的开方,右移小了3位,等于是把结果乘了8
无标题.png

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









回复 支持 1 反对 0

使用道具 举报

 楼主| Angus 发表于 2022-1-20 14:35:43 | 显示全部楼层
本帖最后由 Angus 于 2022-11-11 10:21 编辑

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

模拟 PID 运算公式 :
F1.png
去掉微分运算,再把公式离散化,公式变为:
F2.png

采用增量式算法:
F3.png

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

   无标题.png

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

无标题.png

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







回复 支持 1 反对 0

使用道具 举报

Uwen 发表于 2016-11-30 17:03:31 | 显示全部楼层
Angus 发表于 2016-11-27 21:41
目前只做到按霍尔位置算电压失量,还没做到电流失量控制那一步

hello:
        读了一下程序,发现有几个值没整清楚。
Voltage_dc = 100000 ;                                    // PWM 周期是 4000, 母线数值太大无意义
Voltage_q  =  40000 ;                                    // Vd,Vq 范围 -65535 ~ 65535
Voltage_d  =   1000 ;                                    // Vq,Vd 的模超母线的 0.577 倍波形会消顶
这几个值,如果电机不一样,输入电压有变化,怎么选择?有怎么样的算法?有例程吗? 谢谢!!!
回复 支持 反对

使用道具 举报

 楼主| Angus 发表于 2016-12-3 12:05:18 | 显示全部楼层
本帖最后由 Angus 于 2017-3-14 22:11 编辑

看一下 FOC 控制框图,系统控制的输入量是 Id,Iq 的设定值。Vd,Vq 是 PI 计算出来的理想值,再由 Vd,Vq算出 PWM 的占空比。
若想提高调节精度,一方面要增大 PWM 周期,PWM 周期为 4000 时,调节1,电压只调整了 1/4000。另一方面要提高由 Vd, Vq 计算 PWM 的精度。采用定点数,只能提高 Vd, Vq 的数值,而 Vd,Vq 的最大取值受限于母线的最大取值。
   由此可见,母线数值选的越大,Vd,Vq 被允许的范围就越大,计算精度就越高。母线最大数值若超过 PWM 周期的四倍以上,电压的舍入误差已小于 PWM 所能达到的精度的 1/4,PWM 已无法完成如此精细的电压调节。
回复 支持 反对

使用道具 举报

rete0786 发表于 2017-3-14 13:32:11 | 显示全部楼层
哈哈,好东西,赞一个
回复 支持 反对

使用道具 举报

arm_nuedu 发表于 2017-7-27 20:39:03 | 显示全部楼层
PD->MODE      = 0x00000400 ;               
  SYS->GPD_MFPL = SYS_GPD_MFPL_PD0MFP_UART0_RXD
                | SYS_GPD_MFPL_PD1MFP_UART0_TXD  ;

还有这个PD0 PD1,不是该0X0000 0004
回复 支持 反对

使用道具 举报

 楼主| Angus 发表于 2017-7-27 21:46:06 | 显示全部楼层
arm_nuedu 发表于 2017-7-27 20:39
PD->MODE      = 0x00000400 ;               
  SYS->GPD_MFPL = SYS_GPD_MFPL_PD0MFP_UART0_RXD
        ...

代码中 PD->MODE = 0 ;
PD0 配置为 RXD 自动为输入,PD1 配置为 TXD 自动为 CMOS 输出, PD->MODE 的值已无效  
回复 支持 反对

使用道具 举报

arm_nuedu 发表于 2017-7-28 11:48:25 | 显示全部楼层
哦哦,明白了,谢谢
回复 支持 反对

使用道具 举报

xiaoxiao2013 发表于 2018-11-20 13:57:13 | 显示全部楼层
请问,你启转那个图片是怎么启动的?是无感运行?看图上没有开环切闭环,是不是这样?你那个位置估算器是常用的,难实现这样的效果
回复 支持 反对

使用道具 举报

 楼主| Angus 发表于 2020-5-29 14:09:19 | 显示全部楼层
本帖最后由 Angus 于 2020-5-29 14:12 编辑
游客 115.226.132.x 发表于 2020-5-29 10:36
请问楼主:在做无感位置估算器中,需要用到Valpha和Vbeta,这两个值是怎么得到的,提供的原理图中只有两相 ...

电机中的三组线圈在圆周上呈120度安放,三相通电后,合成电压的方向可以是360度的任一方向,所以就用复数表示,Valpha  + jVbeta

所以Valpha, Vbeta 是电压失量的实部和虚部,是计算的中间变量。
回复 支持 反对

使用道具 举报

匿名  发表于 2022-1-10 21:39:19
调速旋钮刚好在最小启转值附近时,可能因数据抖动,造成启转、停转、启转、停转现像。为了防止这种现象,将调速旋钮值,做回差处理,如下图。 Value.png

未转时,旋钮从0向上调,超过最小值的3/4, 到最小值之间,都算是最小值。
转动时,旅钮从上向下调,高于最小值的一半,到最小值之间,都算最小值。

未转时,旋钮调到3/4处,就会启转,这时,旋钮值上下抖动一点,转速设定值保持最小值不变。
实现代码,如下:
IMG_2333.JPG
回复 支持 反对

使用道具

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

本版积分规则

新唐MCU