首页 > 其他分享 >st foc 扇区判断解析

st foc 扇区判断解析

时间:2024-03-15 18:14:31浏览次数:28  
标签:frac 扇区 sqrt st beta foc wZ wX

前言

本文为学习st的FOC库笔记,记录FOC库判断扇区的逻辑,并结合其他文章进行对比。

关键词:SVPWM

扇区判断

参考文章:《彻底吃透SVPWM如此简单》


图1

参考图1,为了便于判断扇区,将αβ坐标系用三条直线分割,分别是:

\[ β = 0\\ β = tan(\frac{\pi}{3})*α =\sqrt{3}α\\ β = -tan(\frac{\pi}{3})*α =-\sqrt{3}α \]

通过判断向量在每条直线的上下即可判断扇区。
因此记

\[ X = -β\\ Y = \frac{\sqrt{3}α - β}{2}\\ Z = \frac{-\sqrt{3}α - β}{2} \]

对XYZ的大小进行判断,即可得知当前所在扇区
(注:这里除2的原因目前不太清楚;st的αβ坐标系以向下为正)。

扇区 X Y Z
1 \(>0\) \(>0\) \(<0\)
2 \(>0\) \(>0\) \(>0\)
3 \(>0\) \(<0\) \(>0\)
4 \(<0\) \(<0\) \(>0\)
5 \(<0\) \(<0\) \(<0\)
6 \(<0\) \(>0\) \(<0\)

对比ST代码:

    wUAlpha = Valfa_beta.alpha * (int32_t)pHandle->hT_Sqrt3;
    wUBeta = -(Valfa_beta.beta * ((int32_t)pHandle->PWMperiod)) * 2;

    wX = wUBeta;
    wY = (wUBeta + wUAlpha) / 2;
    wZ = (wUBeta - wUAlpha) / 2;

    /* Sector calculation from wX, wY, wZ */
    if (wY < 0){
      if (wZ < 0){}
      else /* wZ >= 0 */
      if (wX <= 0){}
      else /* wX > 0 */
      {}
    }
    else /* wY > 0 */
    {
      if (wZ >= 0)
      {}
      else /* wZ < 0 */
      if ( wX <= 0 ){}
      else /* wX > 0 */
      {}
    }

首先,根据传入的αβ值生成中间值wUAlpha,wUBeta。有

\[wUAlpha = 2\sqrt{3}V_αT_s\\ wUBeta = -2V_βT_s \]

计算得

\[ wX = -2V_βT_s\\ wY = (-V_β + \sqrt{3}V_α)T_s\\ wZ = (-V_β - \sqrt{3}V_α)T_s \]

根据\(wX,wY,wZ\)目前可以确定扇区,但是还无法确定各向量的作用时间。

时间计算

先分析st的计算流程:

    if (wY < 0){
      if (wZ < 0)
      {
        pHandle->Sector = SECTOR_5;
        wTimePhA = (((int32_t)pHandle->PWMperiod) / 4) + ((wY - wZ) / (int32_t)262144);
        wTimePhB = wTimePhA + (wZ / 131072);
        wTimePhC = wTimePhA - (wY / 131072) ;
      }
    }

wY<0时,wZ<0时,扇区为5。
然后看\(T_a,T_b,T_c\)的计算,和\(wY,wZ\)有关,且随扇区变化。

看结果看不出来,需要正向推导下。

参考图2:


图2

记总导通时间为\(T_s\)有

\[\begin{gather} |U_4| = V_4T_s\\ |U_6| = V_6T_s\\ \end{gather} \]

将\(U_{out}\)分解,记\(T_4\)为基本矢量\(V_4\)的作用时间,\(T_6\)为基本矢量\(V_6\)的作用时间,有

\[\begin{gather} |U_1| = V_4T_4\\ |U_2| = V_6T_6 \end{gather} \]

将\(U_{out}\)在αβ轴的投影记为\(U_{\alpha},-U_{\beta}\),有

\[\begin{gather} U_{\alpha} = |U_1| + |U_2| cos(\frac{\pi}{3})\\ -U_{\beta} = |U_2|sin(\frac{\pi}{3}) \end{gather} \]

联立\((1)\)~\((6)\)可得:

