FOC电机驱动开发踩坑记录

关键技术

  • SVPWM电机磁场控制
  • 电流采样
  • park变换和Clark变换
  • 滑膜观测器(无感FOC)

SVPWM电机磁场控制

SVPWM主要思想是通过精确的对UVW三相电流的分时控制,来控制转子的合成力矩,达到目标方向,常用的是6分区的设计,SVPWM是一种通过工程设计出来的处理程序,不是算法,主要参考实现的博客:
https://blog.csdn.net/qlexcel/article/details/74787619
示例代码:

// 使用查找表来替代三角函数的计算(示例,需要根据实际需要生成表格)
#define SIN_TABLE_SIZE 720 // 假设我们使用720项的查找表
float sinTable[SIN_TABLE_SIZE]; // 预先计算的正弦表
float cosTable[SIN_TABLE_SIZE]; // 预先计算的余弦表// 初始化正弦和余弦查找表
void initTrigTables() {for (int i = 0; i < SIN_TABLE_SIZE; ++i) {sinTable[i] = sinf((TWO_PI * i) / SIN_TABLE_SIZE);cosTable[i] = cosf((TWO_PI * i) / SIN_TABLE_SIZE);}
}void SVPWM(float Uq, float Ud, float angle) {if (Uq>0){angle = normalizeAngle(angle);}else{angle = normalizeAngle(angle);}// 使用查找表获取正弦和余弦表int index = (int)((angle / TWO_PI) * SIN_TABLE_SIZE) % SIN_TABLE_SIZE;float sin_angle = sinTable[index]; // sinf(angle_el);float cos_angle = cosTable[index]; // cosf(angle_el);float ua, ub;inverse_park_transform(Ud, Uq, &ua, &ub, cos_angle, sin_angle);float ts = 1.0;float udc = voltage_supply;float u1, u2, u3;inverse_clark_transflorm(ua, ub, &u1, &u2, &u3);int A = u1 > 0 ? 1 : 0;int B = u2 > 0 ? 1 : 0;int C = u3 > 0 ? 1 : 0;int N = 4 * A + 2 * B + C;int sector = 0;int sector_map[7] = {0, 6, 4, 5, 2, 1, 3}; // 0 index not usedsector = sector_map[N];float K = SQRT3_OVER_2 * ts / udc;float t1, t2, t3, t4, t5, t6, t7, k;switch (sector) {case 1:t4 = u3 * K;t6 = u1 * K;if (t4 + t6 > ts) {k = ts / (t4 + t6);t4 *= k;t6 *= k;}t7 = (ts - t4 - t6) / 2.0;ta = t4 + t6 + t7;tb = t6 + t7;tc = t7;break;case 2:t2 = -u3 * K;t6 = -u2 * K;if (t2 + t6 > ts) {k = ts / (t2 + t6);t2 *= k;t6 *= k;}t7 = (ts - t2 - t6) / 2.0;tb = t2 + t6 + t7;ta = t6 + t7;tc = t7;break;case 3:t2 = u1 * K;t3 = u2 * K;if (t2 + t3 > ts) {k = ts / (t2 + t3);t2 *= k;t3 *= k;}t7 = (ts - t2 - t3) / 2.0;tb = t2 + t3 + t7;tc = t3 + t7;ta = t7;break;case 4:t1 = -u1 * K;t3 = -u3 * K;if (t1 + t3 > ts) {k = ts / (t1 + t3);t1 *= k;t3 *= k;}t7 = (ts - t1 - t3) / 2.0;tc = t1 + t3 + t7;tb = t3 + t7;ta = t7;break;case 5:t1 = u2 * K;t5 = u3 * K;if (t1 + t5 > ts) {k = ts / (t1 + t5);t1 *= k;t5 *= k;}t7 = (ts - t1 - t5) / 2.0;tc = t1 + t5 + t7;ta = t5 + t7;tb = t7;break;case 6:t4 = -u2 * K;t5 = -u1 * K;if (t4 + t5 > ts) {k = ts / (t4 + t5);t4 *= k;t5 *= k;}t7 = (ts - t4 - t5) / 2.0;ta = t4 + t5 + t7;tc = t5 + t7;tb = t7;break;default:ta = tb = tc = 0.0;break;}__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (uint32_t)(ta/ts*MAX_DUTY_CYCLE));__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, (uint32_t)(tb/ts*MAX_DUTY_CYCLE));__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, (uint32_t)(tc/ts*MAX_DUTY_CYCLE));
}

电流采样

电机的三相电流采样有3种采样的方法,1种是3相电流全部采样,好处是能采到三相的实时真实电流,缺点是成本是最高的;第二种是2相电流采样,通过3相电流之和为0可以算出第3相的电流,好处是降低了一些成本,缺点是精度没有3相的高;第三种是在总的电路上采样总电流,通过算法算出3相电流的值,好处是成本是最低的,缺点是精度也是最差的;
电机的电流采样电阻的采样位置有3种:1. 输出电流采样,优点是能够实时采到三相电流,缺点是对于采样器件例如INI181的电压耐受范围有要求,电压承受能力不够可能会导致器件损坏;2. 低压区域采样,优点是对应器件的电压承受能力要求低,缺点是需要精确控制采样的时间,采样时间必须在H桥的下臂导通时进行采样,否则采样不到正确的电流;3. 母线电流采样,仅在有效矢量时刻进行电流采样,同样存在采样盲区。

