旋钮键盘项目---foc讲解(闭环位置控制)

hello,周六休息了一天,出去打本了。趁着夜色,花费了几个小时,也是将闭环代码写完,参考了灯哥的思路。接下来介绍一下我的整个流程:

一、闭环位置控制思路:

其实懂得了开环,那么闭环其实很简单了。我们可以看函数

void setPhaseVoltage(float Uq,float Ud, float angle_el) {angle_el = _normalizeAngle(angle_el);// 帕克逆变换Ualpha =  -Uq*sin(angle_el); Ubeta =   Uq*cos(angle_el); // 克拉克逆变换Ua = Ualpha + voltage_power_supply/2;Ub = (sqrt(3)*Ubeta-Ualpha)/2 + voltage_power_supply/2;Uc = (-Ualpha-sqrt(3)*Ubeta)/2 + voltage_power_supply/2;setPwm(Ua,Ub,Uc);
}

        这个函数的三个参数,首先第一个其实就是力矩大小。第二个我们默认是0,是磁场分量(理论上保持 0,才能保证最大力矩输出效率)。第三个就是angle_el → 电角度(决定定子磁场的方向,等于是你要把转子“拉”到哪个位置)

        那么在我们开环的过程中时候,是给了一个恒定的力。角度也是我们计算 一个规定的角度,其实也差不多就是恒定的角度。那么很简单,套到闭环的时候,就是这个力,我们需要自己去根据角度来计算。同时,这个电角度也需要实时去计算。然后带入进去。

接下来给出我的代码:

CloseLoop.c

#include "CloseLoop.h"float Motor_target = 3.14;
int DIR= 1;
float Cur_Uq = 0.0;
float zero_electric_angle=0;
#define _3PI_2 4.71238898038ffloat _electricalAnglew_without_para(){return  _normalizeAngle((float)(DIR *  7) * GetAngle_Without_Track()-zero_electric_angle);
}//开始校准电角度的值
void zero_electric_angle_correct()
{setPhaseVoltage(6,0,_3PI_2);HAL_Delay(3000);zero_electric_angle = _electricalAnglew_without_para();setPhaseVoltage(0,0,_3PI_2);
}float kp = 0.133;
float sensor_Angle;
void closeLoop()
{//0-6.28sensor_Angle =GetAngle();/*这里是这样计算的,当前我接入的是24v电压,需要将12v设定为0电压位置。所以我实际最大为12v。这里我规定,45度偏差的时候,达到最大允许的偏差角度,这个时候输出最大的纠正力矩,来控制它回正。所以对应关系就是 当前角度偏差/最大允许的45度角度偏差  =   当前输出电压/最大允许输出电压12v。这样子就一下子知道对应的关系了,我们需要的是根据当前角度偏差,输出当前应该给定的电压所以就是12/45 = 0.266*///把获取的弧度制,转化为角度制。角度得到后,通过kp这个比例,转化到电压值。Cur_Uq = _constrain(kp*(Motor_target-DIR*sensor_Angle)*180/PI,-6,6);setPhaseVoltage(Cur_Uq,  0, _electricalAnglew_without_para());}

ClsoeLoop.h

#ifndef __CLOSELOOP_H
#define __CLOSELOOP_H
#include "OpenLoop.h"
#include "AS5600.h"
#include "math.h"
float _electricalAnglew_without_para();void zero_electric_angle_correct();
void closeLoop();
#endif

        这里也说了,这里的kp计算,其实是就是将当前的角度,转化为力矩。

        当前我接入的是12v电压,需要将6v设定为0电压位置。所以我实际最大为6v。这里我规定,45度偏差的时候,达到最大允许的偏差角度,这个时候输出最大的纠正力矩,来控制它回正。所以对应关系就是 当前角度偏差/最大允许的45度角度偏差  =   当前输出电压/最大允许输出电压6v。这样子就一下子知道对应的关系了,我们需要的是根据当前角度偏差,输出当前应该给定的电压所以就是6/45 = 0.133。

        里边写的是24v,我输入的也是24v,但是我只用12v的幅值。当然你也可以按照这个来改。但是会出现一变化过快,毕竟电压大了,力矩变大,加速度就大,速度就大。

为什么会有DIR

DIR 的存在是因为:

  • 编码器测的机械角度方向 ≠ 电机实际需要的方向

  • 通过 DIR=±1 可以快速修正这个“方向不一致”的问题

  • 如果方向对了,DIR=+1;如果电机老是“往反方向跑”,改成 DIR=-1 就行了

为什么要做电角度零点标定

也就是函数:void zero_electric_angle_correct()

1. 电角度 vs 机械角度

  • 机械角度:编码器(AS5600、霍尔等)测得的是转子物理位置 0∼2π。

  • 电角度:FOC 控制需要的角度是定子电流和转子磁极之间的相对角度:

  • 这个 offset(偏移量)就是电角度零点。因为转子磁极和编码器零点未必对齐。

如果不知道这个偏移,FOC 算出来的电角度就会有一个常数错误,结果就是:
电流打不到正确的磁场方向,电机就发抖、狂转或者根本转不动。

2. 标定思路

  • 给一个固定的定子磁场方向_3PI_2),电机转子会被吸住,停在这个方向。

  • 保持一段时间(3s),让转子完全对齐,不再晃动。

  • 读取编码器角度,这个角度就是转子在“已知磁场方向”下的位置。

  • 保存为 zero offset,以后电角度计算时减去它,就能保证坐标系对齐。

