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.pswp.cn/diannao/91131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91131.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 pytest 測試框架構建自動化測試套件之一

pytest 是一個非常靈活且強大的測試框架&#xff0c;它支持簡單的單元測試到復雜的功能測試。顯著特點是其簡潔的語法&#xff0c;可以無需繼承 TestCase 類直接使用函數來編寫測試用例&#xff0c;并通過 assert語句 進行斷言。還支持參數化測試、豐富的插件系統。 pytest自動…

nacos docker 配置

docker.io/nacos 項目中國可用鏡像列表 | 高速可靠的 Docker 鏡像資源 1、Docker 拉取鏡像 docker pull nacos/nacos-server:v2.1.0 2、創建宿主機掛載目錄 mkdir -p /mydata/nacos/logs/ mkdir -p /mydata/nacos/conf/ AI寫代碼 3、啟動nacos并復制文件到宿主機&#xff0…

Django 模板(Template)

1. 模板簡介 作為 Web 開發框架,Django 提供了模板,可以很便利的動態生成 HTML。模版系統致力于表達外觀,而不是程序邏輯。 模板的設計實現了業務邏輯(view)與顯示內容(template)的分離,一個視圖可以使用任意一個模板,一個模板可以供多個視圖使用。 模板包含: HTM…

Word 文字編輯狀態下按回車換行后是非正文格式

在Word里編輯時&#xff0c;按回車后新段落突然變成標題1、標題2這類格式&#xff0c;不再是正文樣式&#xff0c;這通常是因為「正文」的樣式設置出了問題——可能被默認設置成“后續段落自動應用標題1/標題2格式”了。 修改方法很簡單&#xff1a; 找到并打開「正文」樣式的修…

PySide6 UI 靈活性:QToolBar 的浮動與停靠及 QSplitter 的可調整面板

PySide6 UI 靈活性&#xff1a;QToolBar 的浮動與停靠及 QSplitter 的可調整面板 在現代桌面應用程序開發中&#xff0c;提供靈活且用戶友好的界面至關重要。PySide6&#xff08;Qt for Python&#xff09;提供了強大的工具來構建這樣的界面。本文將深入探討兩個關鍵的 PySide6…

B4016 樹的直徑

B4016 樹的直徑 - 洛谷 題目描述 給定一棵 n 個結點的樹&#xff0c;樹沒有邊權。請求出樹的直徑是多少&#xff0c;即樹上最長的不重復經過一個點的路徑長度是多少。 輸入格式 第一行輸入一個正整數 n&#xff0c;表示結點個數。 第二行開始&#xff0c;往下一共 n - 1 行…

【一維 前綴和+差分】

一、一維前綴和 1.1 定義 給定一個數組 a[1..n]&#xff0c;其前綴和數組 pre[1..n] 定義為&#xff1a; pre[i]a[1]a[2]?a[i] pre[i] a[1] a[2] \dots a[i] pre[i]a[1]a[2]?a[i] 即 pre[i] 表示原數組從第 1 項到第 i 項的和。 1.2 構建 int a[N], pre[N]; for (int i …

Spring Boot 雙數據源配置

文章目錄什么是雙數據源&#xff1f;為什么需要雙數據源&#xff1f;核心實現原理完整示例注意什么是雙數據源&#xff1f; 雙數據源是指在一個應用程序中同時配置和使用兩個不同的數據庫連接。比如&#xff1a; 一個連接訂單數據庫&#xff0c;處理業務數據一個連接用戶中心…

【Java】【力扣】102.二叉樹層序遍歷

思路一個輔助隊列&#xff08;初始化隊列&#xff1a;根節點入隊&#xff09;一個節點 出隊&#xff0c;他的左右孩子入隊循環 直到隊列為空舉例代碼public List<List<Integer>> levelOrder(TreeNode root) {if (rootnull){return new ArrayList<List<Intege…

為什么有些PDF無法復制文字?原理分析與解決方案

