ESP32的RMT模块项目实用

1. 技术背景

最近公司在用ESP32的模组方案实现智能音箱的相关功能的项目。需要展示模组的网络状态以及音箱的语音交互状态,找了一家RGB灯板供应商。需要模组通过一个io口输出脉冲波形,来控制灯板切换模式,展示不同的状态。供应商给到控制灯效模式的文档大概如下图:

看到这个波形我首先想到的是PWM,和timer中断控制io状态翻转。由于每个脉冲的占空比都可能要改变,使用ESP32的PWM并不好生成准确的脉冲。使用timer的中断触发翻转io电平虽然可以实现基本的波形。但是由于频繁进入中断,比较耗费CPU的资源。

于是重新翻看乐鑫官网的ESP32 datasheet,终于在数据手册中找到了一章关于红外远程控制的功能描述,发现可以通过RMT模块来指定IO输出指定的脉冲,实在是太方便了。
在乐鑫的ESP32开发指南页面也有RMT功能和API详细的描述。

我这里基于乐鑫SDK的demo code修改实现指定脉冲波形输出。

esp-idf/examples/peripherals/rmt_tx/main/rmt_tx_main.c

主要修改rmt初始化配置参数

rmt_item32_t items[] = {
    // E : dot
    {
  {
  { 32767, 1, 32767, 0 }}}, // dot
    //
    {
  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ESP32RMT(Remote Control)模块可以用于发射和接收红外遥控信号。其中,NEC是一种广泛使用的红外遥控协议。要设置RMT模块的NEC Tick,可以按照以下步骤进行: 1. 确定RMT通道号。ESP32有8个RMT通道,每个通道都可以独立地设置和使用。假设我们选择通道0来发送NEC信号。 2. 计算NEC的Tick值。NEC协议的一帧数据包含一个9位的地址码和一个8位的命令码,每个码位都由一个连续的38kHz载波信号表示。在NEC协议中,一个码位的持续时间为560us,其中前面的9位码位和后面的8位码位之间有一段1.68ms的间隔。因此,我们可以将一个NEC码位的持续时间设置为560us,将码位之间的间隔时间设置为1.68ms。 3. 设置RMT模块的参数。在ESP-IDF中,可以使用rmt_config_t结构体来设置RMT模块的参数,其中包括通道号、时钟分频、发送缓冲区大小等。例如,我们可以设置RMT通道0的时钟分频为80MHz,发送缓冲区大小为128个码位。 4. 将NEC数据写入RMT发送缓冲区。在ESP-IDF中,可以使用rmt_item32_t结构体来表示一个32位的RMT数据项。对于NEC协议,每个码位需要发送一个高电平和一个低电平,因此我们需要使用两个rmt_item32_t结构体来表示一个码位。例如,我们可以将地址码和命令码依次写入RMT发送缓冲区中。 5. 启动RMT发送。在设置好RMT模块的参数并将NEC数据写入发送缓冲区后,可以使用rmt_write_items函数启动RMT发送。该函数会阻塞当前任务,直到所有数据发送完成。 综上所述,要设置ESP32RMT模块发送NEC信号,需要计算NEC的Tick值并将NEC数据写入RMT发送缓冲区,然后启动RMT发送。具体实现可以参考ESP-IDF官方文档中的RMT示例代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值