OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5072|回复: 12

关于FOC的一点点想法,基于STM32F103VET6的开发实现

[复制链接]

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
发表于 2020-10-23 15:15:25 | 显示全部楼层 |阅读模式
(一)背景

      打算学习无感的FOC。在电机控制方面深入研究一下,同时用手边的资源全部自己实现一遍。本人对FOC的算法,也是一知半解,很多细节的地方,还没搞明白,那么就想在自己实现的过程中,边调试变弄清楚。
      参考文档,microchip的AN1078。全部算法来源于此。
      硬件资源:手边有一块STM32F103VET6的核心板,还有两块BLDC的驱动板。就用这两个板子,飞线跳线之类的搞出一个FOC控制器。
先说说FOC要实现的点吧:
FOC─┐
        ├─PI调节器
        ├─坐标转换
         |        ├─park
         |        ├─clarke
         |        ├─inv park

         |        └─inv clarke
        ├─SVPWM
        ├─位置估算器

                 ├─电机模式公式
                 ├─滑膜控制器
                 ├─低通滤波器
                 ├─三角函数
                 ├─积分
                 └─系数更新算法
接下来就是按照上面的点,一边组织代码一边调试。
(二)驱动实现
(三)SVPWM实现
(四)坐标转换、PI调节器
(五)SVPWM调试
(六)滑膜估算器的实现
(七)滑膜估算器调试
(八)滑膜估算器整体功能调试
(九)算法性能测试

(十)PLL控制器学习
(十一)PLL估算器实现
(十二)PLL估算器调试
(十三)PLL估算器性能测试

当年自动控制没有学好,太可惜了。现在研究这些是个庞大的工作。






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
 楼主| 发表于 2020-10-23 15:29:22 | 显示全部楼层
本帖最后由 yexiachensi11 于 2020-11-2 16:18 编辑

(二)驱动实现
    ├中断
    ├TIM1:电机控制主定时器
     |  ├周期设置
     |  └占空比设置
    ├ADC:电机电流采样
     | └DMA更新变量值,触发DMA传输完成中断
    ├GPIO
    ├DMA
    ├TIM6:通用状态切换
预想的驱动方案是这样的:
==>:触发流
──>:数据流

TIM1─┬─CCR1<──────────────────────┐
         ├─CCR2<──────────────────────┤
         ├─CCR3<──────────────────────┤
         ├─CCR4==>ADC1──>DMA──>MEMORY     │
         │   ↑                                                       │
         │   └─────────────────────────┤
         ├─Underflow Event==========>DMA<──MEMORY

单片机的主频72MHz,TIM1设置为中间对齐模式,周期设置为16kHz,CCR1~3通道设置PWM的占空比,CCR4用来触发ADC的电流采样。
仔细研究了STM32F10x的编程手册,有两点不合适:
1、TIM1的CCR4通道只能触发注入组的ADC采样;
2、ADC注入通道采样结束不能触发DMA,只有规则采样才能触发DMA;
3、TIM1的溢出事件能够触发DMA从内存读取占空比数值传输到CCR1~4寄存器,但是DMA不支持突发传输,也就是每次的溢出事件只能触发DMA更新一个CCRx寄存器的值。
        所以只能牺牲性能,采用中断方式:
TIM1─┬─CCR1<──────────────────────┐
         ├─CCR2<──────────────────────┤
         ├─CCR3<──────────────────────┤
         ├─CCR4==>ADC1──>中断处理                  │
         │   ↑                                                       │
         │   └─────────────────────────┤
         ├─Underflow Event==========>中断更新CCR1~4
实际测试TIM1 的中断更新寄存器,会有接近1μs的延时,暂时先将就一下吧。16kHz的PWM波频率,一个周期62.5μs,与1μs相比,在工程上是可以近似忽略的哈。

回复 支持 反对

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-10-25 12:40:57 | 显示全部楼层
支持一下
回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
 楼主| 发表于 2020-11-2 18:39:04 | 显示全部楼层
