esp8266-01S实现PPM波形

esp8266-01虽然小众,但是功能可不能少。因航模需要让ESP8266-01生成PPM波形。

复制代码
#include <ESP8266WiFi.h>
#include <Ticker.h>  // 仅用于延时函数替代

#define PPM_PIN 2    // 使用 GPIO2 (需断开串口上传时的连接)
#define CHANNELS 4   // PPM通道数量
#define FRAME_LENGTH 22500 // 完整PPM帧长度(us) - 标准22.5ms
#define SYNC_PULSE 400    // 同步脉冲宽度(us)
#define CHANNEL_PULSE 200 // 通道脉冲宽度(us)

// 通道数据 (单位: 微秒 us)
int ppmValues[CHANNELS] = {1150, 1240, 1180, 1195}; 

volatile unsigned int currentChannel = 0;
volatile unsigned long nextEdge = 0;
bool outputState = false;

// 硬件定时器中断 (每1us计数)
void IRAM_ATTR onTimer() {
  static unsigned long counter = 0;
  counter++;
  
  if (counter >= nextEdge) {
    if (!outputState) {
      // 开始新脉冲
      digitalWrite(PPM_PIN, HIGH);
      outputState = true;
      
      // 设置脉冲结束时间
      nextEdge = counter + (currentChannel == 0 ? SYNC_PULSE : CHANNEL_PULSE);
    } else {
      // 结束当前脉冲
      digitalWrite(PPM_PIN, LOW);
      outputState = false;
      
      // 移动到下一通道
      currentChannel = (currentChannel + 1) % (CHANNELS + 1);
      
      // 设置下一脉冲开始时间
      if (currentChannel == 0) {
        nextEdge = counter + FRAME_LENGTH - SYNC_PULSE;
      } else {
        nextEdge = counter + ppmValues[currentChannel - 1] - CHANNEL_PULSE;
      }
    }
  }
}

void setup() {
  pinMode(PPM_PIN, OUTPUT);
  digitalWrite(PPM_PIN, LOW);
  
  // 配置硬件定时器 (Timer1)
  noInterrupts();
  timer1_isr_init();
  timer1_attachInterrupt(onTimer);
  timer1_enable(TIM_DIV1, TIM_EDGE, TIM_LOOP); // 预分频1 (80MHz -> 80MHz)
  timer1_write(80); // 80 ticks = 1us @ 80MHz (80,000,000 / 1,000,000 = 80)
  interrupts();
}

void loop() {
  // 这里可以动态更新通道数据
  // 例如: ppmValues[0] = analogRead(A0) / 4 + 1000;
  ppmValues[0] = ppmValues[0]+1;
  ppmValues[1] = ppmValues[1]+2;
  ppmValues[2] = ppmValues[2]+3;
  ppmValues[3] = ppmValues[3]+4;
  if(ppmValues[0] >=2000) ppmValues[0] =1000;
  if(ppmValues[1] >=2000) ppmValues[1] =1000;
  if(ppmValues[2] >=2000) ppmValues[2] =1000;
  if(ppmValues[3] >=2000) ppmValues[3] =1000;
  delay(50);
}

观察波形:

相关推荐
飞睿科技7 小时前
【IoT开发选型】乐鑫ESP32-S3核心优势解析:为何它是AIoT应用的“全能王”?
科技·嵌入式硬件·物联网·智能家居
文亭湖畔程序猿9 小时前
开天斧 STC8H8K64U低功耗demo
单片机·嵌入式硬件
ACP广源盛1392462567311 小时前
GSV5100A@ACP#2 进 2 出 HDMI2.0 中继器 / CAT 延长器,带有音频提取和插入功能
单片机·嵌入式硬件·音视频
d111111111d12 小时前
W25Q60简介--SPI通信(笔记)
笔记·stm32·单片机·嵌入式硬件·学习
Hai小易12 小时前
【STM32单片机】智能家居语音控制系统
stm32·单片机·智能家居·嵌入式软件开发·stm32项目设计·智能家居语音控制系统·c语言编程项目
国科安芯15 小时前
模拟DCDC电源芯片ASP3605S引脚功能及控制环路分析
单片机·嵌入式硬件
ACP广源盛1392462567317 小时前
GSV5100B@ACP#一种具有音频提取和插入功能的 2 进 2 出 HDMI2.0 中继器 / CAT 延长器
单片机·嵌入式硬件·音视频
藏,捉17 小时前
使用自己绘制的板子通过485与西门子PLC1214C通讯,控制舵机摇摆运动
单片机·工控·485通讯
kaikaile199517 小时前
基于DSP28335与AD7606的采样程序实现
单片机·嵌入式硬件
Joshua-a17 小时前
STM32嵌入式开发核心:volatile与寄存器操作详解
单片机·嵌入式硬件