0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Arduino的PWM与红外信号处理

CHANBAEK 来源:编程圈子 作者:编程圈子 2023-03-14 11:35 次阅读

一、基本概念

1. 脉宽调制

PWM(Pulse Width Modulation)即脉宽调制,是一种通过调节信号的占空比来控制电路的技术。 在 PWM 技术中,信号的周期保持不变,但是信号的占空比可以随时间变化而改变。 当信号的占空比为 0% 时,表示信号一直处于低电平状态; 当占空比为 100% 时,表示信号一直处于高电平状态; 而在占空比为中间值时,信号将以一定的频率在低电平和高电平之间切换。

在电路应用中,PWM 技术常用于控制电机的转速、控制 LED 的亮度和颜色、实现音频数字化等方面。 例如,在控制 LED 亮度时,可以通过调节 PWM 信号的占空比来控制 LED 的亮度,占空比越大,LED 灯亮度越高,反之亦然。

微控制器中,通过定时器和计数器等硬件模块,可以实现高精度的 PWM 信号输出。 许多单片机嵌入式系统都提供了 PWM 功能,并且在软件层面提供了相应的 API 和库函数,方便开发者使用。 在使用 PWM 技术时,需要根据具体的应用场景选择合适的 PWM 频率和分辨率,以及合适的占空比范围和切换速率,以达到最优的控制效果。

2. ESP8266 的 PWM功能

ESP8266 是一款高度集成的 Wi-Fi SoC 芯片,内部集成了许多硬件模块,其中包括一个灵活的 PWM 控制器,即 LEDC(LED 控制器)。 LEDC 可以用于实现高精度的 PWM 输出,适用于控制 LED 的亮度、颜色和闪烁等效果。

ESP8266 的 LEDC 控制器可实现同频率、不同占空比的PWM波形输出。 LEDC 模块的主要特点包括:

  • 高精度:LEDC 支持高达 20 位的 PWM 分辨率,可实现非常精细的 PWM 控制。
  • 多路输出:LEDC 可以同时控制多达 16 个 PWM 通道,满足多路 PWM 输出的需求。
  • 灵活配置:LEDC 可以配置不同的 PWM 频率和分辨率,以适应不同的应用场景。
  • 低成本:LEDC 是 ESP8266 芯片内置的硬件模块,使用 LEDC 功能无需外接任何外部元器件,节省了硬件成本。

在使用 ESP8266 的 PWM 功能时,可以使用 ESP8266 的官方库文件 ESP8266WiFi.h 中提供的 LEDC 相关函数进行配置和控制。 例如,可以使用 ledcSetup() 函数来初始化 PWM 通道,并使用 ledcWrite() 函数来设置 PWM 占空比。 此外,ESP8266 的开发环境也提供了丰富的示例代码和库函数,方便开发者快速上手使用 PWM 功能。

要注意的是,GPIO1和GPIO3作为调试串口的TX和RX,一般不做PWM使用。

3. node-mcu 引脚图

4. 模拟写入

(1)模拟写入

要实现输出PWM信号,可以使用analogWrite()函数:

analogWrite(pin,value)
1
  • pin:GPIO引脚
  • value:默认0-1023
    当值为0时,该引脚禁用PWM。 值为1023时 占空比100%。

(2)修改频率 analogWriteFreq

analogWriteFreq(new_frequency);

(3)调节分辨率

可以用于调节模拟输出的 PWM 范围。
在 ESP8266 中,analogWriteRange() 函数用于设置 PWM 的分辨率。 默认情况下,ESP8266 的 PWM 分辨率为 10 位,即占空比范围为 0~1023。 通过调用 analogWriteRange() 函数,可以将 PWM 分辨率调节为 8 位或 9 位,以扩大或缩小 PWM 占空比范围。

二、使用analogWrite实现PWM

const int ledPin = 2; 

void setup() {
  
}

void loop() {
  // 增加LED亮度
  for(int dutyCycle = 0; dutyCycle < 1023; dutyCycle++){   
    // 通过PWM改变LED亮度
    analogWrite(ledPin, dutyCycle);
    delay(10);
  }

  // 降低LED亮度
  for(int dutyCycle = 1023; dutyCycle > 0; dutyCycle--){
    // 通过PWM改变LED亮度
    analogWrite(ledPin, dutyCycle);
    delay(10);
  }
}

三、发送红外信号

1. 红外通信原理

红外通信是一种无线通信方式,它通过发射红外线来传输数据或控制信号,通常用于红外遥控器、红外传感器等场景。

红外信号是一种电磁辐射,其频率在可见光波和微波之间,一般波长为0.75至1000微米,其中,可见光波长为0.38至0.78微米。 红外线被称为"热线",因为物体温度越高,发射的红外线辐射就越多。