在日常辦公和學習中&#xff0c;我們經常會從PDF文件中復制文字&#xff0c;用于編輯、引用、整理筆記。但你是否也遇到過這樣的情況&#xff1a;有些PDF中的文字根本無法選中&#xff0c;更無法復制粘貼&#xff1f; 看起來像是“文字”&#xff0c;但操作上卻完全無效——這…

LabVIEW瀏覽器ActiveX事件交互

?程序圍繞 WebBrowser ActiveX 控件&#xff0c;借 “Reg Event Callback” 注冊標題變更回調&#xff0c;“Callback - Title Change.vi” 處理標題數據&#xff0c;“Monitor...” 響應 URL 變更&#xff0c;“Unregister...” 清理資源&#xff0c;實現瀏覽器事件交互與管控…

C++后端面試八股文

一、C 語言基礎與底層原理請解釋 new / delete 和 malloc / free 的區別和聯系&#xff0c;以及使用它們時需要注意什么new 和 delete 是C的??運算符&#xff08;Operator&#xff09;??。這意味著它們可以被類&#xff08;通過 operator new 和 operator delete&#xff0…

基礎分類模型及回歸簡介(一)

一、先搞懂兩個核心任務&#xff1a;分類和回歸咱們生活中總遇到要 “判斷” 或 “預測” 的事&#xff1a;比如看到一個水果&#xff0c;判斷是蘋果還是橘子 —— 這就是分類&#xff08;結果是 “類別”&#xff09;&#xff1b;比如根據西瓜的大小、顏色&#xff0c;猜它能賣…

【LeetCode 熱題 100】114. 二叉樹展開為鏈表——(解法二)分治

Problem: 114. 二叉樹展開為鏈表 給你二叉樹的根結點 root &#xff0c;請你將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該同樣使用 TreeNode &#xff0c;其中 right 子指針指向鏈表中下一個結點&#xff0c;而左子指針始終為 null 。 展開后的單鏈表應該與二叉樹 先序…

【WPF】WPF 自定義控件 實戰詳解,含命令實現

&#x1f9e9;《WPF 自定義控件》實戰詳解本文將圍繞如何編寫一個自定義控件&#xff08;如帶右鍵菜單的圖片控件 ImageView&#xff09;&#xff0c;逐步講解其定義、命令綁定與 ContextMenu 中常見的語法技巧。&#x1f9f1; 一、創建一個 WPF 自定義控件的步驟 WPF 中自定義…

Flink 2.0 DataStream算子全景

在實時流處理中&#xff0c;Apache Flink的DataStream API算子是構建流處理 pipeline 的基礎單元。本文基于Flink 2.0&#xff0c;聚焦算子的核心概念、分類及高級特性。 一、算子核心概念&#xff1a;流處理的"原子操作 1. 數據流拓撲&#xff08;Stream Topology&#x…

Flask 入門到實戰(2):使用 SQLAlchemy 打造可持久化的數據層

Flask 入門到實戰&#xff1a;使用 SQLAlchemy 打造可持久化的數據層一、前言&#xff1a;為什么用 Flask-SQLAlchemy&#xff1f; 在 Python Web 開發中&#xff0c;操作數據庫的方式主要有兩種&#xff1a; 直接寫 SQL&#xff08;繁瑣且難維護&#xff09;使用 ORM&#xff…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | GithubProfies(GitHub 個人資料)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— GithubProfies組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup…

simscape中坐標系和坐標變換Frames and Transforms

為了更便捷地描述單個物體的運動&#xff0c;最好以該物體的質心為坐標原點建立坐標系&#xff0c;從而可以非常方便地描述其旋轉運動。因此&#xff0c;在計算多個物體之間的位置關系時&#xff0c;為了計算方便&#xff0c;需要頻繁地更換坐標框架&#xff0c;這也是multibod…

構建分布式光伏“四可”能力:支撐新型電力系統安全穩定運行的關鍵路徑

隨著我國新能源裝機規模的跨越式增長&#xff0c;國家能源戰略對新能源電站的規范化接入與精細化調度管理提出了更高要求。在電力市場化改革深化與新型電力系統構建的關鍵時期&#xff0c;保障電網安全穩定、提升新能源高效消納能力已成為核心議題。國家能源局于2025年1月17日正…