廊坊代运营公司,广东网站se0优化公司,免费手机wap网站,大基建最新消息hello#xff0c;周六休息了一天#xff0c;出去打本了。趁着夜色#xff0c;花费了几个小时#xff0c;也是将闭环代码写完#xff0c;参考了灯哥的思路。接下来介绍一下我的整个流程#xff1a;
一、闭环位置控制思路#xff1a;
其实懂得了开环#xff0c;那么闭环…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.hfloat Motor_target 3.14;
int DIR 1;
float Cur_Uq 0.0;
float zero_electric_angle0;
#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 可以快速修正这个“方向不一致”的问题 如果方向对了DIR1如果电机老是“往反方向跑”改成 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闭环位置控制