\[ U_{\alpha} = \frac{|U_4|}{T_s}\times T_4 + \frac{|U_6|}{T_s}\times T_6 cos(\frac{\pi}{3})\\ -U_{\beta} = \frac{|U_6|}{T_s}\times T_6sin(\frac{\pi}{3}) \]

解得

\[ T_4 = \frac{(\sqrt{3}U_{\alpha} +{U_{\beta}})T_s}{\sqrt{3}|U_4|}\\ T_6 = -\frac{2U_{\beta}T_s}{\sqrt{3}|U_6|}\\ \]

在一般情况下,\(|U_4| = |U_6| = \frac{2U_{dc}}{3}\),其中\(|U_{dc}|\)为最大输出相电压,但是\(|U_{out}|\)无法完全维持在\(U_{dc}\),如图3所示:


图3

为了避免输出电压失真,将\(|U_{max}|\)限制在\(|\frac{\sqrt{3}U_x}{2}|\)

则有:

\[ T_4 = \frac{\sqrt{3}U_{\alpha}T_s +U_{\beta}T_s}{2|U_{max}|}\\ T_6 = -\frac{U_{\beta}T_s}{|U_{max}|}\\ \]

在ST的库中,\(\frac{U_{\alpha}}{|Umax|} = V_{\alpha},\frac{U_{\beta}}{|Umax|} = V_{\beta}\),因此

\[ T_4 = \frac{(\sqrt{3}V_{\alpha}T_s + V_{\beta}T_s)}{2} = -\frac{wZ}{2}\\ T_6 = -V_{\beta}T_s = \frac{wX}{2}\\ \]

在第一扇区,矢量分布如图4:


图3

由于采用中心对称计数模式,计算单侧时间即可。
可得

\[ T_a = \frac{T_0}{4} = \frac{T_s - T_4 - T_6}{4} = \frac{T_s}{4} + \frac{(wZ - wX)}{8}\\ T_b = T_a + \frac{T_4}{2} = T_a - \frac{wZ}{4}\\ T_c = T_b + \frac{T_6}{2} = T_b +\frac{wX}{4}\\ \]

代码解读

这时候对比st的代码

    pHandle->Sector = SECTOR_1;
    wTimePhA = (((int32_t)pHandle->PWMperiod) / 4)+ ((wX - wZ) / (int32_t)262144);
    wTimePhB = wTimePhA + (wZ / 131072);
    wTimePhC = wTimePhB - (wX / 131072);

显然

\[262144 = 32768 \times 8\\ 131072 = 32768 \times 4 \]

观察\(wX\):

\[ wX = -2V_βT_s\\ \]

其中\(V_β\)为int16_t,即q15格式。在前面有

\[ V_β = \frac{U_{\beta}}{|Umax|}\\ \]

显然\(V_β\in [-1,1]\),为浮点型。因此这里除以\(32768\)实际上是将q15转换为float

因此st计算公式可表示为

\[ T_a = \frac{T_s}{4} + \frac{(wX - wZ)}{8}\\ T_b = T_a + \frac{wZ}{4}\\ T_c = T_b -\frac{wX}{4}\\ \]

可以看到,和我们推算出的公式符号不一致。

参考st的定时器配置,发现st采用的向下中心计数模式,前面参考的图为向上计数,因此重新推算公式如下:

\[ T_a =\frac{T_s}{2} - \frac{T_0}{4} =\frac{T_s + T_6 + T_4}{4} = \frac{T_s}{4} + \frac{(wX - wZ)}{8}\\ T_b = T_a - \frac{T_4}{2} = T_a + \frac{wZ}{4}\\ T_c = T_b + \frac{T_6}{2} = T_b - \frac{wX}{4}\\ \]

和代码中吻合。

其他扇区按照相同方法推算,得出每个扇区对应的计算公式,实际使用时,根据扇区选择对应的计算公式即可。

过调制

前面为了矢量不失真,将\(|U_{max}|\)限制了在\(|\frac{\sqrt{3}}{2}U_x|\)即\(|\frac{\sqrt{3}}{3}U_{dc}|\)

将\([0,\frac{\sqrt{3}U_{dc}}{3}]\)称之为线性区,在线性区内,\(U_{out}和U_{\alpha}U_{\beta}\)线性相关;

