当前位置: 首页 > news >正文

STC-FOC Lite程序详解-SVPWM查表生成

本篇文章致力于对STC-FOC Lite的原版代码进行详尽的原理解释,并且提出更改/移植/裁剪建议,方便大家对这个项目进行更加适配自己的个性化更改。
在对SVPWM代码进行理解前,需要先对SVPWM的一些概念进行清楚。首先SVPWM并不是一种算法,只是一种波形的名称。SVPWM在程序输出上大概的是长这样子。

      以上的波形是存在正负的交流波形,实际进行PWM输出的时候,需要将电压抬高到0~VCC的范围内。也就是说,正常没有输出的时候,电机的三相输出也是存在着三路50%占空比的PWM输出。此时电机的输入电流为0,因为三相线同时抬高和降低,并不存在电位差。
      虽然SVPWM本身并不算是一种算法,但是逆帕克变换和逆克拉克变换就是算法了,这两个主要是为了将常量Ud和Uq重新通过电角度转换成电压矢量。从结果来看,就是生成SVPWM波形。
      如果将这些逆变换作为一个函数来看,就是输入了Uq(电机切向力,越大转的越快),Ud(电机侧向力矩,给的大也不会转)(Uq和Ud相互垂直),还有一个电角度,然后就能输出控制电机的三相波形。
      这里因为是开环控制,所以没法闭环Ud。将Ud设置为0,Ud设置为满幅值,即可得到上面的波形。控制Uq的大小,只需要对波形整体做高度上的缩放即可。

讲完了基本原理,接下来讲一下详细的程序:
  1. // 归一化角度到0~编码器最大值范围
  2. int _normalizeDat(long angle_dat)
  3. {
  4.         int result = (int)(angle_dat % (Encode_bit_Max - 1));
  5.         return (result >= 0) ? (result) : (result + (Encode_bit_Max - 1));
  6. }

复制代码

首先是角度归一化,将数据缩放到编码器最大值,因为电角度和实际的读取角度之间存在一个比例换算关系(跟极对数和方向有关),所以要防止这个角度溢出。
  1. // 获得原始数据
  2. u16 Read_Angle_Int_Dat(void)
  3. {
  4.     return _normalizeDat((_angle_this_dat * moto_save.dir * moto_save.pp) - moto_save.zero); // 机械绝对值角度转换为电角度
  5.     // Tips:_zero这个是必须存在的,因为如果没有对零点对齐的话,粘磁铁导致的角度误差将导致电机无法正确旋转
  6. }

复制代码

      接下来是读取原始的电角度数据,_angle_this_dat就是从磁编码器读到的原始数据,不过,因为极对数的存在,并不能直接使用。需要对原始点角度乘以极对数和方向,并且加上零点数据来进行对齐。
  1. /**
  2. * 根据编码数据获取SVPWM数值
  3. *
  4. * 本函数通过编码数据计算并返回相应的SVPWM数值编码数据被分为四个区间,
  5. * 每个区间对应一种SVPWM数值的计算方式这种设计是为了压缩存储,以减少内存占用,
  6. * 不同相位的SVPWM信号生成
  7. *
  8. * @param encode_dat 编码数据,这是一个16位的整数,代表某种编码后的数据
  9. * @return 返回计算出的SVPWM数值,它可以根据输入的编码数据分布在四个不同的区间内
  10. */
  11. int Get_SVPWM_Num(u16 encode_dat)
  12. {
  13.         int out;
  14.         // 根据编码数据在区间[0, 16383]中的位置,决定使用哪种方式计算SVPWM数值
  15.         switch ((encode_dat % 16384) / 4096)
  16.         {
  17.         case 0:
  18.                 // 在第一个区间[0, 4095]内,直接使用编码数据模4096作为索引获取SVPWM数值
  19.                 out = SVPWM_List[encode_dat % 4096];
  20.                 break;
  21.         case 1:
  22.                 // 在第二个区间[4096, 8191]内,使用4095减去编码数据模4096作为索引获取SVPWM数值,并保持正向
  23.                 out = SVPWM_List[4095 - (encode_dat % 4096)];
  24.                 break;
  25.         case 2:
  26.                 // 在第三个区间[8192, 12287]内,直接使用编码数据模4096作为索引获取SVPWM数值,并取负值
  27.                 out = -SVPWM_List[encode_dat % 4096];
  28.                 break;
  29.         case 3:
  30.                 // 在第四个区间[12288, 16383]内,使用4095减去编码数据模4096作为索引获取SVPWM数值,并取负值
  31.                 out = -SVPWM_List[4095 - (encode_dat % 4096)];
  32.                 break;
  33.         }
  34.         return out;
  35. }

