[开源]圆形FOC无刷驱动Baize_foc
自制无刷电机驱动器Baize_foc,测试无刷电机。
介绍
由于做四足机器狗的需要,所以做了这块圆形无刷电机驱动板,自己取名叫Baize_foc了。
上面集成了as5600磁编码器,电流环等功能。形状为圆形,因此可以非常方便的直接用螺丝固定到电机的后面;同时用的esp32做的主控,所以可以通过wifi进行无线组网,不需要接额外的信号线,只需要给这块板子供上电即可。
四足机器狗的12个关节每个关节上面放一个驱动,可以用树莓派等SBC作为机器狗的主机。
树莓派充当WiFi热点,使得机器狗的12个关节驱动通过WiFi与主机组网形成四足机器狗的分布式节点网络。
这里开源他的硬件文件以及测试代码。
下图是正反面3D效果图:

立创开源社区地址:圆形FOC无刷驱动板Baize_foc - 嘉立创EDA开源硬件平台

测试代码
测试代码链接:
github:https://github.com/Allen953/Baize_foc
gitee:https://gitee.com/li9535/Baize_foc/blob/master/README.md
测试代码及试验
1.扭矩输出测试
/**
Deng's FOC 双电机 FOC电流控制例程 测试库:SimpleFOC 2.1.1 测试硬件:灯哥开源FOC V3.0
在串口窗口中输入:A+电流控制M0,B+电流控制M1,电流单位为A
setup()中可取消注释设置电压限制与电流限制
在使用自己的电机时,请一定记得修改默认极对数,即 BLDCMotor(14) 中的值,设置为自己的极对数数字
程序默认设置的供电电压为 16.8V,用其他电压供电请记得修改 voltage_power_supply , voltage_limit 变量中的值
默认PID针对的电机是 GB6010 ,使用自己的电机需要修改PID参数,才能实现更好效果
*/
#include <SimpleFOC.h>
//电机实例
BLDCMotor motor1 = BLDCMotor(11);
BLDCDriver3PWM driver1 = BLDCDriver3PWM(17, 18, 19, 21, 22, 23);
//编码器实例
MagneticSensorI2C sensor1 = MagneticSensorI2C(AS5600_I2C);
TwoWire I2Cone = TwoWire(0);
// 在线电流检测实例
InlineCurrentSense current_sense1 = InlineCurrentSense(0.001, 50.0, 34, 35);
// commander通信实例
Commander command = Commander(Serial);
void doMotor1(char* cmd){ command.motor(&motor1, cmd); }
void setup() {
// 编码器设置
I2Cone.begin(26,25, 400000);
sensor1.init(&I2Cone);
motor1.linkSensor(&sensor1);
// 驱动器设置
driver1.voltage_power_supply = 12.0;
driver1.init();
motor1.linkDriver(&driver1);
// 电流限制
// motor1.current_limit = 2;
// motor2.current_limit = 2;
// 电压限制
// motor1.voltage_limit = 12;
// motor2.voltage_limit = 12;
// 电流检测
current_sense1.init();
current_sense1.gain_b *= -1;
current_sense1.skip_align = true;
motor1.linkCurrentSense(¤t_sense1);
// current sense init and linking
// 控制环
// 其他模式 TorqueControlType::voltage TorqueControlType::dc_current
motor1.torque_controller = TorqueControlType::foc_current;
motor1.controller = MotionControlType::torque;
// FOC电流控制PID参数
motor1.PID_current_q.P = 5;
motor1.PID_current_q.I= 1000;
motor1.PID_current_d.P= 5;
motor1.PID_current_d.I = 1000;
motor1.LPF_current_q.Tf = 0.002; // 1ms default
motor1.LPF_current_d.Tf = 0.002; // 1ms default
// 速度环PID参数
motor1.PID_velocity.P = 0.05;
motor1.PID_velocity.I = 1;
motor1.PID_velocity.D = 0;
// default voltage_power_supply
// 速度限制
motor1.velocity_limit = 20;
// monitor接口设置
Serial.begin(115200);
// comment out if not needed
motor1.useMonitoring(Serial);
// monitor相关设置
motor1.monitor_downsample = 0;
motor1.monitor_variables = _MON_TARGET | _MON_VEL | _MON_ANGLE;
//电机初始化
motor1.init();
// align encoder and start FOC
motor1.initFOC();
// align encoder and start FOC
// 初始目标值
motor1.target = 0.05;
// 映射电机到commander
command.add('T', doMotor1, "motor 1");
Serial.println(F("Double motor sketch ready."));
_delay(1000);
}
void loop() {
// iterative setting FOC phase voltage
motor1.loopFOC();
// iterative function setting the outter loop target
motor1.move();
// user communication
command.run();
motor1.monitor();
}
错误问题记录
搞的一块板子,道路好坎坷,好在现在小伙伴把问题找出来了,特意用这个帖子记录所犯的错误,下次避坑用。

1.上传程序出错
上传程序时,arduino ide出现no data receive from serial port。
结果上传不了程序。
最后小伙伴用万用表测出来ch340c的txd虚焊,最后解决了问题。
2.
3.程序上传后偶尔重启
因为我选的esp32程序运行在第0核上面,也就是默认esp32时单核的了。
由于原先配置了esp32 solo 1开发环境,这个型号的esp32时单核的,程序都跑在第0核上面。
但是现在我用的esp32 wroom 32D模组,这个esp32型号是双核的,双核之间各有分工,程序一般运行在第1核上面,但是我还是选择了第0核来运行程序,所以导致核冲突了。
最终重新配置了arduino环境下esp32的硬件支持包解决的。
可以看这个帖子:Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)_Allen953的博客-CSDN博客_arduino找不到esp32
4.程序烧录后电机正常旋转但抖动
肯定是硬件上有一相出了问题。

当时我们是这里出的状况,这一路btn8982的电阻搞反了,应该是当时加热调整的时候发生震动把俩电阻震跑位了,然后用镊子调整回去的时候调整错了,结果导致这一路R23和R24这俩电阻焊反了,最后就出现了抖动的问题,然后我们调整回来之后电机转动就正常了。

更多推荐




所有评论(0)