嵌入式進階——LED呼吸燈(PWM)

🎬 秋野醬:《個人主頁》
🔥 個人專欄:《Java專欄》《Python專欄》

??心若有所向往,何懼道阻且長

文章目錄

    • PWM基礎概念
    • STC8H芯片
    • PWMA應用
    • PWM配置詳解
    • 占空比

PWM基礎概念

PWM全稱是脈寬調制(Pulse Width Modulation),是一種通過改變信號的脈沖寬度來控制電路輸出的技術。PWM技術在工業自動化、電機控制、LED調光等領域廣泛應用。
PWM是一種將數字信號轉換為模擬信號的技術,它通過改變信號的占空比來控制輸出的電平。在STC8H中,PWM輸出的頻率和占空比可以由程序控制,因此可以用來控制各種電機、燈光和其他設備的亮度、速度等參數。

STC8H芯片

STC8H 系列的單片機內部集成了8 通道 16 位高級PWM 定時器,分成兩周期可不同的 PWM,分別命名為 PWMA 和PWMB ,可分別單獨設置。
第一組 PWMA 可配置成4 組互補/對稱/死區控制的PWM 或捕捉外部信號。
第二組 PWMB 可配置成4 路PWM 輸出或捕捉外部信號。
兩組 PWM 的時鐘頻率可分別獨立設置。
在這里插入圖片描述
PWM與引腳對應關系如下圖:
在這里插入圖片描述

PWMA應用

控制引腳P2.7實現LED燈1的呼吸效果。

  1. 拷貝所需庫文件(其他必備庫請自行準備)
    a. STC8H_PWM.cSTC8H_PWM.h
    b. NVIC.cNVIC.h
    c. Switch.h
  2. 導入頭文件,初始化宏及全局變量
#include "Config.h"
#include "GPIO.h"
#include "Delay.h"
#include "NVIC.h"
#include "Switch.h"
#include "STC8H_PWM.h"#define LED_SW	P45#define LED1		P27
#define LED2		P26
#define LED3		P15#define FREQ		1000#define PERIOD 	((MAIN_Fosc / FREQ) - 1)	// 周期PWMx_Duty dutyA;

配置GPIO

void GPIO_config(void) {GPIO_InitTypeDef	GPIO_InitStructure;		//結構定義// LED_SWGPIO_InitStructure.Pin  = GPIO_Pin_5;		//指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化// P2GPIO_InitStructure.Pin  = GPIO_Pin_6 | GPIO_Pin_7;		//指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P2, &GPIO_InitStructure);//初始化
}

配置PWM

void	PWM_config(void)
{PWMx_InitDefine		PWMx_InitStructure;// 配置PWM4PWMx_InitStructure.PWM_Mode    =	CCMRn_PWM_MODE2;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2PWMx_InitStructure.PWM_Duty    =  0;								//PWM占空比時間, 0~PeriodPWMx_InitStructure.PWM_EnoSelect  = ENO4P | ENO4N;	//輸出通道選擇,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8PPWM_Configuration(PWM4, &PWMx_InitStructure);// 配置PWMAPWMx_InitStructure.PWM_Period   = PERIOD;					//周期時間,   0~65535PWMx_InitStructure.PWM_DeadTime = 0;					//死區發生器設置, 0~255PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主輸出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能計數器, ENABLE,DISABLEPWM_Configuration(PWMA, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB// 切換PWM4選擇PWM4_SW_P26_P27PWM4_SW(PWM4_SW_P26_P27);			//PWM4_SW_P16_P17,PWM4_SW_P26_P27,PWM4_SW_P66_P67,PWM4_SW_P34_P33// 初始化PWMA的中斷NVIC_PWM_Init(PWMA,DISABLE,Priority_0);
}

編寫Main函數


