Arduino Uno PWM和IRremote库冲突问题

2023-05-16

问题发生环境:

Arduino UNO R3控制板,用两个L298N驱动板驱动4轮小车,然后通过控制4路PWM来控制4个轮子的速度,遥控方式为红外遥控,使用的红外库是IRremote Arduino Library v2.2.3。

问题发生时,4路PWM的控制管脚分别是:PIN5,PIN6和PIN10,PIN11

问题描述:

对于PIN11,除了PWM设置为255,其他任何合法PWM值都不能驱动电机转动,其他3个PIN脚控制的电机工作正常。

定位发现是irrecv.enableIRIn()这个操作导致。也就是说IR库和PWM控制有冲突。

解决方案:

方案一(推荐):将4路PWM的控制管脚改为:PIN5,PIN6和PIN9, PIN10

方案二:根据网上的其他方案,https://www.douban.com/note/542007770/

按照下面修改boarddefs.h,改用Timer1。

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
#else
    #define IR_USE_TIMER1   // tx = pin 9
    //#define IR_USE_TIMER2     // tx = pin 3

这个方案对我的方案没用,因为PIN10也要用来输出PWM:(,另外,和其他库还有编译冲突,就没有沿这条路往下走了。


根因分析:

首先,Arduino PWM控制是需要使用内部timer的,我这个方案用两个timer来控制PWM有点奢侈,其实只用PIN5 PIN6控制小车左右侧轮子的速度就可以了。但是手头的4个电机一致性不好,同样PWM设置下转速不同,只好分别控制,根本原因是穷,买不起4个一致性好的电机。

Arduino主芯片(328P)有3个timer:

Timer0 :8-bit timer, 最大值 255. timer0控制的管脚是PIN5, PIN6,delay() 和millis()也会用到Timer0;

Timer1 :16-bit timer, 最大值 65535 (unsigned 16-bit integer).  timer1控制管脚PIN9,PIN10,Arduino Servo 用这个 timer;

Timer2 : 8-bit timer, timer2控制管脚PIN3和PIN11,Arduino tone()会用到;

每个timer可以有多种用途,但是每个timer只产生一个中断。

以Timer0为例,根据delay()和delay_us()的设定时间产生中断,也被用来在PIN5和PIN6上产生PWM。之所以在没产生冲突是因为PWM不用中断,而是用的比较器。

IRremote库默认使用Timer2,按照上面的说法,既然PWM不使用中断,应该不会出问题的,但是PIN11上确实没有输出。

为什么在PIN11上就出问题了?

分析了一下IR库的代码,在IRremote.cpp中ISR函数开头有以下操作:

ISR (TIMER_INTR_NAME)

{

TIMER_RESET;

从这里看,Timer2每次产生中断,都会重置timer计数,而比较器在等待达到某个计数,但是却永远等不到了:(。这就是PWM在PIN11上无法输出的原因。

至于为什么在255这个值上是可以的,从代码上看:

void analogWrite(uint8_t pin, int val)
{
       // We need to make sure the PWM output is enabled for those pins
       // that support it, as we turn it off when digitally reading or
       // writing with them.  Also, make sure the pin is in output mode
       // for consistenty with Wiring, which doesn't require a pinMode
       // call for the analog output pins.
       pinMode(pin, OUTPUT);
       if (val == 0)
       {
           digitalWrite(pin, LOW);
       }
       else if (val == 255)
       {
           digitalWrite(pin, HIGH);
       }

在设置255时,analogWrite直接忽略PWM和输出比较这些操作,直接设置HIGH :<。

解决这个问题避开11和3就好了,所以这里将PWN管脚改成了PIN10。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino Uno PWM和IRremote库冲突问题 的相关文章

  • <ROS> 机器人描述--URDF和XACRO

    1 关于URDF的一些杂谈 URDF Unified Robot Description Format 是一种特殊的xml文件格式 作为机器人的一种描述文件 在ROS里面大量使用 接触ROS比较久的同学 应该会经常见到一种类似命名的包 pa
  • 网络基础知识之报文格式介绍

    1 以太网数据帧头部 DMAC xff1a 目的MAC地址 xff0c 长度6个字节 SMAC xff1a 源MAC地址 xff0c 长度6个字节 TYPE xff1a 类型字段 xff0c 表明上层是哪种协议 xff0c IP协议是0x8
  • C# 摘要认证(digest authentication) IETF RFC 2617

    背景 xff1a 最近在对接一个公安局数据接口相关的这块业务 xff0c 基于HTTP RESTFUL的接口API xff0c 请求时需要做用户认证 厂家只给提供了JAVA的demo 由于业务比较分散需要用C 来进行业务交互 解决过程 首先
  • 字节序(大小端)理解

    一 概念 字节序 xff0c 就是 大于一个字节类型的数据在内存中的存放顺序 是在跨平台和网络编程中 xff0c 时常要考虑的问题 二 分类 字节序经常被分为两类 xff1a 1 Big Endian xff08 大端 xff09 xff1
  • HTTP请求报文

    HTTP请求报文 xff1a HTTP请求报文由3部分组成 xff08 请求行 43 请求头 43 请求体 xff09 请求行 xff1a 是请求方法 xff0c GET和POST是最常见的HTTP方法 xff0c 除此以外还包括DELET
  • Python requests HTTP验证登录(解决401错误)

    1 场景 1 xff09 用户输入完网址后 xff0c 浏览器直接弹出需要输入用户名 密码 PS xff1a 此时输入用户名密码即可登录 xff0c 或者直接带着用户名密码访问网站 假设url为 http xxx yyy zzz 用户名为a
  • CANopen学习笔记

    CANopen学习笔记 1 TPDO和RPDO都是针对从站来说的 xff0c 协议上没有有讲任何一个关于主站的概念 xff0c 协议就只是定义从站 xff0c 没有定义主站任何东西 TPDO xff1a 从站 lt 主站 RPDO xff1
  • MS5611气压传感器手册勘误

    说是勘误其实也不能完全算是勘误 xff0c 只能说是防止各位看官对手册的错误解读 前几天调试MS5611这款气压计 xff0c 按照手册来计算发现无论如何气压值都是不对的 xff0c 比如说我这的1020mbar xff08 前几天用BMP
  • 异常处理方式——抛出处理

    异常的处理方式2 抛出处理 throw throws 抛出处理注意的细节 xff1a 1 如果一个方法内部抛出了一个异常对象 xff0c 那麽必须在方法上声明抛出 2 如果调用了一个声明抛出异常类型的方法 xff0c 那么调用者必须要进行处
  • socket实现UDP通信

    UDP与TCP不同 xff0c 是一种无连接的通信方式 xff0c 相比TCP而言更加灵活 利用socket实现UDP的方式相比TCP而言也更加简单 发送方 xff1a 1 初始化套接字 2 创建socket 3 利用sendto发送数据
  • C语言之#define用法入门详解

    一 define的基本语法 在C语言中 xff0c 常量是使用频率很高的一个量 常量是指在程序运行过程中 xff0c 其值不能被改变的量 常量常使用 define来定义 使用 define定义的常量也称为符号常量 xff0c 可以提高程序的
  • 棋盘格自动生成器——四种格式(格雷码棋盘格、圆点、二维码棋盘格)

    棋盘格生成器可以生成上面四种格式的标定板 想要多大想要几行几列都可以动态设置 非常好用 对于自己写代码或用cad画都比较浪费时间 这个生成器可以立刻生成pdf 只要打印机不设置缩放 即可正常尺寸打印 非常非常好用 介绍给大家这个好用的地址
  • python爬虫-验证码的处理

    在爬取网页数据时 xff0c 经常出现需要登录账户且要输入验证码的情况 以http www santostang com wp login php action 61 register该网页为例 xff0c 需要先使用浏览器的检查功能找到f
  • HTTP协议的解码和编码

    HTTP协议的解码和编码 编码规范URL的编码与解码 编码 规范实战 xff1a 使用fiddler来抓住http请求 相当于各省各地的人说不同的话 xff0c 大家互相听不懂 xff0c 那么http就相当于有一个翻译器 xff0c 能够
  • Linux服务器上请求接口说明

    Linux服务器上请求接口说明 一 参数指令说明 X 指定请求方法 x 指定HTTP请求的代理 H 指定请求标头 d 发送POST请求提交的数据 xff0c 使用 d参数后 xff0c 会自动将请求转为POST xff0c HTTP请求会自
  • 编写一个程序,将两个字符串连接起来,不要用stracat 函数

    可能写的不好 xff0c 希望对你们有帮助 include lt stdio h gt int main int a 61 0 b 61 0 c 61 0 m 61 0 i j char str1 80 str2 80 printf 请输入
  • Linux ulimit命令详解

    ulimit 是一个计算机命令 xff0c 用于shell启动进程所占用的资源 xff0c 可用于修改系统资源限制 命令常用参数 H 设置硬资源限制 S 设置软资源限制 a 显示当前所有的资源限制 c size 设置core文件的最大值 单
  • 几种CAN应用层协议介绍

    一 CanOpen n CAL 提供了所有的网络管理服务和报文传送协议 xff0c 但并 没有定义 CMS 对象的内容或者正在通讯的对象的类 型 而这正是 CANopen 切入点 n CANopen 是在 CAL 基础上开发的 xff0c
  • CImage类

    我们知道 xff0c Visual C 43 43 中的CBitmap类的功能简直太弱小了 xff0c 这曾经让Visual C 43 43 在图像处理方面的功能比较尴尬 之前笔记里面 xff0c 我们采用的CBitmap配合GDI进行透明
  • PTA 7-20 表达式转换 (25分)

    算术表达式有前缀表示法 中缀表示法和后缀表示法等形式 日常使用的算术表达式是采用中缀表示法 xff0c 即二元运算符位于两个运算数中间 请设计程序将中缀表达式转换为后缀表达式 输入格式 输入在一行中给出不含空格的中缀表达式 xff0c 可包

随机推荐