将\((\frac{\sqrt{3}}{3}U_{dc},\frac{2}{3}U_{dc}]\)称之为过调制区,在过调制区内,需要对\(U_{\alpha}U_{\beta}\)进行缩放,以保证合成矢量\(U_{out}\)不超出最大幅值。过调制方法这里不再探讨,可以参考相关文章:

《STM32 MC SDK Overmodulation (new in V5.Y) - stm32mcu (stmicroelectronics.cn)》

《电控入门之五(电机FOC,SVPWM过调制算法) - 知乎 (zhihu.com)》

《stm32 foc 库输出波形 - USTHzhanglu - 博客园 (cnblogs.com)》

标签:frac,扇区,sqrt,st,beta,foc,wZ,wX
From: https://www.cnblogs.com/USTHzhanglu/p/18072147

相关文章

  • Django和Fastapi异步性能对比
    突发奇想,我想验证一下Python的异步后端框架的并发能力.目前主流的异步框架有Fastapi,Django和Tornado.顺便我想对比一下它们的性能,但是考虑到Tornado自成一派没有遵循Asgi,没办法屏蔽服务器部分的代码效率,所以我打算只拿Fastapi和Django做下对比.实验设计运行设备:4核8进......
  • Linux 性能优化工具包 sysstat
    简介Sysstat是一套在Linux系统中广泛使用的性能监控工具集,主要用于收集和分析系统的各种性能统计信息。它包含了多个命令行工具,这些工具能够帮助系统管理员和开发人员实时或周期性地监控服务器的CPU使用率、内存使用、磁盘I/O、网络流量以及其他重要的系统资源指标。主要包含的......
  • 京东ES支持ZSTD压缩算法上线了:高性能,低成本
    京东ES支持ZSTD压缩算法上线了,这是一种高性能、低成本的压缩算法,能够提高数据存储和传输的效率,同时降低存储和带宽成本。ZSTD算法是一种快速压缩算法,可提供比其他压缩算法更高的压缩比和更快的压缩速度。这意味着,京东ES用户可以更高效地存储和传输数据,同时节省存储和带宽......
  • 【linux system V 消息队列】
    #简介消息队列就是一些消息的列表,或者说是一些消息组成的队列。消息队列与管道有些类似,消息队列可以认为是管道的改进版。相较于管道的先进先出准则,消息队列在读取时可以按照消息的类型进行读取,这也是消息队列的特点,它可以实现消息随机查询。消息发送时,需要将消息封装,然......
  • queue 和 stack 容器
    queue容器1.queue基本概念**概念:先进先出队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为2.queue常用接口构造函数:queue<T>que;//queue采用模板类实现,queue对象的默认构造形式queue(constqueue&que);//拷贝构造函数赋值操作:queue&operator=......
  • Elastic Stack基础
    ElasticStack组件介绍ElasticsearchElasticsearch是使用java开发,基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等LogstashLogstash基于java开发,是一个数......
  • list容器
    list1.list基本概念功能:将数据进行链式存储链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域STL中的链表是一个双向......
  • 写给rust初学者的教程(二):所有权、生命周期
    这系列RUST教程一共三篇。这是第二篇,介绍RUST语言的关键概念,主要是所有权和声明周期等。第一篇:写给rust初学者的教程(一):枚举、特征、实现、模式匹配在写第一篇中的练习代码时,不知道你有没有尝试过连续两次执行vec_min函数。这种做法在大部分其他语言中都属于正常行为,但如果你对......
  • 轻量级.net standard微信支付登录Nuget开源库
    我个人编写的库,在我个人网站,小程序等很多地方都在使用中,大家可以搜索小程序什邡市宅猫君网络工作室或者到我的网站store.zhaimaojun.cn 去体验支付和登录效果。本库主要实现了nativepay(二维码支付)jsapipay(小程序直接调起支付),需要注意的是这是基于api3的,非api2。以下演示如......
  • Elasticsearch - Docker安装Elasticsearch8.12.2
    前言最近在学习ES,所以需要在服务器上装一个单节点的ES服务器环境:centos7.9安装下载镜像目前最新版本是8.12.2dockerpulldocker.elastic.co/elasticsearch/elasticsearch:8.12.2创建配置新增配置文件elasticsearch.ymlhttp.host:0.0.0.0http.cors.enabled:true......