park变换和Clark变换

park变换和Clark变换为经典的变换,可以从很多博客上看原理,代码示例如下:

 #include "main.h"
#include "tools.h"
#define SQRT3_OVER_2 0.866void clark_transform(float u1, float u2, float u3, float *ualpha, float *ubeta){*ualpha = 0.66666*(u1 - 0.5*u2 - 0.5*u3);*ubeta = 0.6666*(u2*SQRT3_OVER_2 - SQRT3_OVER_2 * u3);
}void inverse_clark_transflorm(float ualpha, float ubeta, float *u1, float *u2, float *u3){*u1 = ualpha;*u2 = -0.5*ualpha + SQRT3_OVER_2 * ubeta;*u3 = -0.5*ualpha - SQRT3_OVER_2 * ubeta;
}
void park_transform(float ialpha, float ibeta, float cos_angle, float sin_angle, float *id, float *iq){*id = ialpha * cos_angle + ibeta * sin_angle;*iq = -ialpha * sin_angle + ibeta *cos_angle;
}
void inverse_park_transform(float id, float iq, float *ialpha, float *ibeta, float cos_angle, float sin_angle){*ialpha = id * cos_angle - iq * sin_angle;*ibeta = id * sin_angle + iq * cos_angle;
}

滑膜观测器

通过使用上面的技术和代码,可以做到有感FOC的控制了,但是想要不使用转子位置传感器的话还要在控制时使用一些算法。常用的无感FOC控制算法有滑膜控制器、龙博格观测器,基本都是靠观测器加锁相环来实现对转子角度位置的估计,但是都会有一些问题,滑膜控制器的问题是可能会出现电机震荡,可以通过调整参数的大小来降低震荡的幅度但一定会有。滑膜变阻器的MATLAB仿真图如下:
在这里插入图片描述

踩坑记录

  • park变换与反变换和clark变换与反变换要对应好,SVPWM中的变换必须和电流采样时的每条线的顺序都相同;
  • 电流采样时使用的是下桥采样,需要控制好采样时间,采样时间要在下桥臂导通的时候采样;
  • 使用中心对称的PWM模式;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432913.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ 高级特性——重试机制

文章目录 前言重试机制配置文件设置生命交换机、队列和绑定关系生产者发送消息消费消息 前言 前面我们学习了 RabbitMQ 保证消息传递可靠性的机制——消息确认、持久化和发送发确认&#xff0c;那么对于消息确认和发送方确认&#xff0c;如果接收方没有收到消息&#xff0c;那…

C++类和对象——第二关

目录 类的默认成员函数&#xff1a; &#xff08;一&#xff09;构造函数 &#xff08;二&#xff09;析构函数 &#xff08;三&#xff09;拷贝构造函数 类的默认成员函数&#xff1a; 类里面有6个特殊的成员函数分别包揽不同的功能; &#xff08;一&#xff09;构造函数…

极狐GitLab 17.4 升级指南

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab https://dl.gitlab.cn/6y2wxugm 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文分享极狐GitLab 17.4 升级…

老人跌倒扶不扶?涪城三职工给出响亮答案

一、关键时刻的选择 于绵阳市三江湖湿地公园&#xff0c;平凡午后&#xff0c;三名环卫人员刘后刚、严荣礼及杨树坤正紧张作业。突闻呼救声&#xff0c;一位老人在石阶上跌倒需援手。在紧急关头&#xff0c;他们果断抛却工具&#xff0c;疾速赶至老人身边。此举不仅展现了他们…

MySQL数据库进阶知识(四)《视图、存储过程、触发器》

学习目标&#xff1a; 掌握数据库视图基础知识 掌握数据库存储过程原理 掌握数据库触发器相关知识 学习内容&#xff1a; 一. 视图 介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询…

JPEG图像的DCT(Discrete Cosine Transform)变换公式代码详解

引 言 网络上图像在传输过程中为节省内存空间主要采用jpeg格式。jpeg图属于有损压缩图像的一种。在图像篡改检测过程中&#xff0c;可以利用jpeg图像的单双压缩伪影的不同而判别图像为伪造图并可以定位伪造区域。RGB图像变成jpeg图像过程中涉及从RGB图变成YCbCr图像&#xff0c…

FreeRTOS(四)FreeRTOS列表与列表项

目录 列表 列表项 迷你列表项 列表和列表项的关系 列表相关API函数 列表初始化 列表项初始化 列表项插入 列表项末尾插入 列表项删除 列表遍历 在 FreeRTOS 中&#xff0c;列表&#xff08;List&#xff09;和列表项&#xff08;ListItem&#xff09;是核心数据结构&…

Centos7系统根分区空间小home空间大如何增加分区

