FOC电机驱动开发踩坑记录

news2024/9/27 11:09:01

关键技术

  • 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 used
    sector = 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.866

void 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.coloradmin.cn/o/2169792.html

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

相关文章

新160个crackme - 066-Andrnalin.3

运行分析 文字是德语&#xff0c;需要破解Key PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用 VB Decompiler 静态分析&#xff0c;发现逻辑如下&#xff1a;1、提取Key每个字符 102、计算后的Key要与"kXy^rO|yXom\kMuOn*"相等 算法分析…

基于单片机的小车行走加温湿度检测系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;滑动变阻器连接数码转换器模拟电量采集传感器&#xff0c; 电机采样L298N驱动&#xff0c;各项参数通过LCD1602显示&#x…

影刀--- 自动化机器人需要了解的三大逻辑

这篇文章主要就是在影刀这个软件中对于循环和条件命令的使用&#xff0c;进行各种逆天操作 希望大家多多支持啊 目录 1.条件判断的基本用法&#xff08;单分支&#xff09;2.二分支3.多分支4.条件的嵌套与多条件判断](https://flowus.cn/ceb9d0ea-1963-418d-b782-d2d77bfb6e53…

Java 环境变量的设置及其目的

文章目录 1. **为什么要设置Java环境变量&#xff1f;**2. **设置Java环境变量的步骤&#xff08;Windows举例&#xff09;**3. **设置环境变量的目的**3.1 原理1. **PATH 环境变量的作用**2. **JDK 的 bin 目录**3. **执行流程**4. **示例&#xff08;Linux&#xff09;** 总结…

【React】react hooks的使用规则

1. 使用规则 1.1 反例 import { useState } from react// 错误1 // useToggle()function Son() {return <div>子组件</div> }function useToggle() {const [isShow, setIsShow] useState(true)function toggle() {setIsShow(!isShow)}return {isShow,toggle} }fu…

传输大咖49 | 镭速助力影视传媒行业跨国文件传输更加安全、高效

在影视传媒领域&#xff0c;跨国合作已成为常态&#xff0c;伴随而来的是跨国文件交换的日益频繁。这无疑对文件的跨国传输效率、安全性和稳定性提出了更为严格的标准。接下来&#xff0c;我将为您分析影视传媒业在进行跨国文件传输时所面临的挑战&#xff0c;并提供一些有效的…

【软设】计算机网络

【软设】计算机网络 一.OSI/RM七层模型 (七层模型还是要知道的&#xff0c;后面再去记一些协议&#xff0c;知道每一层应用在哪些方面&#xff0c;给你个东西或者协议你要能看得出来) OSI/RM&#xff08;Open Systems Interconnection Reference Model&#xff09;是国际标准…

书生大模型实战营学习[7] InternLM + LlamaIndex RAG 实践

环境配置 选择30%A100做本次任务 conda create -n llamaindex python3.10 conda activate llamaindex conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia pip install einops pip install protobuf安装Llamaindex cond…

【UI】Vue3 + Naive-ui 使用表格Data Table 以及分页页码显示不全问题解决

参考文章&#xff1a; Vue3 Naive-ui Data Table 分页页码显示不全 Naive UI之数据表格分页pagination 数据列表分页全部代码: <n-data-tableref"tableRef"striped:columns"columns":pagination"pagination":bordered"false":d…

CSS 中的文本相关属性(line - height、font、letter - 属性、text - 属性)

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与行高的取值约定 行高与盒子高度的关系 font、letter -属性 、text -属性 font属性 letter -属性 text - 属性 非 VIP 用户可前往公众号回复“css”进行免费阅读 line - height属性 字号与…

模形式与态、势、感、知

模形式是数学中一个重要的研究领域&#xff0c;主要出现在数论、代数几何和表示论等多个学科中。模形式可以视为在某种意义上具有“对称性”的函数&#xff0c;这些函数在特定的条件下满足一定的变换性质。具体来说&#xff0c;模形式是定义在上半平面上的复值函数&#xff0c;…

基于Linux环境安装 jdk 1.8 保姆级教程

1. 下载 jdk 1.8 首先需要下载 linux 版本的 jdk 1.8. 需要在 Oracle 官网的 JDK 1.8 下载页面 进行下载&#xff0c;找到 Linux x64 Compressed Archive 对应的链接。或者直接下载我准备好的压缩包&#xff0c;点击链接即可下载。 2. FTP压缩包文件传输 下载完成之后&…

2024南京软博会同期会议“中国信息技术应用创新大会”

软件产业作为新一代信息技术的核心驱动力&#xff0c;正以前所未有的速度推动着全球经济的转型升级。在此背景下&#xff0c;2024中国&#xff08;南京&#xff09;软件产业博览会&#xff08;以下简称“南京软博会”&#xff09;将于12月份在南京国际博览中心盛大召开&#xf…

下载配置Android Studio(2024年9月)

安装JAVA JDK 下载安装包 Java网站官网 Java Downloads | Oracle 我下载的是JDK Development Kit 17.0.12 downloads Windows x64 MSI Installer。 下载后打开文件&#xff0c;一路NEXT闭眼安装。 配置环境变量 设置-系统-系统高级设置-环境变量 1.新建一个系统环境变量&…

Java爬虫抓取数据的艺术

在信息时代&#xff0c;数据的重要性不言而喻。对于Java开发者来说&#xff0c;掌握如何使用Java进行数据抓取是一项宝贵的技能。通过编写爬虫程序&#xff0c;我们可以从互联网的海量信息中提取有价值的数据&#xff0c;用于市场分析、客户洞察、内容监控等多种场景。本文将介…

基于SSM的中小企业人力资源管理系统【附源码】

基于SSM的中小企业人力资源管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1 管理员功能介绍 5.1.1 学生…

Linux之实战命令14:watch应用实例(四十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

9.27今日错题解析(软考)

目录 前言信息安全——网络攻击算法基础——二分查找数据库系统——数据库设计过程 前言 这是用来记录我每天备考软考设计师的错题的&#xff0c;今天知识点为网络攻击、二分查找和数据库设计过程&#xff0c;大部分错题摘自希赛中的题目&#xff0c;但相关解析是原创&#xf…

PHM技术 : 特征缩放

特征缩放 监督/无监督机器学习算法已广泛用于开发数据驱动的异常检测、诊断和预测方法。此外,对于复杂电子设备的 PHM 来说,使用高维数据是不可或缺的。然而,如果各维度没有被标准化到相似水平,机器学习算法的输出可能会偏向于某些大尺度数据。例如,大多数分类器通过欧氏距离计…

统信UOS率先适配龙芯3A6000

UOS统信率先适配龙芯3A6000的相关介绍。 文章目录 统信软件第一时间完成龙芯3A6000处理器与统信UOS的适配工作&#xff0c;功能完整&#xff0c;性能优异。 综合相关测试结果&#xff0c;龙芯3A6000处理器总体性能与Intel第10代酷睿四核处理器相当。 多年来&#xff0c;龙芯中…