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

    四驱板pwm信号输出异常

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

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

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

                            不过我买的电机减速比是45比1,和370差不多,额定功率也是5-12v。感觉多半不是电机问题,或者我等等可以拿其他板子测试一下。不过用if语句减少打印频率确实是好办法,我等等试试,如果能5v直接供电也行。还有一点,我直接使用tapc供电没有问题吧

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

                              @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供电。

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

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

                                @2429148505 建议还是从PID角度入手,该开发板和店里电机的PID我调试过,还是比较稳定的。另外轮子空转和带负载的时候相同PID表现也是不一样的,最好以实际使用为准。

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

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

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

                                  @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供电。

                                  学到了,感谢。我电机12v供电时空载都3000多了😂。还有那个功率是口误,额定电压是5-12v。不过还是不能解决在12v供电时有100作用波动的问题。如果板子确实测试没问题,我猜可能是我电源供电的问题吧。因为我直流供电测试时也是10左右的波动,我想应该不是电磁干扰的问题。但是我测试时是对一个电机供电的情况。我等等测试一下换各电源会不会好点。5v供电确实不稳定,有时候还会出现开发板无法启动的情况。感谢小鱼解答。

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

                                    @小鱼 我放弃了对于那100波动的追求,直接使用pid控制,效果还不错。但是,每当我使用microROS时,都会使我的pid失效,无论我使用5v还是12v供电,串口通讯还是udp通讯,手动设置速度还是通过teleop设置速度。我设置的0.5的速度都会变为0.7-0.8之间,有时还会变为负数,与楼上的现象一样。我已经将用于debug的串口全部注释,然后用屏幕来debug,而且屏幕的刷新频率为每循环20次刷新一次。而且我将屏幕的debug代码放入void 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_ = 500;
                                        //     // 目标速度为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] = 100;
                                        //     //将 PID 控制器的输出值作为电机的目标速度进行控制
                                            motor.updateMotorSpeed(index, out_motor_speed[index]);
                                            current_motor_speed[index] = kinematics.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]);
                                        }
                                    
                                        // 电量信息
                                        if (out_motor_speed[0] == 0 && out_motor_speed[1] == 0)
                                        {
                                            battery_voltage = 5.02 * ((float)analogReadMilliVolts(34) * 1e-3);
                                            display.updateBatteryInfo(battery_voltage);
                                        }
                                        // 更新系统信息
                                        //display.updateCurrentTime(rmw_uros_epoch_millis());
                                        pf++;
                                        if(pf%20==0){
                                        display.updateCurrentTime(current_motor_speed[0]);
                                        display.updateBotAngular(current_motor_speed[1]);
                                        display.updateBotLinear(current_motor_speed[2]);
                                        display.updateDisplay();}
                                        button.tick();
                                        imu.update();
                                    }
                                    

                                    pf是我定义的全局变量static int pf =0;
                                    说实话,这个现象相当奇怪,我现在还怀疑是我添加的imu代码的问题😂 😂
                                    能不能帮我测试一下我之前合并后的代码,我现在把imu的代码注释后试试。

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

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

                                      @小鱼 我放弃了对于那100波动的追求,直接使用pid控制,效果还不错。但是,每当我使用microROS时,都会使我的pid失效,无论我使用5v还是12v供电,串口通讯还是udp通讯,手动设置速度还是通过teleop设置速度。我设置的0.5的速度都会变为0.7-0.8之间,有时还会变为负数,与楼上的现象一样。我已经将用于debug的串口全部注释,然后用屏幕来debug,而且屏幕的刷新频率为每循环20次刷新一次。而且我将屏幕的debug代码放入void 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_ = 500;
                                          //     // 目标速度为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] = 100;
                                          //     //将 PID 控制器的输出值作为电机的目标速度进行控制
                                              motor.updateMotorSpeed(index, out_motor_speed[index]);
                                              current_motor_speed[index] = kinematics.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]);
                                          }
                                      
                                          // 电量信息
                                          if (out_motor_speed[0] == 0 && out_motor_speed[1] == 0)
                                          {
                                              battery_voltage = 5.02 * ((float)analogReadMilliVolts(34) * 1e-3);
                                              display.updateBatteryInfo(battery_voltage);
                                          }
                                          // 更新系统信息
                                          //display.updateCurrentTime(rmw_uros_epoch_millis());
                                          pf++;
                                          if(pf%20==0){
                                          display.updateCurrentTime(current_motor_speed[0]);
                                          display.updateBotAngular(current_motor_speed[1]);
                                          display.updateBotLinear(current_motor_speed[2]);
                                          display.updateDisplay();}
                                          button.tick();
                                          imu.update();
                                      }
                                      

                                      pf是我定义的全局变量static int pf =0;
                                      说实话,这个现象相当奇怪,我现在还怀疑是我添加的imu代码的问题😂 😂 =
                                      能不能帮我测试一下我之前合并后的代码,我现在把imu的代码注释后试试。

                                      把imu注释了也没用。不知道是什么原因。顺带一提,我microros通讯中有大量的00不知道是不是这个占用了算力。反正挺奇怪的。

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

                                        @2429148505 用屏幕刷新更费CPU,间隔1s串口打印一次就好。

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

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

                                          @2429148505 00 只是占位而以,四驱板的原始固件是通过测试的,你不行就回退下四驱板的原始固件,然后修改pid,其他的不要动就好。

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

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

                                            @小鱼 用了原固件加入了imu那个版本,确实不会出现这个问题了,还真是算力占用问题,真不好意思。下次我试试把反馈频率降下来吧,不然没有反馈调pid真挺难受的。之前把那个速度反馈信息加入到loop_fishbot_control还是因为在回调函数里只有连接了microROS才能得到反馈,那样很难得到是否启用microROS的差别。总之还是感谢小鱼,麻烦了这么久。

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