在红外通信中,通过对载波信号进行调制,将数字信号转换为红外信号,从而实现数据或控制信号的传输。 调制方式主要有两种:幅度调制和频率调制。

  • 幅度调制:通过改变载波信号的幅度,将数字信号转换为红外信号。 在幅度调制中,通常用一个二进制信号来控制红外发射器的开关状态,从而实现传输数据。
  • 频率调制:通过改变载波信号的频率,将数字信号转换为红外信号。 在频率调制中,常用的方式是将数字信号和一个固定的载波信号进行异或运算,从而得到一个频率变化的信号,用来控制红外发射器的开关状态,实现传输数据。

接收端通过红外接收器接收到红外信号,然后通过解调的方式提取出携带的数据或控制信号。 解调的过程就是将红外信号转化为电信号,然后提取出载波信号,再将其与一个固定的频率进行比较,从而恢复出原始的数字信号。

2. 载波频率

红外信号的载波频率(Carrier Frequency)指的是红外信号中用于携带信息的载波波形的频率。 在红外通信中,常用的载波频率一般在 20 kHz 到 50 kHz 之间。

将信息信号和载波信号进行调制后,就可以通过红外发射器将带有载波信号的红外信号发送出去。 接收器可以通过解调过程,将携带的信息信号提取出来。

在红外遥控器中,一般使用一定的载波频率进行通信。 这样可以提高通信的可靠性,同时也可以避免干扰,因为很少有其他的设备会使用相同的载波频率进行通信。

3. 发送周期

红外信号的发送周期是指一个完整的红外信号周期所需的时间。 在红外通信中,为了确保通信的可靠性,每一个红外信号周期中一般包含多个载波周期。 具体来说,发送周期包括两部分时间:载波周期和调制周期。

  1. 载波周期:指载波信号一个完整的波形所需的时间,它是红外信号的基本单位。 在红外通信中,载波周期通常为一个固定的时间,一般在38kHz左右。
  2. 调制周期:指一个完整的红外信号周期所需的时间,它包括了载波周期和数字信号的调制。 在红外通信中,调制周期的长度取决于传输的数据长度和传输速率。 一般来说,调制周期越长,传输速率就越慢,但是数据传输的可靠性会更高。

在红外遥控器中,每一个按键通常对应一个特定的红外信号,这个红外信号的发送周期一般是固定的,以确保遥控器能够正确地发送信号,并且接收器能够正确地解码信号。

4. 使用

(1)安装库

库开源地址:

https://github.com/crankyoldgit/IRremoteESP8266

(2)代码实现

#include 
#include 

IRsend irsend(4); // 初始化IRsend对象并设置输出引脚,GPIO4=D2

void setup()
{
  Serial.begin(115200);
  delay(1000);
}

void loop()
{
  Serial.println("Sending IR signal...");
  irsend.sendSony(0xA90, 12); // 发送SONY红外信号,传输数据为0xA90,数据长度为12位
  delay(1000); // 等待1秒钟
}

5. 红外接收示例

#include 
#include 
#include 
#include 

// An IR detector/demodulator is connected to GPIO pin 14(D5 on a NodeMCU
// board).
// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
// Note: GPIO 14 won't work on the ESP32-C3 as it causes the board to reboot.
#ifdef ARDUINO_ESP32C3_DEV
const uint16_t kRecvPin = 10;  // 14 on a ESP32-C3 causes a boot loop.
#else  // ARDUINO_ESP32C3_DEV
const uint16_t kRecvPin = 14;
#endif  // ARDUINO_ESP32C3_DEV

IRrecv irrecv(kRecvPin);

decode_results results;

void setup() {
  Serial.begin(115200);
  irrecv.enableIRIn();  // Start the receiver
  while (!Serial)  // Wait for the serial connection to be establised.
    delay(50);
  Serial.println();
  Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
  Serial.println(kRecvPin);
}

