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.mzph.cn/diannao/55301.shtml

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

相关文章

Ubuntu 安装 Docker Compose

安装Docker Compose # 删除现有的 docker-compose&#xff08;如果存在&#xff09; sudo rm -f /usr/local/bin/docker-compose ​ # 下载最新的 docker-compose 二进制文件 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-…

C++平台跳跃游戏

目录 开头程序Game.cpp源文件Player.h头文件Player.cpp源文件 程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 Game.cpp源文件 #include <iostream> #include "Player.h" using namespace std; void printma…

scrapy爬取汽车、车评数据【上】

这个爬虫我想分三期来写&#xff1a; ✅ 第一期写如何爬取汽车的车型信息&#xff1b; ✅ 第二期写如何爬取汽车的车评&#xff1b; ✅ 第三期写如何对车评嵌入情感分析结果&#xff0c;以及用简单的方法把数据插入mysql中&#xff1b; 技术基于scrapy框架、BERT语言模型、mysq…

JQuery基本介绍和使用方法

JQuery基本介绍和使用方法 W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: ⽹⻚内容⽹⻚结构⽹⻚样式 但是原⽣的JavaScript提供的API操作DOM元素时, 代码⽐较繁琐, 冗⻓. 我们可以使⽤JQuery来操作⻚⾯对象. jQuery是⼀个快速、简洁且功能丰富的JavaScript框架, 于20…

【Spring】Spring Boot项目创建和目录介绍

文章目录 1 Spring Boot 介绍2 Spring Boot 项目创建注意事项 3. 项目代码和目录介绍pom 文件父工程目录介绍 1 Spring Boot 介绍 Spring 让 Java 程序更加快速、简单和安全&#xff0c;Spring 对于速度、简单性和生产力的关注使其成为世界上最流行的 Java 框架 Spring 官方提…

用Python+flask+mysql等开发的Excel数据资产落地工具

话不多说 1)Excel文件上传,列表预览 2)选中要导入结构及数据的Excel文件 约束说明: 2.1)Excel文件的第一行约定为表头名称 2.2)系统自动识别字段列名及数据类型,目前不支持合并表头 3)Excel建表导入数据成功后,可在表源列表中预览查看 4)对数据表源可进行透视图设计管理,可对…

叉车防撞系统方案,引领安全作业新时代

在现代工业的舞台上&#xff0c;叉车如同忙碌的“搬运工”&#xff0c;在仓储和制造环境中发挥着不可或缺的作用。然而&#xff0c;随着叉车使用频率的不断攀升&#xff0c;安全事故也如影随形&#xff0c;给企业带来经济损失的同时&#xff0c;更严重威胁着操作人员的生命安全…

深入探讨Windows 11专业版与Windows 11专业工作站版的差异

前言 深入探讨Windows 11专业版与Windows 11专业工作站版的差异&#xff0c;可以更全面地理解这两款操作系统版本面向的不同用户群体、硬件支持、性能特点以及应用场景&#xff0c;从而为专业用户和企业选择最合适的平台提供依据。 硬件支持与扩展能力 Windows 11专业版&…

HTB:Unified[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which are the first four open ports? 2.What is the title of the software that is running running on port 8443? 3.What is the version of the software that is running? 4.What is the CVE for the identified vulnerabilit…

数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall

数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall 数据集-目标检测系列-豹子 猎豹 检测数据集 leopard 数据量&#xff1a;5k 想要进一步了解&#xff0c;请联系。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#x…

贝锐蒲公英工业物联方案:助力美的智慧楼宇全球布局

智慧楼宇正日益成为现代城市发展的基石&#xff0c;作为该领域的先锋&#xff0c;美的楼宇科技通过其创新的iBUILDING数字化平台和低碳技术&#xff0c;引领着智慧空间的可持续发展&#xff0c;并持续推动建筑及相关行业的数字化转型。 美的楼宇科技的解决方案融合了先进的楼宇…

五子棋双人对战项目(5)——对战模块

目录 一、需求分析 二、约定前后端交互接口 三、实现游戏房间页面&#xff08;前端代码&#xff09; game_room.html game_room.css srcipt.js 四、实现后端代码 GameAPI Room Mapper 五、线程安全问题 一、需求分析 在对局中&#xff0c;玩家需要知道实时对局情况&…

商家营销工具架构升级总结

今年以来&#xff0c;商家营销工具业务需求井喷&#xff0c;需求数量多且耗时都比较长&#xff0c;技术侧面临很大的压力。因此这篇文章主要讨论营销工具前端要如何应对这样大规模的业务需求。 问题拆解 我们核心面对的问题主要如下&#xff1a; 1. 人力有限 我们除了要支撑存量…

redis 5的安装及启动(window)

最近看大模型的时候发现入手redis的同学没有练手的&#xff0c;而且大部分redis的文章要钱才能看&#xff0c;在这里我把路径和环境配置&#xff0c;启动给大家说一下 下载 redis5的获取链接在下面&#xff08;为什么是redis5&#xff0c;因为上个模型用的就是redis5&#xff…

基于单片机的两轮直立平衡车的设计

本设计基于单片机设计的两轮自平衡小车&#xff0c;其中机械部分包括车体、车轮、直流电机、锂电池等部件。控制电路板采用STC12C5A60S2作为主控制器&#xff0c;采用6轴姿态传感器MPU6050测量小车倾角&#xff0c;采用TB6612FNG芯片驱动电机。通过模块化编程完成了平衡车系统软…

《动手学深度学习》笔记2.5——神经网络从基础→使用GPU (CUDA-单卡-多卡-张量操作)

目录 0. 前言 原书正文 1. 计算设备 (CPU和GPU) 补充&#xff1a;torch版本cuda报错的解决方案 2. 张量与GPU 3. 存储在GPU上 4. 复制&#xff08;多卡操作&#xff09; 5. 旁注 (CPU和GPU之间挪数据) 6. 神经网络与GPU 小结 0. 前言 课程全部代码&#xff08;pytorc…

运动耳机哪个牌子的好?5大质量不凡的运动耳机测评力荐!

在快节奏的生活中&#xff0c;无论是晨跑、健身还是户外探险&#xff0c;音乐都成了许多人不可或缺的陪伴。运动耳机&#xff0c;作为一种专为运动场景设计的音频设备&#xff0c;旨在提供高质量音频体验的同时&#xff0c;保证佩戴的舒适度和运动的安全性。 &#xff08;上图为…

Spring之生成Bean

Bean的生命周期&#xff1a;实例化->属性填充->初始化->销毁 核心入口方法&#xff1a;finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…

【JavaEE】——多线程常用类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a; 一&#xff1a;Callable和FutureTask类 1&#xff1a;对比Runnable 2&#xff1a…

IT新秀系列:Go语言的兴起

Go语言&#xff08;Golang&#xff09;由谷歌于2007年发起&#xff0c;并于2009年正式开源。它的诞生背景可以追溯到互联网技术的高速发展时期。那时&#xff0c;软件开发面临着多核计算、大规模并发处理、部署和维护效率低下等挑战。作为一种新型的编程语言&#xff0c;Go主要…