小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
四驱板pwm信号输出异常
-
@小鱼 我直接用fishbot的代码进行测试的,主要把loop_fishbot_control更改,使其直接输出
void loop_fishbot_control() { static float out_motor_speed[4]; static uint64_t last_update_info_time = millis(); static uint8_t index = 0; kinematics.update_motor_ticks(micros(), encoders[0].getTicks(), encoders[1].getTicks(), encoders[2].getTicks(), encoders[3].getTicks()); for (index = 0; index < 4; index++) { // pid_controller[index].target_ = 50; // // 目标速度为0时停止控制,解决 #https://fishros.org.cn/forum/topic/1372 问题 // if (pid_controller[index].target_ == 0) // { // out_motor_speed[index] = 0; // } // else // { // // 使用 pid_controller 控制器对电机速度进行 PID 控制 // out_motor_speed[index] = pid_controller[index].update(kinematics.motor_speed(index)); // } out_motor_speed[index] = 1000; // //将 PID 控制器的输出值作为电机的目标速度进行控制 motor.updateMotorSpeed(index, out_motor_speed[index]); // motor.updateMotorSpeed(index, 75); // // motor.updateMotorSpeed(1, 10); // // motor.updateMotorSpeed(2, 10); // // motor.updateMotorSpeed(3, 10); //fishlog_debug("pid", "index:%d target:%f current:%f out=%f", index, pid_controller[index].target_, kinematics.motor_speed(index), out_motor_speed[index]); }
然后在kinematics中使用串口输出进行调试
Serial.printf("angular_speed:wheel_speed[1, %f 2, %f 3, %f 4, %f]\n", wheel1_speed, wheel2_speed, wheel3_speed, wheel4_speed);
其他地方没有作更改
-
@2429148505 在 四驱板pwm信号输出异常 中说:
@小鱼 我直接用fishbot的代码进行测试的,主要把loop_fishbot_control更改,使其直接输出
void loop_fishbot_control() { static float out_motor_speed[4]; static uint64_t last_update_info_time = millis(); static uint8_t index = 0; kinematics.update_motor_ticks(micros(), encoders[0].getTicks(), encoders[1].getTicks(), encoders[2].getTicks(), encoders[3].getTicks()); for (index = 0; index < 4; index++) { // pid_controller[index].target_ = 50; // // 目标速度为0时停止控制,解决 #https://fishros.org.cn/forum/topic/1372 问题 // if (pid_controller[index].target_ == 0) // { // out_motor_speed[index] = 0; // } // else // { // // 使用 pid_controller 控制器对电机速度进行 PID 控制 // out_motor_speed[index] = pid_controller[index].update(kinematics.motor_speed(index)); // } out_motor_speed[index] = 1000; // //将 PID 控制器的输出值作为电机的目标速度进行控制 motor.updateMotorSpeed(index, out_motor_speed[index]); // motor.updateMotorSpeed(index, 75); // // motor.updateMotorSpeed(1, 10); // // motor.updateMotorSpeed(2, 10); // // motor.updateMotorSpeed(3, 10); //fishlog_debug("pid", "index:%d target:%f current:%f out=%f", index, pid_controller[index].target_, kinematics.motor_speed(index), out_motor_speed[index]); }
然后在kinematics中使用串口输出进行调试
Serial.printf("angular_speed:wheel_speed[1, %f 2, %f 3, %f 4, %f]\n", wheel1_speed, wheel2_speed, wheel3_speed, wheel4_speed);
其他地方没有作更改
我感觉不是这个代码的问题,因为我四驱板感觉一直不对劲,我说一下现象,看看你有没有出现过。就是输入和清除还有按reset的时候,都会有一个电机旋转。长按reset,4号电机会一直旋转。
-
@2429148505 这是因为esp32部分io,在reset状态的时候处于高电平状态导致的,esp32IO实在不够用,只能都给用上了,后续打算出stm32的主控了。
-
@小鱼 太好了!!!那pwm信号异常可能是这个原因吗
-
@2429148505 这两者按道理没有关系,运行的时候IO状态是确定的,另外看你代码里给的速度是1000,这个速度最大应该是100,且是浮点100.0
-
@小鱼 应该不是,那个100应该是解算程序完毕后限制的100吧,这个1000是直接输出给电机的
-
@2429148505 motor.updateMotorSpeed 这个库是我写的,最大值是100,表示百分百占空比
-
@小鱼 嗷嗷,我可能代码读乱了吧。我记得有个地方是限制2500的来着,和那个搞乱了
-
@小鱼 买了一个新的四驱板,情况好很多了,但是还是有输出不稳定的情况,但是频率比之前底很多,我再试试调pid好不好使。
-
@小鱼 接5v电压,编码器信号上下浮动10左右,隔1.5-2秒有毛刺。板子接12v电压,,编码器信号上下浮动100左右。电机接12v直流电压,编码器上下浮动10左右(话说这编码器信号经常都浮动的特别整,浮动10不多不少,就是10,也没个位数,5v也这样。)无毛刺。这个板子电机驱动承受不了12v电压阿
-
@小鱼 现在还有一个现象,在打开udp时,电机速度会加快,而且编码器读取出现异常.
我设置的pid为500,然而234号电机都出现异常,而没有udp通讯时正常。
相当奇怪,这是新板,速速售后 -
@2429148505 在 四驱板pwm信号输出异常 中说:
@小鱼 现在还有一个现象,在打开udp时,电机速度会加快,而且编码器读取出现异常.
我设置的pid为500,然而234号电机都出现异常,而没有udp通讯时正常。
相当奇怪,这是新板,速速售后@2429148505 在 四驱板pwm信号输出异常 中说:
@小鱼 现在还有一个现象,在打开udp时,电机速度会加快,而且编码器读取出现异常.
我设置的pid为500,然而234号电机都出现异常,而没有udp通讯时正常。
相当奇怪,这是新板,速速售后如果我将你控制电机的16v电容换成25会不会好点。
-
@2429148505 你用是店里和四驱板配套的电机吗,另外开UDP通信会占用系统资源,可能会导致主循环loop等速率下降导致控制异常,建议减少打印,电机驱动是可以耐12V的,我们做了疲劳测试。
-
@2429148505 如果你所指的编码器上下浮动是最后打印的实时速度浮动,这个是正常的,PID控制器无法做到对目标速度的完全跟踪,因为PID控制器不会关注每个电机的特性,上下浮动10mm/s 很正常。
-
@小鱼 不是用店铺的电机,因为我的底盘安装不上,但是多半不是电机问题,因为我通直流电的时候电机编码器输出正常
-
@小鱼 在 四驱板pwm信号输出异常 中说:
@2429148505 如果你所指的编码器上下浮动是最后打印的实时速度浮动,这个是正常的,PID控制器无法做到对目标速度的完全跟踪,因为PID控制器不会关注每个电机的特性,上下浮动10mm/s 很正常。
确实,但是我通12v电压上下浮动100很不正常,因为我通12v直流电压时只会上下浮动10左右。
顺便问一下,如果不打印,我应该如何调pid呢,或者如何减少打印频率。现在串口通信microros,和UDP通信都会导致编码器输出和电机异常 -
@2429148505 如果不是店铺电机考虑驱动器驱动电流问题,可能会出现过流现象。另外通直流电和利用pid或pwm驱动结果肯定是不同的。你说的100单位应该是100mm,也就是0.1m/s ,相对来说还是很小的,店铺配套的电机减速比较高,最终波动会更少,关于减少打印频率,可以减少打印频率,使用最简单的if语句就可以实现。
-
@小鱼 可是我pwm输出的是100%也不一样吗,是啥原理啊
-
@小鱼 在 四驱板pwm信号输出异常 中说:
@2429148505 如果不是店铺电机考虑驱动器驱动电流问题,可能会出现过流现象。另外通直流电和利用pid或pwm驱动结果肯定是不同的。你说的100单位应该是100mm,也就是0.1m/s ,相对来说还是很小的,店铺配套的电机减速比较高,最终波动会更少,关于减少打印频率,可以减少打印频率,使用最简单的if语句就可以实现。
不过我买的电机减速比是45比1,和370差不多,额定功率也是5-12v。感觉多半不是电机问题,或者我等等可以拿其他板子测试一下。不过用if语句减少打印频率确实是好办法,我等等试试,如果能5v直接供电也行。还有一点,我直接使用tapc供电没有问题吧
-
@2429148505
1.店里的电机满转速度只有0.4m/s左右,不会超过0.5,看你的打印有0.5+了。
2. MCU输出的信号经过驱动芯片采样到MOS才能输出给电机,采样过程和MCU信号都可能受到电机的电磁干扰。
3. 功率不能看电压,P=UI ,
4.尽量不要5V供电,DC2DC最大稳定输出电流2A,单个电机可能就可以超,且电机属于感性负载,会造成较大纹波,5V不稳定会造成ESP32工作不稳定,TypeC供电经过二极管,最大电流约300ma,不推荐使用。5V尽量使用小电机,大电机用12V供电。