RT-Thread是什麼 在文章開始前,作者先來簡單介紹一下這款由中國開源社區所推出的一款嵌入式實時操作系統(RTOS),顧名思義,這是一款用于嵌入式設備的操作系統,它十分小巧方便,并且對國内外諸多開發闆都有底層硬件的支持,方便初學者學習使用。而對于有開發能力的開發者來說,RT-Thread幾乎支持所有主流微控制器,可以方便的進行移植開發(RT-Thread實時操作系統遵循Apache許可2.0),而且RT-Thread不僅僅隻有這些,它方便的組件與軟件包也實現了開發者們之間的開源共享,而RT-Thread特有的配置器也是将這一點展現的淋漓盡緻。
RT-Thread嵌入式操作系統
本文所使用的開發平台是STM32F103與RT-Thread,所以如要運行本文的例程,請先查找RT-thread的Github項目中是否有您所使用的開發闆的bsp,并将其下載到您的電腦上再進行編譯測試,本文的編譯環境為Keil5.
pwm概述 我們即将創建一個會變換顔色的呼吸燈的程序,在編寫程序之前作者先稍微講解一下什麼是PWM。
PWM的全稱是Pulse Width Modulation,翻譯過來就是脈沖寬度調制。
原理示意圖
以上就是pwm的原理示意圖。在T1這個時間段中屬于高電平輸出,在T2這個時間段中屬于底電平輸出。高電平在整個周期(T1 T2)中所占時間的比例就是占空比,通過對占空比的控制我們可以輸出一段幅值相等的脈沖。
PWM控制亮度的原理
我們平時調節手機屏幕和燈的亮暗就是靠pwm的原理來進行控制的,通過對占空比的控制我們可以讓led燈進行快速的閃爍,這個閃爍因為過快導緻我們的肉眼根本無法識别出來,在不停的閃爍中如果滅的持續時間長那麼我們就會覺得屏幕變暗了,如果亮的時間長我們就會覺得屏幕變亮了。
編程思路 首先貼上本次要使用的RT-Thread庫函數(本文不是标準的stm32庫函數編譯):
rt_device_find() rt_pwm_set() rt_pwm_enable() rt_pwm_disable()
函數描述
通過不停對占空比進行有序的改變可以讓燈的亮度由暗變亮再讓燈由亮變暗,有兩種方法可以完成這種操作,一個是使用for或者while循環,一個就是使用數組,在接下來的實例中我們是使用數組進行有序控制的。
代碼 首先在這兒聲明一下,這裡使用的開發闆以低電平輸出亮,高電平輸出暗,開發闆中關于led的原理圖如下:
LED
當您想要編譯測試本例程時,請先查找您購買的開發闆中關于LED燈的原理圖,并對例程中的引腳定義進行更換。
#include rtthread.h #include rtdevice.h #include board.h #define pwm "pwm3" int jun[300];//聲明數組 int a=0; /* 将占空比的值賦給數組 */ void pwm_sat8(){ for(int i=100000;ii=i-1000){ jun[a]=i; a ; } for(int i=0;ii=i 1000){ jun[a]=i; a ; } a=0; struct rt_device_pwm *pwm_dev;//設備句柄 pwm_dev = (struct rt_device_pwm *)rt_device_find(pwm);//查找設備 /* 完成紅、綠、藍亮度的依次變化 */ while(1){ for(a=0;aa ){ rt_pwm_set(pwm_dev,2,100000,jun[a]); rt_pwm_enable(pwm_dev,2); rt_thread_mdelay(20); } for(a=0;aa ){ rt_pwm_set(pwm_dev,3,100000,jun[a]); rt_pwm_enable(pwm_dev,3); rt_thread_mdelay(20); } for(a=0;aa ){ rt_pwm_set(pwm_dev,4,100000,jun[a]); rt_pwm_enable(pwm_dev,4); rt_thread_mdelay(20); } } } MSH_CMD_EXPORT(pwm_sat8, this is a pwm)
首先,我們定義了一個名字為jun,大小為300的數組。
我們在這裡設置的周期是100000納秒(也就是0.1ms),因為亮度的大小範圍是0%——100%,所以我們将占空比從100000,每次以減1000的方式賦值給數組,再從0,以每次加1000的方式賦值給數組,這樣子我們就得到了{100000,99000,98000…98000,99000,100000}的數組。
接着使用rt_device_find()獲取設備句柄,在獲取設備句柄之前我們可以看到有這麼一行代碼:
struct rt_device_pwm *pwm_dev;
這行代碼我們先創建了一個結構體,并給這個結構體設置了一個指針。
因為rt_device_find()返回的是一個句柄所以我們要先強制類型轉換,然後才能把返回的句柄賦給指針。
while(1){ for(a=0;aa ){ rt_pwm_set(pwm_dev,2,100000,jun[a]); rt_pwm_enable(pwm_dev,2); rt_thread_mdelay(20); } for(a=0;aa ){ rt_pwm_set(pwm_dev,3,100000,jun[a]); rt_pwm_enable(pwm_dev,3); rt_thread_mdelay(20); } for(a=0;aa ){ rt_pwm_set(pwm_dev,4,100000,jun[a]); rt_pwm_enable(pwm_dev,4); rt_thread_mdelay(20); } } }
以上代碼就是實現交替變換顔色并且安照順序調節亮度的代碼。我們抽取第一段分析一下:
代碼
通過rt_pwm_set()可以設置我們需要使用的pwm設備和需要使用的通道(不理解什麼是RGB通道?看看我剛發的led原理圖),然後設置周期為100000,最後設置占空比,在上文中我們已經講過我們是使用數組進行占空比設置的,所以設置為jun[a],通過for循環中的判斷和更新變量來完成占空比從100000到0再從0到100000的變化。
在設置pwm設備後我們要使能pwm設備,最後加上延時函數rt_thread_mdelay(),這裡我們設置延時為0.02毫秒。
*注意 因為作者這次使用的開發闆是以低電平為輸出led亮的,所以當你使用env工具配置好pwm設備後它會默認亮起來,為了解決這個問題我們可以在mian()函數中編寫如下代碼:
代碼
這樣子我們就能在系統運行開始的時候把它給關閉了。
分享到這就結束了哦~
本文的PWM應用示例分享就到這裡為止了,感興趣的讀者可以關注作者哦。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!