3.为什么电机必须初始化时做?

  • 如果不做,电角度和机械角度坐标系不同步,FOC 算出来的电压会打偏 → 电机乱抖或直接烧 MOS。

  • 做一次标定后,系统就知道“编码器零点” 和 “定子 d 轴” 的对应关系,后续计算电角度时才正确。

现象解决

在调试过程中,我遇到了一些现象。

一、首先是转速过快,一直慢速跑,没有说到达目标地方就停下来了。我们进行调试,发现Uq一直是最大的允许电压值。

那么这种主要是两方面:

1:看看有没有正常读取到角度值,我发现这个排线比较松,调试过程中,观测发现,角度值有的时候没有。导致差距一直存在,就一直最大速度转动。

2、看看DIR是不是反了,可能你需要设定的是-1.即反方向过来。

二、出现抖动,你转动它到哪个位置,他就在哪个位置。那么这个也可能是DIR设定反了。这时候要立刻关闭电源,以免温度过高,烧了。

效果展示

智能旋钮(二)—foc闭环位置控制

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

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

相关文章

为什么有些相机“即插即用”,而有些则需要采集卡?

在工业生产中,工业相机是“眼睛”,它帮助我们看到世界,但你知道吗?不同的工业相机接口就像不同的“通道”,有些“通道”直接就能与计算机连接,而有些则需要一个额外的小配件——图像采集卡。那么&#xff0…

【计算机网络 | 第7篇】物理层基本概念

文章目录物理层基本概念及数据通信系统解析一、物理层的核心定位🥝二、物理层的功能🧾三、数据通信系统的模型🐦‍🔥(一)源系统(二)传输系统(三)目的系统四、…

一般情况下,python函数都会返回对象,但有时只调用一个函数,这是在修改这个信息

class Model:def __init__(self):self.training Truedef eval(self):self.training Falsereturn Nonem Model() print(m.training) # True m.eval() # 返回 None print(m.training) # False,模型内部状态已改变m.eval()是在修改m的…

2025-08-17 李沐深度学习17——语义分割

