找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
跳转到指定楼层
楼主
Angus 发表于 2016-8-10 16:46:56 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Angus 于 2024-4-29 22:40 编辑

参考原理图 M451_FOC.pdf (39.23 KB, 下载次数: 3643) , 图中第三相驱动和前两相一样,省略, 省一页图纸。
M451无感FOC吸尘器在10万转时,电流钳测的电流波形

每个PWM周期的计算耗时小于20us。如果 PWM=30KHz/周期33us,转速就可跑到 15万转。

启转快,同步快,代码精简到7K


顺风启转,直接同步


让电流设定值突变,电流响应快、并且无超调


有感FOC的IAR工程代码开始: M451_SVPWM.zip (1.57 MB, 下载次数: 4093)
运行此代码,不接电机,在PWM0_0, PWM0_2, PWM0_4 引脚接 10K/1uF 阻容后就可测到如下波形


无感 FOC 代码+原理图 M451_FOC_V23.zip (647.39 KB, 下载次数: 1669) 中文注释非常详细,量产后可开放 M4_SVPWM.lib
电机参数不同或电路不同时,代码修改说明 M451无感FOC 代码说明.pdf (1.88 MB, 下载次数: 1377)

PWM 触发ADC中断代码流程:  读取电流 =>迭代运算、估算位置=>算三路PWM 占空比写入寄存器

  
过调制输出电压。 过调制可提高电压利用率


技术支持电话
新唐上海公司   021 - 62365999

M451_FOC基本原理.pdf

1.73 MB, 下载次数: 2515

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 顶1 踩
回复

使用道具 举报

沙发
 楼主| 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 已无法完成如此精细的电压调节。
回复 支持 反对

使用道具 举报

板凳
 楼主| 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 的值已无效  
回复 支持 反对

使用道具 举报

地板
 楼主| 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 是电压失量的实部和虚部,是计算的中间变量。
回复 支持 反对

使用道具 举报

5#
 楼主| 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

使用道具 举报

6#
 楼主| 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

使用道具 举报

7#
 楼主| 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位小数,节省代码。




回复 支持 反对

使用道具 举报

8#
 楼主| 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位小数。

回复 支持 反对

使用道具 举报

9#
 楼主| 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。
回复 支持 反对

使用道具 举报

10#
 楼主| 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