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

旋钮键盘项目---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.xdnf.cn/news/1320085.html

相关文章:

  • 学习Python中Selenium模块的基本用法(5:程序基本步骤)
  • Linux817 shell:until,nfs,random
  • 力扣438:找到字符串中所有的字母异位词
  • Django前后端交互实现用户登录功能
  • [python学习记录2]变量
  • 脉冲计数实现
  • Docker之自定义jkd镜像上传阿里云
  • 排列组合+数量+资料
  • 25. 能否创建一个包含可变对象的不可变对象
  • 编程算法实例-Armstrong数(阿姆斯特朗数)
  • IDE/去读懂STM32CubeMX 时钟配置图(有源/无源晶振、旁路/晶振模式、倍频/分频)
  • 负载测试与压力测试详解
  • Rust Async 异步编程(五):执行器和系统 I/O
  • Spring 创建 Bean 的 8 种主要方式
  • MXFP4量化:如何在80GB GPU上运行1200亿参数的GPT-OSS模型
  • 【SpringBoot】Swagger 接口工具
  • 如何在Windows系统中更改用户名(中文转英文全流程)
  • 云原生俱乐部-RH134知识点总结(2)
  • MySQL数据库备份与恢复
  • neo4j导入导出方法
  • 25年第十本【金钱心理学】
  • 半敏捷卫星观测调度系统的设计与实现
  • 《WINDOWS 环境下32位汇编语言程序设计》第3章 使用MASM
  • Effective C++ 条款46:需要类型转换时请为模板定义非成员函数
  • Critic-V: VLM Critics Help Catch VLM Errors in Multimodal Reasoning(CVPR 2025)
  • 飞算AI 3.2.0实战评测:10分钟搭建企业级RBAC权限系统
  • 【牛客刷题】求四个数的最小公约数:两种高效解法详解(枚举法和最大公约数法)
  • 华为云之Linux系统安装部署Tomcat服务器
  • 【技术博客】480p 老番 → 8K 壁纸:APISR × SUPIR × CCSR「多重高清放大」完全指南
  • YoloV9改进策略:Block改进-DCAFE,并行双坐标注意力机制,增强长程依赖与抗噪性-即插即用