jingyangligongzi 2024-03-18 22:24 采纳率: 0%
浏览 17

stm32麦轮小车pwm输出

我在编写四驱麦轮的时候,看到一位up的pwm代码,用了2个定时器,8个引脚输出pwm,请问是为什么?
按照我的理解是四个带编码器的电机,仅需4个引脚就可以输出pwm,也就是一个定时器即可,为什么还用另一个?

img

  • 写回答

3条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-18 22:25
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    可能是出于以下几个原因:
    1. 控制精度要求较高:使用双定时器可以极大地提高PWM控制的准确度。
    2. 同时控制多个设备:使用双定时器可以同时控制多个设备,比如同时控制四个带编码器的电机和其他附加设备。
    3. 代码易于管理:使用两个定时器,可以将代码分离成两个独立的模块,分别控制两个定时器的输出,代码易于管理和调试。 案例: 例如,我们想控制两个不同的电机,一个需要具有更高的控制精度,另一个需要同时与其他设备控制。我们可以像下面的代码一样使用两个定时器控制它们:
    #include <Servo.h>
    Servo motor1;
    Servo motor2;
    void setup() {
      // 设置定时器1,控制电机1
      TCCR1A = _BV(COM1A1) | _BV(WGM11); // WGM11为PWM选择模式中的第4位,使得定时器1正向计数至OCR1A时,引脚13的电平发生变化
      TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11); // 设置PWM选择模式为14,用ICR1作为计数器,设置预分频系数为8
      ICR1 = 4999; // 设置频率为20kHz,4999为计数器上限
      // 设置定时器2,控制电机2
      TCCR2A = _BV(COM2A1) | _BV(WGM21) | _BV(WGM20); // WGM21和WGM20为PWM选择模式中的第2,1位,使得定时器2正向计数至OCR2A时,引脚11的电平发生变化
      TCCR2B = _BV(CS22); // 设置预分频系数为64
      OCR2A = 124; // 设置频率为62500Hz,对应控制的电机2
      motor1.attach(13);
      motor2.attach(11);
    }
    void loop() {
      // 控制电机1
      motor1.write(90); // 设置电机1占空比为50%
      // 控制电机2
      analogWrite(3,127); // 设置电机2占空比为50%
    }
    

    在此代码中,我们使用了两个定时器分别控制两个电机的PWM输出,并且电机1的PWM输出采用了更高的控制精度,电机2则需要与其他设备共同控制,仅需要一个更高的频率即可。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月18日

悬赏问题

  • ¥15 c#窗体设计器错误如何解决?
  • ¥30 征集Python提取PDF文字属性的代码
  • ¥15 如何联系真正的开发者而非公司
  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 (求远程解决)深信服vpn-2050这台设备如何配置才能成功联网?