介绍

由于做四足机器狗的需要,所以做了这块圆形无刷电机驱动板,自己取名叫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(&current_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这俩电阻焊反了,最后就出现了抖动的问题,然后我们调整回来之后电机转动就正常了。

Logo

一站式 AI 云服务平台

更多推荐