我基于 L298N 芯片构建了这个电机屏蔽来控制坦克的两个电机。一个电机使用引脚 5 和 6,另一个电机使用引脚 10 和 11。
在尝试添加TSOP 4838以使用红外遥控器控制油箱时,我注意到反向移动引脚 10/11 上的电机只能在全速下工作 - 即引脚 11 上的高 (255) 值。低于该值不会在引脚 11 上输出任何内容(这些引脚上的测量电压为 0 V)。
对于遥控器,我使用这个库。IR接收器连接在引脚 2 上(但引脚无关紧要)。问题是库代码本身。启用 IR 监听的线路irrecv.enableIRIn();
是导致问题的原因。我了解到内部 Arduino 定时器和屏蔽用于 PWM 的引脚存在冲突。
这是反向驱动电机的代码:
#include <IRremote.h>
// IR receiver configuration
const int irPin = 2;
IRrecv irrecv(irPin);
// Motors configuration
const int mLeftPin1 = 10;
const int mLeftPin2 = 11;
const int mRightPin1 = 5;
const int mRightPin2 = 6;
void setup()
{
// Start IR
irrecv.enableIRIn();
// Setup motors
pinMode(mLeftPin1, OUTPUT);
pinMode(mLeftPin2, OUTPUT);
pinMode(mRightPin1, OUTPUT);
pinMode(mRightPin2, OUTPUT);
// Move left motor in reverse, slower speed
analogWrite(mLeftPin2, 100); // This works only with 255 instead of 100
digitalWrite(mLeftPin1, LOW);
}
现在,我在这里发现Arduino Uno上的计时器使用的引脚是:
- 引脚 5 和 6:由 Timer0 控制
- 引脚 9 和 10:由 Timer1 控制
- 引脚 11 和 3:由 Timer2 控制
所以我的问题是:
为什么说明书中的屏蔽使用引脚 10 和 11 进行 PWM?它们对应于 2 个不同的计时器。为什么不是 9 和 10?
为了将 IR 与电机护罩一起使用,我应该配置 IR 库以使用什么计时器?
如果答案是 2,则应取消注释中的一行
IRremoteInt.h
。我猜 Uno 会else
在第 68 行使用分支,尽管那里只有 timer1 和 timer2。我想知道为什么 timer0 不能用于 Uno。
虽然我想留下切割痕迹并重新焊接作为最后的选择,但另一种可能性是更改屏蔽使用的引脚,但是哪个?而且我猜这也将与将定时器配置为在默认值之外的其他引脚上进行 PWM 配对,但我对定时器/中断一无所知,而且我对 Arduino 和 C 的了解有限。
我提出了一个很长的问题,因为我想学习的不仅仅是解决问题,所以请随意解释而不是问什么。
在寻找解决方案时,我还发现使用PWM或定时器时要记住的其他冲突:
- Timer0是一个 8 位的定时器,最大可以保持 255 的值。它被
delay()
and使用millis()
,所以乱用会有后果 - Timer1是一个 16 位定时器,它最多可以容纳 65535(一个无符号的 16 位整数)。Arduino Servo 库使用此计时器
- Timer2
tone()
是 Arduino功能使用的 8 位定时器
而且,当然,IRremote库使用TIMER_RESET
,因此根据它使用的计时器,它可能会与关联的引脚冲突。