文章目录1 语义分割1.1 介绍1.2 语义分割应用1.3 实例分割2 转置卷积2.1 工作原理2.2 为什么叫“转置”卷积2.3 转置卷积也是一种卷积3 FCN3.1 核心思想3.2 网络架构4 样式迁移4.1 基于 CNN 的样式迁移4.2 工作流程1 语义分割 1.1 介绍 语义分割(Semantic Segment…

《若依》权限控制

若依内置了强大的权限控制系统,为企业级项目提供了通用的解决方案 以CRM系统为例,演示权限功能(URL:https://huike-crm.itheima.net) demo账号(超级管理员)查看所有功能菜单 zhangsan账号(市…

云原生俱乐部-RH134知识点总结(3)

这个系列的第二篇写了将近5000字,而且还是删节内容后的,如RAID就没写,因为头已经很大了。第二篇从早上写到下午,因为偷懒了,写着写着就停笔了。不过好在总算磨完了,现在开始写RH134系列的最后一篇内容。我这…

股票常见K线

1.底部反弹摸线特点长下影线之后必须有实体阴线踩实之后才考虑。macd绿缓慢收窄过程中的不买,刚转红也不买。macd转红之后等股价跌回之前macd绿首次收窄的最低点附近,而且跌破了所有均线,可以买入此股票。之后股票一波突破之前平台震荡平台&a…

计算机网络 THU 考研专栏简介

本专栏专为清华大学计算机网络考研复习设计,内容系统全面,涵盖从基础概念到重点考点的完整知识体系。具体包括:基础理论:计算机网络概念、分类、性能指标及网络分层模型(OSI 七层、TCP/IP 四层)。协议与技术…

VSCode打开新的文件夹之后当前打开的文件夹被覆盖

文件--首选项--设置:搜索showtabs设置为如下:

mac 电脑安装类似 nvm 的工具,node 版本管理工具

前言 苹果电脑开发时,有时候需要切换node 版本,window版有nvm可以管理node 版本,mac版本可以用另外一种 //全局安装n 模块 sudo npm install n -g//输入后回车,提示输入电脑密码,输入完密码回车等待下载完成即可//安装…

spdlog框架的安装与使用

spdlog框架的安装与使用spdlog的安装spdlog的使用spdlog二次封装总结&#xff1a;spdlog的安装 sudo apt-get install libspdlog-devspdlog的使用 同步日志器sync.cc (输出到显示器/输出到指定文件) #include<spdlog/spdlog.h> #include<spdlog/sinks/stdout_color…

使用websockets中的一些问题和解决方法

&#xff08;1&#xff09;TypeError: echo() missing 1 required positional argument: path报错自己写的代码如下&#xff1a;async def echo(websocket, path):...async def main():server await websockets.serve(echo, "0.0.0.0", 666)await server.wait_close…

机器人相关基础知识

机器人简介下面给出一份机器人方向“从入门到进阶”的极简知识地图&#xff0c;按「数学 → 硬件 → 软件 → 算法 → 应用」五层展开&#xff0c;配合常用开源资源。你可以把它当作“字典”随时查阅。&#x1f539; 1. 数学层&#xff08;所有算法的地基&#xff09;概念一句话…

Windows Server 打开vGPU RDP HEVC编码

查看已安装的驱动[rootlocalhost:~] esxcli software vib list Name Version Vendor Acceptance Level Install Date Platforms ----------------------------- ------------------------------------ ------ -…

OpenAL技术详解:跨平台3D音频API的设计与实践

引言&#xff1a;OpenAL的定位与价值 OpenAL&#xff08;Open Audio Library&#xff09; 是一套跨平台的3D音频应用程序接口&#xff08;API&#xff09;&#xff0c;专为高效渲染多通道三维定位音频而设计。其API风格与编程范式刻意模仿OpenGL&#xff0c;旨在为游戏开发、虚…

重温 K8s 基础概念知识系列五(存储、配置、安全和策略)

文章目录一、存储&#xff08;Storage&#xff09;1.1、Volume1.2、PersistentVolume (PV)1.3、PersistentVolumeClaim (PVC)1.4、StorageClass1.5、PVC 和 PV 的绑定过程&#xff1f;二、配置管理&#xff08;Configuration&#xff09;2.1、ConfigMap2.2、Secret2.3、存活、就…

通过PhotoShop将多张图片整合为gif动画

一、准备图片集合二、导入PS导入PS后点击确定&#xff1a;导入成功&#xff1a;三、添加时间轴勾选创建帧动画&#xff1a;此时时间轴进化为帧动画轴&#xff1a;四、图片集部署在帧动画轴点击帧动画轴右上角的三道横杠&#xff0c;从图层建立帧&#xff1a;此时图片集已经部署…

Easy Rules 规则引擎详解

Easy Rules 规则引擎详解 Easy Rules 是一个轻量级的 Java 规则引擎&#xff0c;它提供了一种简单而强大的方式来定义和执行业务规则。以下是 Easy Rules 的详细介绍&#xff1a; 1. 核心概念 1.1 规则 (Rule) 条件 (Condition): 当条件为 true 时执行动作动作 (Action): 条件满…

优雅设计:打造AI时代的高效后端API接口——领码课堂深度解析

&#x1f4cc; 摘要 后端API接口已经成为软件架构的神经系统。微服务演化、AI渗透、自动化治理……这些趋势迫使我们重新定义接口设计的标准。本文从统一规范、参数校验、异常处理、性能优化四大维度出发&#xff0c;结合领码Spark的接口治理平台与AI赋能实践&#xff0c;构建一…

【VUE】用EmailJS自动发送邮件到网易邮箱

1.注册 EmailJS 账号​​&#xff1a;访问 EmailJS 官网并注册2.添加电子邮件服务​​&#xff1a;在 Dashboard 中点击 "Add New Service"选择 SMTP server填写 SMTP 服务器信息SMTP Host: smtphz.qiye.163.com (网易企业邮箱)SMTP Port: 994 (SSL)User: 你的邮箱Ap…