本帖最后由 yexiachensi11 于 2020-11-2 18:47 编辑

(三)SVPWM实现(上)      懂得矢量控制的原理、六个扇区、矢量合成等概念的话,把SVPWM用C语言实现出来并不难。简单点来说,输入参数是inv clarke(clarke反变换)的输出值Va、Vb、Vc。根据Va、Vb、Vc的正负号判断扇区位置。根据Va、Vb、Vc的大小确定本扇区相邻的这两个矢量的作用时间。
1、驱动层的实现
      原理上有两种实现方式:零矢量集中、零矢量分散。而且零矢量集中的方式能够减少开关损耗。但是零矢量分散的方式又能够减少高次谐波。这里我实现的是零矢量分散的方式。
使用TIM1定时器,中心对齐。如下图。

      驱动的输入参数就是TIM1_CH1~TIM1_CH4通道的比较匹配值。
2、实现层
      首先要澄清的是,PWM的占空比跟SVPWM的占空比不是一个概念。PWM的占空比的值就是每个通道的比较匹配值;SVPWM的占空比就是有效矢量占PWM周期的时间。PWM周期的时候由有效矢量的时间和零矢量的时间组成。接下来的实现步骤就很明确了,实现层就是要计算有效矢量的时间。有效矢量又是由两个矢量组成,那么就分别计算出两个矢量分别占用的时间,再计算每个通道的比较匹配值。3、代码
      参考了microChip、ST的SVPWM实现方式,相同的是都把clarke反变换跟SVPWM实现集合到一个函数中实现了。变换阵的系数通过推导都是一致的,区别是符号以及矩阵的列不同。
microChip的clarke反变换阵:
Va ┏ 0     1
Vb  ┃-1/2 (√3)/2·Vβ  
Vc  ┗-1/2 -(√3)/2   
ST的clarke反变换阵:
Va ┏ 0     -1
Vb  (√3)/2 -1/2·Vβ  
Vc  ┗-(√3)/2 -1/2   
变换阵的不同,影响后面的扇区判断。
      目前我实现了三角函数的计算、park、clarke的变换和反变换、SVPWM这几个函数。准备测试一下SVPWM的功能。尤其要注意的是浮点数转换成定点数的Q格式数据转换,以及Q格式数据的加减乘除运算。例如两个Q15格式数据相乘结果是Q30格式,要除以32768,回到Q15格式,再进行加减法运算。
      设置Vq = Vd = 60000,θ角从0到65535,即0到2π。在QT上先进行测试,得到的波形如下:

把占空比放大:

扇区放大图:

目前还不确定在硬件上能否推动电机转动,看扇区输出,是一个完整的圈。如果有问题,那么下一章会完全推翻这章的描述。接下来就是在硬件上测试了。




扇区图.png
占空比图.png
大图.png
回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
 楼主| 发表于 2020-11-19 17:57:08 | 显示全部楼层
本帖最后由 yexiachensi11 于 2020-11-19 19:35 编辑
yexiachensi11 发表于 2020-11-2 18:39
(三)SVPWM实现(上)      懂得矢量控制的原理、六个扇区、矢量合成等概念的话,把SVPWM用C语言实现出来 ...
(三)SVPWM实现(下)
我又来续贴了。
SVPWM的水还挺深的。哈哈。经过这几周的继续学习,发现上篇文章太浅薄了。仅仅提供个思路而已。真正要实现出来,还需要很多计算。
废话不多说,上干货:
1、扇区判断。
判断的依据是arctan(Uβ/Uα)的值。
如图扇区判断:
根据扇区判断图的第三列可得到两个公式,再结合Uβ就可以判断出处于哪个扇区了。
2、计算所在扇区的两个矢量作用时间。
这个就是平面几何以及三角函数计算了。有个要点,假设Uref为合成矢量,要把Uref用含有Uα、Uβ的三角函数表示出来,那么就把矢量作用时间通过Uα、Uβ表示出来了。
继续上图每个扇区相邻两个矢量的作用时间图:
3、计算矢量切换时间点:
如图矢量切换时间点切换。
4、还有两点比较重要:Q数据格式一定要对齐,一致。此外公式中(√3 * T / Udc),可先忽略除以Udc,并加入母线电压系数(√3 * T / UBUS_GAIN),用来调整Ud、Uq从0~1之间变换对应(一个周期内有效矢量时间/T)的占空比为0~100%。
5、最后再上波形图和电机转动图

