无线电头RH_ASK.h干扰对电机的模拟写入



我们试图远程控制一辆elegoo机器人汽车(https://www.elegoo.com/product/elegoo-uno-project-smart-robot-car-kit-v1-0/)带有RF-433发射机和接收机。该车有4个直流电机,由L298N控制器控制,电机由2个18650 4200mAh 3.7V锂离子电池供电,该电池也为Arduino Uno供电。当我们试图在没有RF-433的情况下通过analogWrite用PWM控制汽车时,它工作得很好,但当使用RF时汽车一侧的马达失灵了。我们已经将问题缩小到代码的特定部分:

if (!Radio.init()) {
Serial.println("init failed");
}

如果包含此部分,则会出现问题。但当评论结束时,汽车运行良好。这就是为什么我们认为RH_ASK库和arduino代码之间存在干扰。代码的其余部分在这里。

#include < RH_ASK.h >
#include < SPI.h > // Not actually used but needed to compile
RH_ASK Radio(2000, 0);
// Pin connections to L298n motor controller
int in1 = 9;
int in2 = 8;
int in3 = 7;
int in4 = 6;
/*define channel enable output pins*/
int ENA = 10;
int ENB = 5;
/*define forward function*/
void _mForward() {
analogWrite(ENA, 130);
analogWrite(ENB, 130);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
Serial.println("Forward");
}
// function to turn right
void _mRight() {
analogWrite(ENA, 130);
analogWrite(ENB, 130);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
Serial.println("Right");
}
// Function to stop the car
void _mFreeze() {
analogWrite(ENA, LOW);
analogWrite(ENB, LOW);
}
void setup() {
Serial.begin(9600); // Debugging only
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
if (!Radio.init()) { // initialize rf communication
Serial.println("init failed");
}
}
void loop() {
_mForward();
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN]; //Read transmitted message into an array
uint8_t buflen = sizeof(buf);
// stop the car if we receive a message
while (Radio.recv(buf, & buflen)) {
_mFreeze();
}
}

另一个程序运行变速器,并在按下按钮时发送信息。

问题的答案是计时器。为了产生用于控制电机的PWM信号,Arduino使用硬件定时器。Arduino Uno中有三个,每个定时器负责2个PWM输出(总共6个)。这个主题在Arduino网站上有很好的描述:https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM

但是,RH_ASK库也使用计时器。来自官方文件:

RH_ASK驱动程序使用计时器驱动的中断,每个位周期生成8个中断。RH_ASK接管了类似Arduino平台上的计时器。默认情况下,它接管计时器1。您可以通过启用RH_ASK.cpp 顶部附近的define RH_ASK_ARDUINO_use_TIMER2来强制它使用Timer 2

如果程序的两个不同部分试图控制计时器,则会出现问题。定时器1负责在引脚9和10上产生PWM信号。因此,为了解决您的问题,您可以将ENA引脚连接到任何其他可用的模拟输出引脚(5、6、3、11)。

相关内容

  • 没有找到相关文章

最新更新