当前位置: 首页 > ds >正文

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);
}

观察波形:

http://www.xdnf.cn/news/15188.html

相关文章:

  • Linux指令与权限
  • SQL138 连续两次作答试卷的最大时间窗
  • 【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(六)
  • Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
  • kotlin中集合的用法
  • nmap扫描指定网段中指定开放端口的主机(IP,mac地址)
  • wps怎样正常显示毫秒时间
  • Spring Boot 与 Docker 的完美结合:容器化你的应用
  • 深入理解区块链 | 去中心化架构与密码学保障
  • html的outline: none;
  • 杰赛S65_中星微ZX296716免拆刷机教程解决网络错误和时钟问题
  • 智能体决策机制深度剖析:ReAct、Plan-and-Execute与自适应策略
  • Linux 服务器挖矿病毒深度处理与防护指南
  • 数字孪生技术为UI前端赋能:实现产品设计的快速原型验证
  • SDR(软件定义无线电)与软件定义声学系统详解
  • Idea如何解决包冲突
  • Unreal Engine 自动设置图像
  • Docker高级管理
  • C++面试冲刺笔记1:虚函数的基本工作原理
  • Java项目集成Log4j2全攻略
  • 【深度学习】【入门】Sequential的使用和简单神经网络搭建
  • 一天一道Sql题(day05)
  • 计蒜客T3473丑数、Leetcode2401最长优雅子数组、Leetcode167两数之和、Leetcode581最短无序连续子数组
  • Python Day8
  • 第6章应用题
  • C++内存泄露排查
  • 基于DeepSeek构建的openGauss AI智能优化助手:数据库性能提升新利器
  • 数据分析-名词
  • react16-react19都更新哪些内容?
  • 爬虫-数据解析