Radiohead RH_ASK.h 干扰对电机的模拟写入

Posted

技术标签:

【中文标题】Radiohead RH_ASK.h 干扰对电机的模拟写入【英文标题】:Radiohead RH_ASK.h interfering with analog write to motors 【发布时间】:2018-04-22 13:05:45 【问题描述】:

我们尝试使用 RF-433 发射器和接收器远程控制 elegoo 机器人汽车 (https://www.elegoo.com/product/elegoo-uno-project-smart-robot-car-kit-v1-0/)。该车有 4 个直流电机,由 L298N 控制器控制,电机由 2 节 18650 4200mAh 3.7V 锂离子电池供电,这些电池也为 Arduino Uno 供电。当我们尝试在没有 RF-433 的情况下通过模拟写入使用 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();
    

另一个程序运行传输并在按下按钮时发送消息。

【问题讨论】:

如果 _mFreeze();按预期工作,我猜你不需要radio.init。你能找到 Radio.init() 并在这里分享吗? 【参考方案1】:

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

不过,RH_ASK 库也使用定时器。来自official documentation:

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

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

【讨论】:

以上是关于Radiohead RH_ASK.h 干扰对电机的模拟写入的主要内容,如果未能解决你的问题,请参考以下文章

pcl怎样控制伺服电机回到零点

电机与维修

继电器继电器5V的,继电器控制12V直流电机正反转是继电器老是吸合不稳,哒哒响,咋么解决?大仙们出出主意

Arduino ESP8266 通过RF433将DHT11数据传输实验

Arduino nano 通过RF433将DHT11数据传输实验

步进电机驱动器单片机控制电路