扇区判断

扇区判断

扇区判断公式1

扇区判断公式1

扇区判断公式2

扇区判断公式2

每个扇区相邻两个矢量作用时间图

每个扇区相邻两个矢量作用时间图

电机.rar

991.9 KB, 下载次数: 99

电机转动了

SVPWM.rar

1.06 MB, 下载次数: 76

波形图

回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
 楼主| 发表于 2020-11-19 19:33:48 | 显示全部楼层
接下来该研究观测器啦。激动
回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
 楼主| 发表于 2020-11-19 19:34:28 | 显示全部楼层
yexiachensi11 发表于 2020-11-2 18:39
(三)SVPWM实现(上)      懂得矢量控制的原理、六个扇区、矢量合成等概念的话,把SVPWM用C语言实现出来 ...

该层的图片,大部分都是有问题的,不要参考啊
回复 支持 反对

使用道具 举报

6

主题

305

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2876
金钱
2876
注册时间
2016-7-17
在线时间
404 小时
发表于 2020-11-22 14:17:58 | 显示全部楼层
没用ST的MC SDK,楼主值得钦佩。
回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
 楼主| 发表于 2020-11-23 11:50:25 | 显示全部楼层
(四) 上  坐标转换
坐标转换包括,park变换、clarke变换,反park变换。从理解的角度讲,坐标变换是最容易理解的。可以从平面几何的角度来推导转换矩阵。在此就略过了。
程序处理的流程:采集相电流---》电流clarke变换---》根据上一次计算的角度进行电流park变换---》根据本次的电流、上次的电压进行估算新的角度值---》电流PI调节器---》根据新的角度值进行电压反park变换---》SVPWM计算。

clarke变换:
ia+ib+ic=0
iα=ia
iβ=(ia+2ib)/√3


park变换:
id= iαcosθ+iβsinθ
iq=-iαsinθ+iβcosθ

反park变换:
=Vdcosθ-Vqsinθ
=Vdsinθ+Vqcosθ


反clarke变换不需要。SVPWM模块,直接用Vα、Vβ得出扇区和占空比大小。虽然根据Vα、Vβ计算出三个值用来判断和计算,我个人观点是,那个思路不是变换的思路,是三角函数的推导。

(四) 下  PI调节器
本人之前已经了解了PID算法,在此暂不占空讨论。
附上增量式PID公式:
U(k) = U(k-1) + K * [e(k)-e(k-1)] + P * e(k) +D * [e(k) - 2*e(k-1) + e(k-2)]

回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
 楼主| 发表于 2020-11-23 11:52:20 | 显示全部楼层
本帖最后由 yexiachensi11 于 2020-11-23 11:55 编辑

(五)SVPWM调试
在(三)SVPWM实现中已有部分描述。1、注意Q格式一致性;
2、变量的类型与强制转换;
3、注意怎么实现Vq∈(0,1)对应的“占空比”∈(0,100);


回复 支持 反对

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1838
金钱
1838
注册时间
2014-12-4
在线时间
717 小时
发表于 2020-11-24 09:18:44 | 显示全部楼层
占楼学习   感谢
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2019-3-15
在线时间
29 小时
发表于 2020-11-24 14:57:50 | 显示全部楼层
最近也在搞foc,基本框架写完了,之前画的板子采样电阻有点问题,等新板子到,把pi调一下,估计就可以了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2013-8-20
在线时间
1 小时
发表于 2020-12-24 09:12:58 | 显示全部楼层
实力够猛,我是直接用官方的库
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 09:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表