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   阅读(1610)   评论(0)
 标签: 创客 Arduino PWM 舵机

涨知识
LED

发光二极管,简称为LED,是一种常用的发光器件,通过电子与空穴复合释放能量发光, 发光二极管可高效地将电能转化为光能,在现代社会具有广泛的用途,如照明、平板显示、医疗器件等。

评论:
相关文章
ESP32 Arduino 开发框架

Arduino开发环境下适用于ESP32芯片系列开发板的应用开发框架。


【ESP32 C++教程】Unit1-2 C++类基础知识

本小节主要介绍C++ 类相关的基础知识,包括类的定义、继承、多态,范围作用域等。


【ESP32 C++教程】Unit1-1 开发环境准备

本讲主要介绍VSCode Arduino开发环境的搭建,及与Arduino IDE开发环境的比较。


Arduino-ESP32与ESP-IDF的版本对应表

Arduino-ESP32与ESP-IDF的版本对应表。


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 的使用如何影响移位寄存器的输出。