void main() {char direction = 1;u8 duty_percent = 0;// 0 -> 100EAXSFR();		/* 擴展寄存器訪問使能, 必寫! */GPIO_config();PWM_config();EA = 1;// 總開關LED_SW = 0;LED1 = 0; // P2.7 PWM4LED2 = 0;LED3 = 0;// 循環之前,設置一次pwm(可選)dutyA.PWM4_Duty = PERIOD * duty_percent / 100;UpdatePwm(PWM4, &dutyA);// 0 -> 100while(1) {duty_percent += direction;// 讓duty_percent一直在0-100來回往返if(duty_percent >= 100) {duty_percent = 100;direction = -1;} else if(duty_percent <= 0) {duty_percent = 0;direction = 1;}// 修改PWM4的dutydutyA.PWM4_Duty = PERIOD * duty_percent / 100;UpdatePwm(PWM4, &dutyA);delay_ms(10);}
}

PWM配置詳解

周期
系統主頻:1秒鐘計數多少次。
代碼中的PWM周期(PWM Period),指的是按N等份切分1秒鐘,每個等份的計數值。
在這里插入圖片描述
例如上圖,我們按照8等份切分1秒鐘的總計數值MAIN_Fosc(主頻),每個PWM周期的計數值為:
PWM_Period = MAIN_Fosc / 8 = 24M / 8 = 3M = 3 000 000 單位為次。
即如果將這個3M作為Period參數,可以得到PWM方波每個周期的時長為:
1 / 8 = 0.125s

代碼中的配置:

#define PERIOD 	(MAIN_Fosc / FREQ)	// 周期
PWMx_InitStructure.PWM_Period   		= PERIOD - 1;

配置的是周期中的計數值。
我們的理解策略:通常我們不關心計數值,關心的是1秒鐘執行多少次(即頻率Hz),也就是一秒鐘多少個周期。
因此在代碼MAIN_Fosc / 1000中的1000表示的是1秒鐘多少個周期(即頻率Hz)。
MAIN_Fosc / 1000表示的是每個周期的計數值。那為什么要-1呢?因為計數器是從0開始計數的。

占空比

在一個PWM的周期計數中,高電平的計數時長百分比。
在這里插入圖片描述
模式
● 凍結: CCMRn_FREEZE
● 匹配時設置通道 n 的輸出為有效電平: CCMRn_MATCH_VALID
● 匹配時設置通道 n 的輸出為無效電平: CCMRn_MATCH_INVALID
● 翻轉: CCMRn_ROLLOVER
● 強制為無效電平: CCMRn_FORCE_INVALID
● 強制為有效電平: CCMRn_FORCE_VALID
● PWM 模式 1: CCMRn_PWM_MODE1
● PWM 模式 2: CCMRn_PWM_MODE2
常用的為PWM 模式 1PWM 模式 2
PWM 模式 1和PWM 模式 2是反向的,一個占空比越大越亮,一個是越小越亮。
使能PWM

PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主輸出使能, ENABLE,DISABLE
PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能計數器, ENABLE,DISABLE
PWM_Configuration(PWMA, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB

引腳配置

PWM4_SW(PWM4_SW_P26_P27);

使能配置成功后,pwm才能工作。
如果運行中pwm想停止掉,也可以通過配置使能來停止。

EAXSFR擴展寄存器
由于PWM的配置相關特殊功能寄存器位于擴展RAM區域,訪問這些寄存器,需先將P_SW2的BIT7設置為1,才可正常讀寫。

EAXSFR();		/* 擴展寄存器訪問使能 */

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16102.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16102.shtml

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

相關文章

Arduino下載與安裝(Windows 10)

Arduino下載與安裝(Windows 10) 官網 下載安裝 打開官網&#xff0c;點擊SOFTWARE&#xff0c;進入到軟件下載界面&#xff0c;選擇Windows 選擇JUST DOWNLOAD 在彈出的界面中&#xff0c;填入電子郵件地址&#xff0c;勾選Privacy Policy&#xff0c;點擊JUST DOWNLOAD即可 …

深入解析:Element Plus 與 Vite、Nuxt、Laravel 的結合使用

在現代前端開發中&#xff0c;選擇合適的工具和框架來提高開發效率和應用性能是至關重要的。 Element-Plus 是一個基于 Vue.js 3.0 的流行 UI組件庫&#xff0c;它可以與多種前端和后端框架結合使用&#xff0c;如 Vite、Nuxt 和 Laravel。本文將深入探討這三者與 Element Plus…

【腳本篇】---spyglass lint腳本

目錄結構 sg_lint.tcl &#xff08;頂層&#xff09; #1.source env #date set WORK_HOME . set REPORT_PATH ${WORK_HOME}/reports puts [clock format [clock second] -format "%Y-%m-%d %H:%M:%S"] #2.generate source filelist #3.set top module puts "##…

qt-C++筆記之QThread使用

qt-C筆記之QThread使用 ——2024-05-26 下午 code review! 參考博文&#xff1a; qt-C筆記之使用QtConcurrent異步地執行槽函數中的內容&#xff0c;使其不阻塞主界面 qt-C筆記之QThread使用 文章目錄 qt-C筆記之QThread使用一:Qt中幾種多線程方法1.1. 使用 QThread 和 Lambda…

ubuntu server 24.04 網絡 SSH等基礎配置

1 安裝參考上一篇: VMware Workstation 虛擬機安裝 ubuntu 24.04 server 詳細教程 服務器安裝圖形化界面-CSDN博客 2 網絡配置 #安裝 sudo apt install net-tools#查看 ifconfig #修改網絡配置 sudo vim /etc/netplan/50-cloud-init.yaml network:version: 2ethernets:en…

課時136:變量進階_變量實踐_高級賦值

2 變量進階 2.1 變量實踐 2.1.1 高級賦值 學習目標 這一節&#xff0c;我們從 基礎知識、簡單實踐、小結 三個方面來學習 基礎知識 簡介 所謂的高級賦值&#xff0c;是另外的一種變量值獲取方法&#xff0c;這里涉及到更多我們學習之外的一些shell內置變量格式,其實這部分…

飛雞:從小訓練飛行的雞能飛行嗎?為什么野雞能飛嗎?是同一品種嗎?今天自由思考

雞的飛行能力在很大程度上受到其生理結構的限制。盡管雞有翅膀&#xff0c;但與能夠長時間飛行的鳥類相比&#xff0c;雞的翅膀相對較小&#xff0c;且胸部肌肉較弱。再加上雞的身體較重&#xff0c;這些因素共同限制了雞的飛行能力。通常&#xff0c;雞只能進行短暫的、低空的…

【wiki知識庫】01.wiki知識庫前后端項目搭建(SpringBoot+Vue3)

&#x1f4dd;個人主頁&#xff1a;哈__ 期待您的關注 &#x1f33c;環境準備 想要搭建自己的wiki知識庫&#xff0c;要提前搭建好自己的開發環境&#xff0c;后端我使用的是SpringBoot&#xff0c;前端使用的是Vue3&#xff0c;采用前后端分離的技術實現。同時使用了Mysql數…

C++ vector,dequeu,list容器中元素的引用失效問題

文章目錄 一、std::list不會產生引用失效問題二、std::vector中元素引用失效問題三、std::deque中元素引用失效問題 一、std::list不會產生引用失效問題 在C中&#xff0c;std::list&#xff08;雙向鏈表&#xff09;提供了一種非常靈活的容器類型&#xff0c;其設計使其在插入…

微信小程序的事件對象屬性,事件綁定

微信小程序 小程序簡介 1 小程序與普通網頁開發的區別&#xff1f; 1運行環境的不同&#xff1a;網頁運行在瀏覽器&#xff0c;小程序運行在微信環境&#xff1b; 2.API 不同&#xff1a;小程序無法調用 DOM 和 BOM 的 API&#xff0c;但可以調用微信環境提供的 API&#xff1…

單工無線發射接收系統

1 緒論 隨著無線電技術的發展,通訊方式也從傳統的有線通訊逐漸轉向無線通訊。由于傳統的有線傳輸系統有配線的問題,較不便利,而無線通訊具有成本廉價、建設工程周期短、適應性好、擴展性好、設備維護容易實現等特點,故未來通訊方式將向無線傳輸系統方向發展。同時,實現系…

mfc140.dll丟失原因和mfc140.dll丟失修復辦法分享

mfc140.dll是與微軟基礎類庫&#xff08;Microsoft Foundation Classes, MFC&#xff09;緊密相關的動態鏈接庫&#xff08;DLL&#xff09;文件。MFC是微軟為C開發者設計的一個應用程序框架&#xff0c;用于簡化Windows應用程序的開發工作。以下是mfc140.dll文件的一些關鍵屬性…

棧的實現(C語言)

文章目錄 前言1.棧的概念及結構2.棧的實現3.具體操作3.1.初始化棧(StackInit)和銷毀棧(StackDestory)3.2.入棧(StackPush)和出棧(StackPop)3.3.獲得棧的個數(StackSize)、獲得棧頂元素(StackTop)以及判空(StackEmpty) 前言 前段時間我們學習過了鏈表和順序表等相關操作&#x…

go-zero 實戰(4)

中間件 在 userapi 項目中引入中間件。go項目中的中間可以處理請求之前和之后的邏輯。 1. 在 userapi/internal目錄先創建 middlewares目錄&#xff0c;并創建 user.go文件 package middlewaresimport ("github.com/zeromicro/go-zero/core/logx""net/http&q…

經濟寒冬下的黃金跳板:方案、活動、競標一手掌握

推薦策劃人必備的寶藏地產策劃資源平臺&#xff0c; 訂閱浩叫&#xff1a;地產營銷策劃圈。這個平臺簡直是地產策劃人的百寶箱&#xff0c;里面藏著無數的策劃秘籍&#xff0c;等著你來挖掘。 這個平臺就像是一個大型的方案庫&#xff0c;里面收錄了眾多知名地產企業的內部資料…

leetcode:計數質數

class Solution { public:// 如果 x 是質數&#xff0c;那么大于 x 的 x 的倍數 2x,3x… 一定不是質數int countPrimes(int n) {vector<int> isPrime(n, 1);int ans 0;for (int i 2; i < n; i) {if (isPrime[i]) {ans 1;if ((long long)i * i < n) {for (int j …

leetcode-55 跳躍游戲

leetcode Problem: 55. 跳躍游戲 思路 假設我們是一個小人&#xff0c;從第一個下標開始&#xff0c;每次經過一個位置&#xff0c;我們就可以根據當前位置的數值nums[i]和位置下標i計算出該位置所能到達的后續位置的最大值rnums[i]i。而這個r之前的區域一定都是可以經過的。…

AI 談“潯川AI翻譯機”

在天工AI&#xff0c;天工AI在全網搜索“潯川AI翻譯機”。 1 創作助手談“潯川AI翻譯機”&#xff1a; “潯川AI翻譯機”是一個利用人工智能技術進行語言翻譯的設備或應用程序。它可以將一種語言的文字或口語翻譯成另一種語言&#xff0c;以實現不同語言之間的溝通和理解。潯…

08. Redis 緩存穿透和雪崩

文章目錄 1. 緩存穿透&#xff08;查不到導致的&#xff09;1.1 概念1.2 解決方案布隆過濾器緩存空對象 2. 緩存擊穿&#xff08;量太大、緩存過期&#xff09;2.1 概念2.2 解決方案設置熱點數據永不過期加互斥鎖 3. 緩存雪崩&#xff08;緩存集體失效或 Redis 宕機&#xff09…