void loop() {
  if (irrecv.decode(&results)) {
    // print() & println() can't handle printing long longs. (uint64_t)
    serialPrintUint64(results.value, HEX);
    Serial.println("");
    irrecv.resume();  // Receive the next value
  }
  delay(100);
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    240

    文章

    23128

    浏览量

    658261
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5140

    浏览量

    213360
  • 脉宽调制
    +关注

    关注

    3

    文章

    215

    浏览量

    38279
  • Arduino
    +关注

    关注

    187

    文章

    6462

    浏览量

    186613
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44816
收藏 人收藏

    评论

    相关推荐

    arduino学习笔记7 - PWM控制LED实验 PWM讲解

    ~当然。。。这和真实的连续输出还是有差别的,单位时间内输出的0,1信号越多,控制的就越精确。在下图中,绿线之间代表一个周期,其值也是PWM频率的倒数。换句话说,如果arduino PWM
    发表于 10-23 17:34

    详解基于ArduinoPWM输出

    理解Arduino的模拟输入A0~A5。本篇深入讨论Arduino的模拟信号输出(PWM)引子Arduino Uno是单片机,其内部
    发表于 08-03 21:57

    Arduino如何利用红外感应控制舵机

    实现功能:当红外感应到人时,控制舵机转动180度参考:基于Arduino的多种方式控制舵机(舵机、电位器、蓝牙).硬件连接:舵机连接:ArduinoMicro Servo 9g5V红线GND棕色
    发表于 06-28 11:17

    ArduinoPWM控制代码

    如果你需要一个具体的代码示例,我可以为你提供一个ArduinoPWM控制代码。Arduino是一款常用的开源电子原型平台,它提供了PWM功能。以下是一个简单的
    发表于 09-21 08:57

    如何使用Arduino红外控制进行智能机械手的设计资料和程序免费下载

    等。通过 Arduino红外控制功能,借助红外遥控器向 Arduino 发送信号,再利用 Ardui
    发表于 05-13 08:00 5次下载
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>红外</b>控制进行智能机械手的设计资料和程序免费下载

    dfrobot数字红外信号发射模块介绍

    IR Transmitter Module是一款Arduino兼容的38KHz红外线发射传感器,可发射标准38KHz的调制信号,通过对Arduino进行编程,即可实现对38KHzIR
    的头像 发表于 12-13 15:38 2344次阅读
    dfrobot数字<b class='flag-5'>红外</b><b class='flag-5'>信号</b>发射模块介绍

    Arduino的实验例程之红外遥控实验

    本文档的主要内容详细介绍的是Arduino的实验例程之红外遥控实验。
    发表于 02-25 16:36 49次下载
    <b class='flag-5'>Arduino</b>的实验例程之<b class='flag-5'>红外</b>遥控实验

    如何在Arduino中简单实现PWM

    Q A 在Arduino中轻松实现脉宽调制(PWM) 脉宽调制( PWM信号基本上是一个方波,可在导通(高)和关断(低)状态之间切换。PWM
    的头像 发表于 05-21 10:37 1.7w次阅读
    如何在<b class='flag-5'>Arduino</b>中简单实现<b class='flag-5'>PWM</b>?

    使用红外传感器构建一个Arduino计数机

    在这个项目中,我们正在使用红外传感器构建一个Arduino 计数机。这台机器在红外传感器的帮助下对不同部分的硬币进行计数和分类。在这里,布置了红外传感器以感应不同的硬币,
    的头像 发表于 08-17 15:59 4304次阅读
    使用<b class='flag-5'>红外</b>传感器构建一个<b class='flag-5'>Arduino</b>计数机

    如何使用Arduino生成的PWM来控制交流风扇的速度

    在这个项目中,我们将演示使用 TRIAC 的 Arduino 交流风扇速度控制。这里使用交流信号的相位控制方法来控制交流风扇的速度,使用 Arduino 生成的 PWM
    的头像 发表于 08-18 16:26 1.1w次阅读
    如何使用<b class='flag-5'>Arduino</b>生成的<b class='flag-5'>PWM</b>来控制交流风扇的速度

    使用Arduino解码任何遥控器的红外遥控信号

    电子发烧友网站提供《使用Arduino解码任何遥控器的红外遥控信号.zip》资料免费下载
    发表于 10-27 11:51 4次下载
    使用<b class='flag-5'>Arduino</b>解码任何遥控器的<b class='flag-5'>红外</b>遥控<b class='flag-5'>信号</b>

    Arduino PWM控制的对称电源

    电子发烧友网站提供《Arduino PWM控制的对称电源.zip》资料免费下载
    发表于 11-01 14:22 0次下载
    <b class='flag-5'>Arduino</b> <b class='flag-5'>PWM</b>控制的对称电源

    使用Arduino进行脉冲宽度调制(PWM)并观察示波器信号

    电子发烧友网站提供《使用Arduino进行脉冲宽度调制(PWM)并观察示波器信号.zip》资料免费下载
    发表于 06-27 09:15 0次下载
    使用<b class='flag-5'>Arduino</b>进行脉冲宽度调制(<b class='flag-5'>PWM</b>)并观察示波器<b class='flag-5'>信号</b>

    Arduino红外遥控器

    电子发烧友网站提供《带Arduino红外遥控器.zip》资料免费下载
    发表于 07-06 10:51 0次下载
    带<b class='flag-5'>Arduino</b>的<b class='flag-5'>红外</b>遥控器

    PWM信号的滤波和处理方法

    PWM(脉冲宽度调制)信号的滤波和处理是电子设计中常见的任务,旨在将PWM信号转换为更平滑的直流信号
    的头像 发表于 11-18 17:41 368次阅读