我建造了 这个电机护罩 基于L298N芯片控制一个油箱的两个电机。它将引脚5和6用于一个电机,而引脚10和11用于另一个电机。
在尝试添加时 TSOP 4838 为了用IR遥控器控制油箱,我注意到在反向引脚10/11上移动电机只能全速工作 - 即引脚11上的HIGH(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
尽管只有timer1和timer2在那里,但是在第68行分支。我想知道为什么timer0不能用于Uno。
虽然我想留下切割痕迹和重新焊接作为最后的选择,但另一种可能性是改变屏蔽使用的引脚,但是哪个?而且我猜这也可以配置在其他引脚上将定时器配置为PWM而不是默认值,但我对定时器/中断一无所知,而且我对Arduino和C的了解有限。
我提出了一个很长的问题,因为我想要学习的不仅仅是解决问题,所以请随意解释所提出的问题。
在寻找解决方案时,我还发现在使用时要记住其他冲突 PWM 或计时器:
- 定时器0 是一个8位定时器,它可以保持最大值255.它被使用
delay()
和millis()
,所以当弄乱它时会有后果 - 定时器1 是一个16位定时器,它最多可以保存65535(无符号16位整数)。 Arduino Servo库使用此计时器
- 定时器2 是Arduino使用的8位定时器
tone()
功能
而且,当然, IRremote 图书馆使用 TIMER_RESET
,因此,根据它使用的计时器,它可能与相关的引脚冲突。