【发布时间】:2013-09-09 19:18:36
【问题描述】:
我基于L298N芯片构建了this motor shield来控制一个坦克的两个电机。一个电机使用引脚 5 和 6,另一个电机使用引脚 10 和 11。
在尝试添加 TSOP 4838 以使用 IR 遥控器控制油箱时,我注意到反向移动引脚 10/11 上的电机只能在全速下工作 - 也就是说,高 (255) 值引脚 11。低于该值的任何值都不会在引脚 11 上输出任何内容(这些引脚上的测量电压为 0 V)。
对于遥控器,我使用this library。 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);
}
现在,我发现hereArduino Uno 上的定时器使用的引脚是:
- 引脚 5 和 6:由 Timer0 控制
- 引脚 9 和 10:由 Timer1 控制
- 引脚 11 和 3:由 Timer2 控制
所以我的问题是:
为什么指令中的屏蔽使用引脚 10 和 11 进行 PWM?它们对应于 2 个不同的计时器。为什么不是 9 和 10?
为了将 IR 与电机护罩一起使用,我应该配置 IR 库以使用什么计时器?
如果答案为 2,则应在
IRremoteInt.h中取消注释一行。我猜 Uno 会在第 68 行采用else分支,尽管那里只有 timer1 和 timer2。我想知道为什么 Timer0 不能用于 Uno。
虽然我想留下切割痕迹并重新焊接作为最后的选择,但另一种可能性是更改屏蔽使用的引脚,但是哪个?而且我猜这也将与将定时器配置为在其他引脚上进行 PWM 而非默认配置配对,但我对定时器/中断一无所知,而且我对 Arduino 和 C 的了解有限。
我提出了一个很长的问题,因为我想学习的不仅仅是解决问题,所以请随意解释而不是问什么。
在寻找解决方案时,我还发现在使用 PWM 或计时器时需要记住的其他冲突:
-
Timer0是一个8位定时器,最大值为255,被
delay()和millis()使用,乱用会有后果 - Timer1 是一个 16 位定时器,它最多可以容纳 65535(一个无符号的 16 位整数)。 Arduino Servo 库使用此计时器
-
Timer2 是 Arduino
tone()函数使用的 8 位定时器
当然,IRremote 库使用TIMER_RESET,因此根据它使用的定时器,它可能会与关联的引脚发生冲突。
【问题讨论】:
-
+1。示例性问题。
标签: timer arduino avr atmega pwm