Arduino UNO 舵机与直流电机PWM冲突问题

使用servo库控制舵机与通过9,10引脚对直流电机PWM调速时冲突问题的解决办法。
在调用Servo.attach(pin)方法之后,可能会有电机不转了,官网上关于servo库的介绍,

The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.

也就是说是servo库与PWM调速有冲突,在9pin和10pin上禁用analogWrite()函数调速,所以电机就不转了,

解决方法:

1. 更换PWM引脚,不使用9, 10, 对于PWM引脚较少的开发板如Uno / Nano,可以考虑换PWM引脚多的开发板如Mega2560;

2. 更改电机控制方式,像L298N这类电机驱动板,即可以通过IN1, IN2来调速,也可通过EN1来调速,不过这虽然可以少使用1个PWM引脚,但要多使用一个数字引脚; 

3. 不使用Servo库,自行做PWM处理,代码如下: 

void servo(int angle) { //定义一个脉冲函数
  //发送50个脉冲
  for(int i=0;i<50;i++){
    int pulsewidth = (angle * 11) + 500; //将角度转化为500-2480的脉宽值
    digitalWrite(servoPin, HIGH);   //将舵机接口电平至高
    delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数
    digitalWrite(servoPin, LOW);    //将舵机接口电平至低
    delayMicroseconds(20000 - pulsewidth);
  }
  delay(100);
}
具体使用方法如下


const int servoPin = 8;    // 舵机接口引脚,接橙色信号线。
 
void setup() {
  pinMode(servoPin, OUTPUT); //设定舵机接口为输出接口
}
 
void loop() {
  servo(3);
  delay(600);
}
 
void servo(int angle) { //定义一个脉冲函数
  //发送50个脉冲
  for(int i=0;i<50;i++){
    int pulsewidth = (angle * 11) + 500; //将角度转化为500-2480的脉宽值
    digitalWrite(servoPin, HIGH);   //将舵机接口电平至高
    delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数
    digitalWrite(servoPin, LOW);    //将舵机接口电平至低
    delayMicroseconds(20000 - pulsewidth);
  }
  delay(100);
}
参考:https://blog.csdn.net/u010351766/article/details/64904756


- 本文为本站原创文章,转载请保留出处。
- 文章链接:https://www.xpstem.com/article/10069

2022-06   阅读(1485)   评论(0)
 标签: 创客 Arduino PWM 舵机

涨知识
伺服电机

伺服电机(servo motor )是指在伺服系统中控制机械元件运转的发动机,是一种补助马达间接变速装置。

评论:
相关文章
ESP32 + Arduino使用TFT_eSPI库

Arduino+ESP32上使用TFT_eSPI库快速点亮这个屏幕,驱动芯片ST7789


Arduino 数据结构: 队列Queue

Queue 库提供了一个通用的 C++ 动态队列实现,专为在 Arduino 项目中使用而定制。


小鹏浇花套件单机版程序V1.0.0

本程序是小鹏物联网智能浇花套件的单机版程序(不连接物联网),供同学们参考。


Arduino 数据结构: ArrayList

ArrayList 类是一个 C++ 模板类,它提供了 ArrayList 的实现,以便轻松存储任何指定类型的值。它允许使用索引进行高效存储和检索,支持排序操作。


ESP32 FreeRTOS 双核使用

ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。


理解 MSBFIRST(最高有效位)和 LSBFIRST(最低有效位)

在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。


Arduino 和 TB6612FNG 驱动直流电机

TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。


Arduino-ESP32 Preferences库使用详解

Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。


Adafruit GFX图形库的使用

用于Arduino的Adafruit_GFX库为我们所有的LCD和OLED显示器提供了通用语法和图形功能集。这使Arduino程序可以轻松地在显示类型之间进行调整,而不必花太多精力……


Arduino Serial 接收数字

在Arduino中,通过串行端口接收数字通常涉及使用Serial.read()、Serial.readString()、Serial.parseInt()等方法。