复制代码

      接下来的这个就是对于SVPWM表数据的压缩,因为SVPWM的三相信号其实只是存在120°的相位差,本质波形都是一样的。所以只存一相的波形就可以了。
并且,将单个SVPWM波形等分四份后,可以观察到,后面三份都可以通过第一份的垂直镜像和水平镜像得到。所以,上面这个函数就是处理超出1/4区域的波形,使得在正确的区间内进行变换,从而取到一个正确的SVPWM波形。
  1. void setTorque(float Uq, u16 encode_dat)
  2. {
  3.         float ratio = (Uq / voltage_power_supply) * (1.0 / 12.0); // 乘以宏定义方向
  4.         out1 = (int)(Get_SVPWM_Num(encode_dat) * ratio);
  5.         out2 = (int)(Get_SVPWM_Num(encode_dat + 5461) * ratio); // 偏移得到剩余两相波形
  6.         out3 = (int)(Get_SVPWM_Num(encode_dat + 10922) * ratio);
  7.         setPwm(out1, out2, out3);
  8. }

复制代码

      接下来就是最终的输出函数了,意外的是不是有些简单?
      因为复杂的计算都通过表简化了,这种方式可以保证一次运算,无限调用。十分适合电机这种每次都要重复计算的场合。
      这个函数里面通过对SVPWM表的偏移实现了完整的三相波形输出,并且表仅仅占用了8K的程序ROM空间(考虑到分辨率和不同极对数适配,所以没有再次压缩,不然占用空间可以进一步缩小到1.2K的ROM大小)

      通过调用setTorque这个函数就可以实现电机的闭环转动了。如果没有接编码器,直接给一个虚拟的自增电角度,电机也是可以转的。

STC-FOC Lite程序详解-SVPWM查表生成
https://www.stcaimcu.com/thread-11505-1-1.html
(出处: 国芯人工智能技术交流网站)

http://www.dtcms.com/a/594768.html

相关文章:

  • 个人网站怎么做代码电子商务专业网页设计
  • 大模型应用评估指标学习笔记
  • 加氢站个公司好wordpress如何进数据库
  • [优选算法专题六.模拟 ——NO.40~41 外观数列、数青蛙]
  • 腾讯云服务器磁盘在线扩容系统盘
  • 网站制作详细流程sql数据库做的网站怎么发布
  • 关于网站开发的步骤音乐网站可做哪些内容
  • MySQL学习路线:4周从入门到实战
  • 站长检测同ip网站很多怎么办wordpress无法修改
  • 成都私人做网站信丰做网站
  • 正则表达式入门
  • 男和女做暖暖网站青海城乡住房建设厅网站
  • 服装设计师常用网站企业文化墙设计图效果图
  • 做爰全过程免费的教网站邢台做网站价位
  • 贵阳网站seo公司2022一级造价师停考
  • 递归函数练习题
  • [設計模式]設計模式原則
  • 【RK3568】TFTP+NFS启动文件系统
  • 网站建设 中标都江堰建设局网站
  • 网站开站备案外贸营销推广方案
  • 怎样注册网站中文域名免费个人网站 上传
  • 【Janet】控制流
  • 网站建设哪家公司最好免费医院网页模板
  • 【App开发】05:Android Studio项目配置文件全解析( App 项目结构)
  • 合并两个有序链表 --- 递归
  • 编译立创S3小智语音机器人+修改表情
  • 网站的文件夹结构承包工地的网站
  • Simulink从入门到入门--热水器1
  • 【开题答辩实录分享】以《云音乐小程序设计与开发》为例进行答辩实录分享
  • 三生团队网站找谁做的国人原创wordpress主题