Centos7 默认安装&#xff0c;区划默认划分&#xff0c;用着怎么感觉有问题&#xff0c;根分区太小50G&#xff0c;而home分区太大。 如果处理&#xff0c;能扩大根分区呢&#xff1f;如果是新安装的&#xff0c;可以先删除home&#xff0c;然后再扩容 根分区。最后使其生效。…

计算机视觉硬件整理(四):相机与镜头参数介绍

文章目录 前言一、工业相机常用分类二、工业相机的基本参数三、工业相机的接口四、工业镜头的参数五、工业镜头的选择要点 前言 随着科技的飞速发展&#xff0c;工业自动化和智能制造在当今社会扮演着越来越重要的角色。在这个背景下&#xff0c;工业相机作为一种关键的视觉检…

Qualitor processVariavel.php 未授权命令注入漏洞复现(CVE-2023-47253)

0x01 漏洞概述 Qualitor 8.20及之前版本存在命令注入漏洞,远程攻击者可利用该漏洞通过PHP代码执行任意代码。 0x02 复现环境 FOFA&#xff1a;app"Qualitor-Web" 0x03 漏洞复现 PoC GET /html/ad/adpesquisasql/request/processVariavel.php?gridValoresPopHi…

【azure-openai】批量翻译demo【python】【gradio】

要求&#xff1a;拥有azure-openai-api&#xff0c;上传文件为csv格式&#xff0c;utf-8编码。 注意&#xff1a;如果出现乱码&#xff0c;重新运行&#xff0c;换种方式打开&#xff0c;有时候wps会自动改编码。 实现功能&#xff1a;选择语言&#xff0c;使用gpt4omini&…

使用docker形式部署prometheus+alertmanager+钉钉告警

一、拉取所需要的镜像 docker pull prom/node-exporter docker pull grafana/grafana docker pull prom/prometheus docker pull prom/alertmanager 其中 prom/node-exporter&#xff1a;用于收集主机系统信息和指标的 grafana/grafana&#xff1a;是一个用于可视化和分…

mac 上配置Jmeter代理进行web脚本录制过程容易踩坑的点

macOS 配置 Jmeter代理录制web脚本&容易踩坑的点 mac配置下载&#xff1a;前景提要&#xff1a;Jmeter中具体操作容易踩坑的点1、进入浏览器后&#xff0c;显示访问连接不安全。2、证书失效需要重新生成3、重新生成证书的方式4、没有生成新的证书5、jmeter安装路径找不到 m…

硬件设计很简单?合宙低功耗4G模组Air780E—开机启动及外围电路设计

Air780E是合宙低功耗4G-Cat.1模组经典型号之一&#xff0c;上期我们解答了大家关心的系列问题&#xff0c;并讲解了选型的注意要点。 有朋友问&#xff1a;能不能讲些硬件设计相关的内容&#xff1f; 模组的上电开机&#xff0c;是硬件设计调试的第一步。 本期特别分享——Ai…

MySQL数据库进阶知识(五)《锁》

学习目标&#xff1a; 一周掌握数据库锁相关知识 学习内容&#xff1a; 一. 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共…

将本地文件上传至虚拟机

1、查看虚拟机ip地址 ip addr 2、xshell连接上虚拟机 连接root连接不上的解决办法更改配置文件vim /etc/ssh/sshd_config 重启&#xff08;sudo service ssh restart&#xff09;并查看是否开启ssh服务&#xff08;sudo ps -e | grep ssh&#xff09; 即可连接成功 3、复制文…

在实时语音交互上超过GPT-4o,端到端语音模型Mini-Omni部署

Mini-Omni是清华大学开源的多模态大型语言模型&#xff0c;具备实时语音输入和流式音频输出的能力。 Mini-Omni模型能够一边听、一边说&#xff0c;一边思考&#xff0c;类似于ChatGPT的语言对话模式。 Mini-Omni模型的主要特点是能够直接通过音频模态进行推理&#xff0c;并…

Skywalking告警配置

背景 skywalking 9.7.0&#xff0c;地址&#xff1a;Backend setup | Apache SkyWalking helm&#xff1a;skywalking-helm:4.5.0&#xff0c;地址&#xff1a;skywalking-helm/chart/skywalking/values.yaml at v4.5.0 首先来说一下为什么使用skywalking告警&#xff1f; …

JS设计模式之组合模式:打造灵活高效的对象层次结构

引言 当我们构建复杂的应用程序时&#xff0c;经常会遇到处理对象层次结构的情况。这些层次结构通常是树形结构&#xff0c;由组合节点和叶子节点组成。在这样的情况下&#xff0c;JavaScript 设计模式之一的组合模式就能派上用场。 组合模式是一种结构型设计模式&#xff0c…

MySQL从入门到精通 - 基础篇

一、MySQL概述 1. 数据库相关概念 二、SQL &#xff08;1&#xff09;SQL通用语法 &#xff08;2&#xff09;SQL分类 &#xff08;3&#xff09;数据定义语言DDL 数据库操作 表操作 数据类型 1. 数值类型 2. 字符串类型 二进制数据&#xff1a;以二进制格式&#xff08;0和…