鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    四驱板pwm信号输出异常

    已定时 已固定 已锁定 已移动
    嵌入式系统
    硬件 四驱板 异常输出 pid pwm
    2
    30
    3.2k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 24291485052
      Plaech
      最后由 2429148505 编辑

      起因是我用四驱板调pid,怎么都调不好。直接使用四驱板updateMotorSpeed输出脉冲信号,轮子转动也不正常
      Screenshot from 2024-05-29 20-36-00.png
      简单的debug大概长这样。每隔一段时间轮子的速度都会上下浮动100脉冲左右,而且仅有一帧。起初我以为是电机或者电机编码器的问题,于是重新买了四个电机,依然是这个效果,对四驱板5v和12v供电都这样。后来,对电机接通5直流电源,重新读取编码器,发现这个毛刺消失了。所以是四驱板输出的电流问题。不知道你们有没有这个现象。
      @小鱼

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @2429148505
        最后由 编辑

        @2429148505 暂时没有发现,可以贴一下你的测试代码吗,我看看是否是代码哪里引起的

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        24291485052 1 条回复 最后回复 回复 引用 0
        • 24291485052
          Plaech @小鱼
          最后由 2429148505 编辑

          @小鱼 我直接用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);
          

          其他地方没有作更改

          24291485052 1 条回复 最后回复 回复 引用 0
          • 24291485052
            Plaech @2429148505
            最后由 编辑

            @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号电机会一直旋转。

            小鱼小 1 条回复 最后回复 回复 引用 0
            • 小鱼小
              小鱼 技术大佬 @2429148505
              最后由 编辑

              @2429148505 这是因为esp32部分io,在reset状态的时候处于高电平状态导致的,esp32IO实在不够用,只能都给用上了,后续打算出stm32的主控了。

              新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

              24291485052 1 条回复 最后回复 回复 引用 0
              • 24291485052
                Plaech @小鱼
                最后由 编辑

                @小鱼 太好了!!!那pwm信号异常可能是这个原因吗

                小鱼小 1 条回复 最后回复 回复 引用 0
                • 小鱼小
                  小鱼 技术大佬 @2429148505
                  最后由 编辑

                  @2429148505 这两者按道理没有关系,运行的时候IO状态是确定的,另外看你代码里给的速度是1000,这个速度最大应该是100,且是浮点100.0

                  新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                  24291485052 1 条回复 最后回复 回复 引用 0
                  • 24291485052
                    Plaech @小鱼
                    最后由 编辑

                    @小鱼 应该不是,那个100应该是解算程序完毕后限制的100吧,这个1000是直接输出给电机的

                    小鱼小 1 条回复 最后回复 回复 引用 0
                    • 小鱼小
                      小鱼 技术大佬 @2429148505
                      最后由 编辑

                      @2429148505 motor.updateMotorSpeed 这个库是我写的,最大值是100,表示百分百占空比

                      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                      24291485052 4 条回复 最后回复 回复 引用 0
                      • 24291485052
                        Plaech @小鱼
                        最后由 编辑

                        @小鱼 嗷嗷,我可能代码读乱了吧。我记得有个地方是限制2500的来着,和那个搞乱了

                        1 条回复 最后回复 回复 引用 0
                        • 24291485052
                          Plaech @小鱼
                          最后由 编辑

                          @小鱼 买了一个新的四驱板,情况好很多了,但是还是有输出不稳定的情况,但是频率比之前底很多,我再试试调pid好不好使。

                          1 条回复 最后回复 回复 引用 0
                          • 24291485052
                            Plaech @小鱼
                            最后由 编辑

                            @小鱼 接5v电压,编码器信号上下浮动10左右,隔1.5-2秒有毛刺。板子接12v电压,,编码器信号上下浮动100左右。电机接12v直流电压,编码器上下浮动10左右(话说这编码器信号经常都浮动的特别整,浮动10不多不少,就是10,也没个位数,5v也这样。)无毛刺。这个板子电机驱动承受不了12v电压阿

                            小鱼小 1 条回复 最后回复 回复 引用 0
                            • 24291485052
                              Plaech @小鱼
                              最后由 编辑

                              @小鱼 现在还有一个现象,在打开udp时,电机速度会加快,而且编码器读取出现异常.
                              095ae863-30c7-4509-8764-acb4f0ddc2d8-image.png
                              我设置的pid为500,然而234号电机都出现异常,而没有udp通讯时正常。
                              499b8040-7138-44c9-ad29-dc021aecdc43-image.png
                              相当奇怪,这是新板,速速售后

                              24291485052 小鱼小 2 条回复 最后回复 回复 引用 0
                              • 24291485052
                                Plaech @2429148505
                                最后由 编辑

                                @2429148505 在 四驱板pwm信号输出异常 中说:

                                @小鱼 现在还有一个现象,在打开udp时,电机速度会加快,而且编码器读取出现异常.
                                095ae863-30c7-4509-8764-acb4f0ddc2d8-image.png
                                我设置的pid为500,然而234号电机都出现异常,而没有udp通讯时正常。
                                499b8040-7138-44c9-ad29-dc021aecdc43-image.png
                                相当奇怪,这是新板,速速售后

                                @2429148505 在 四驱板pwm信号输出异常 中说:

                                @小鱼 现在还有一个现象,在打开udp时,电机速度会加快,而且编码器读取出现异常.
                                095ae863-30c7-4509-8764-acb4f0ddc2d8-image.png
                                我设置的pid为500,然而234号电机都出现异常,而没有udp通讯时正常。
                                499b8040-7138-44c9-ad29-dc021aecdc43-image.png
                                相当奇怪,这是新板,速速售后

                                如果我将你控制电机的16v电容换成25会不会好点。

                                1 条回复 最后回复 回复 引用 0
                                • 小鱼小
                                  小鱼 技术大佬 @2429148505
                                  最后由 编辑

                                  @2429148505 你用是店里和四驱板配套的电机吗,另外开UDP通信会占用系统资源,可能会导致主循环loop等速率下降导致控制异常,建议减少打印,电机驱动是可以耐12V的,我们做了疲劳测试。

                                  新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                                  24291485052 1 条回复 最后回复 回复 引用 0
                                  • 小鱼小
                                    小鱼 技术大佬 @2429148505
                                    最后由 编辑

                                    @2429148505 如果你所指的编码器上下浮动是最后打印的实时速度浮动,这个是正常的,PID控制器无法做到对目标速度的完全跟踪,因为PID控制器不会关注每个电机的特性,上下浮动10mm/s 很正常。

                                    新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                                    24291485052 1 条回复 最后回复 回复 引用 0
                                    • 24291485052
                                      Plaech @小鱼
                                      最后由 编辑

                                      @小鱼 不是用店铺的电机,因为我的底盘安装不上,但是多半不是电机问题,因为我通直流电的时候电机编码器输出正常

                                      1 条回复 最后回复 回复 引用 0
                                      • 24291485052
                                        Plaech @小鱼
                                        最后由 编辑

                                        @小鱼 在 四驱板pwm信号输出异常 中说:

                                        @2429148505 如果你所指的编码器上下浮动是最后打印的实时速度浮动,这个是正常的,PID控制器无法做到对目标速度的完全跟踪,因为PID控制器不会关注每个电机的特性,上下浮动10mm/s 很正常。

                                        确实,但是我通12v电压上下浮动100很不正常,因为我通12v直流电压时只会上下浮动10左右。
                                        顺便问一下,如果不打印,我应该如何调pid呢,或者如何减少打印频率。现在串口通信microros,和UDP通信都会导致编码器输出和电机异常

                                        小鱼小 1 条回复 最后回复 回复 引用 0
                                        • 小鱼小
                                          小鱼 技术大佬 @2429148505
                                          最后由 编辑

                                          @2429148505 如果不是店铺电机考虑驱动器驱动电流问题,可能会出现过流现象。另外通直流电和利用pid或pwm驱动结果肯定是不同的。你说的100单位应该是100mm,也就是0.1m/s ,相对来说还是很小的,店铺配套的电机减速比较高,最终波动会更少,关于减少打印频率,可以减少打印频率,使用最简单的if语句就可以实现。

                                          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                                          24291485052 2 条回复 最后回复 回复 引用 0
                                          • 24291485052
                                            Plaech @小鱼
                                            最后由 编辑

                                            @小鱼 可是我pwm输出的是100%也不一样吗,是啥原理啊

                                            1 条回复 最后回复 回复 引用 0
                                            • 第一个帖子
                                              最后一个帖子
                                            皖ICP备16016415号-7
                                            Powered by NodeBB | 鱼香ROS