這次繼續(xù)填坑,本次我們將介紹PWM功能的使用,實現(xiàn)呼吸燈的功能。那么接下來就直接開始我們的實踐部分。
創(chuàng)建工程
在上篇文章中我是使用基于芯片創(chuàng)建的,我原本想著不通過BSP文件在教程中教大家一步一步的通過Kconfig+CubeMX配置出可以驅(qū)動整個開發(fā)板所有外設(shè)的工程的。在社區(qū)前輩的提醒后才知道通過基于芯片創(chuàng)建工程是沒有辦法Kconfig配置的。因此我在之后的教程中我會基于RT-Thread提供的BSP文件stm32f407_robomaster_c來創(chuàng)建工程鏈接如下
rt-thread/bsp/stm32/stm32f407-robomaster-c at master · RT-Thread/rt-thread (github.com)
但是這個bsp文件暫時還沒有支持板上的所有外設(shè),因此我計劃隨著教程的編寫,我也會幫忙維護這個bsp文件,將我們使用到的外設(shè)增加支持。便于大家后續(xù)使用,也滿足我希望告訴大家Kconfig配置的計劃。下圖是目前bsp文件的外設(shè)支持情況。
下面就正式開始創(chuàng)建工程。
我們這里點擊導(dǎo)入
之后選擇RT-Thread BSP到工作空間中
BSP根目錄選擇從Github下載下來的bsp文件路徑,點擊完成,即可創(chuàng)建工程。
點擊編譯,下載后根據(jù)BSP文件提供規(guī)范,下載后將實現(xiàn)LED燈閃爍的功能。如下圖LED_B閃爍說明工程創(chuàng)建成功。
PWM教程之呼吸燈
CubeMX配置
首先我們來看一下開發(fā)板原理圖,來看看LED引腳連接著哪一個定時器輸出引腳。
通過原理圖我們可以看到是TIM5的1、2、3通道。
接下來我們就在CubeMX中查看相關(guān)引腳的配置。我們需要把TIM5的通道1、2、3設(shè)置為PWM模式,并且勾選Internal Clock。
設(shè)置重載值為65535。這里設(shè)置的原因我會在后面進行頻率計算的時候再說明。
原理講解(計算部分新手可視情況略過)
PWM簡介
PWM即脈沖寬度調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù)。
例如上圖中,矩形脈沖是 stm32 輸出的數(shù)字信號,當這個信號接到外設(shè)上時,效果可以等效為這個正弦波。
一個周期內(nèi)高電平的持續(xù)時間占總周期的比例成為占空比,通過修改占空比,可以改變輸出的等效模擬電壓。例如輸出占空比為 50%,頻率為 10Hz 的脈沖,高電平為 3.3V.則其輸出的模擬效果相當于輸出一個 1.65V 的高電平。此外 PWM 輸出的頻率也會影響最終的 PWM輸出效果,PWM 輸出的頻率越高,最終輸出的“連續(xù)性”越好,越接近模擬信號的效果,頻率低則會增強離散性,最終的輸出效果會有比較強的“突變”感。
脈沖調(diào)制有兩個重要的參數(shù),第一個就是輸出頻率,頻率越高,則模擬的效果越好。第二個就是占空比。占空比就是改變輸出模擬效果的電壓大小。占空比越大則模擬出的電壓越大。
定時器觸發(fā)頻率計算
接下來給大家簡單的講解一下定時器觸發(fā)頻率,以及PWM信號的周期和占空比的計算。
首先是定時器的觸發(fā)頻率,這里我們首先需要查看datasheet,看我們的TIM5是掛載在哪一條總線的。這里我們可以看到他是在APB1上的。
接著我們就要看CubeMX上我們配置的時鐘樹了,在整個時鐘樹的最右端,可以看到 APB1 和 APB2 兩個總線的時鐘頻率設(shè)置,其中 APBx peripheral clocks 為掛載在總線上的定時器以外的外設(shè)提供時鐘源,APBx timer clocks 為掛載在總線上的定時器提供時鐘源。那么這里我們就可以知道TIM5時鐘源頻率為84MHz,時鐘樹的配置在上篇文章有較為詳細的解釋,這里就不重復(fù)了。這里解釋一下前面的倍頻為何是2,這里可以看到STM32F4xx中文參考手冊,我們這里APB1預(yù)分頻器為4,所以定時器時鐘頻率等于APB域的頻率的兩倍,所以倍頻為2
確定時鐘源頻率之后,我們就開始計算定時器觸發(fā)頻率,我們前面設(shè)置TIM5_PSC為0,因此分頻值為1,因為分頻值為 TIMx_PSC 中的分頻值+1(畢竟分頻不可能為0),所以我們進入的84MHz的頻率信號分頻后還是84MHz。
當 TIMx_CNT 的值增長到 TIMx_ARR 中的值后,就會發(fā)生重載,并觸發(fā)中斷信號,相當于使用 TIMx_ARR 中的值又進行了一次分頻。因此產(chǎn)生這個中斷信號的頻率應(yīng)該為84MHz/(ARR+1)(需要加 1 是因為 CNT 是從0開始計數(shù)的)。我們上面設(shè)置的重載值為65535。
因此定時器觸發(fā)頻率為84000000/65536=1281.7Hz,相當于0.78ms會觸發(fā)一次中斷信號。這個中斷信號我們還可以用來做一些比如LED燈定時器亮滅等操作,由于篇幅原因中斷相關(guān)知識這里就不過多的展開了。這里定時器中斷觸發(fā)時間也就是PWM信號周期。
占空比的計算
上文我們講到了PWM一大重要參數(shù)就是占空比,而我們設(shè)置占空比的重要方式就是設(shè)置比較寄存器的值。畢竟我們不能隨便重設(shè)重載值,這樣子PWM周期也會發(fā)生變化。那么比較值是起到怎樣的作用呢?下圖就可以解釋,下圖為遞增計數(shù)模式的示意圖,當定時器以 PWM 模式工作時,會自動將 TIMx_CCRx 的值與 TIMx_CNT(計數(shù)寄存器)中的值做比較,當 TIMx_CNT 中的值小于 TIMx_CCRx 的值時,PWM 輸出引腳輸出高電平,大于時則輸出低電平。
那么我們就可以知道占空比的計算公式為CCRX/ARR*100%,比如重載值為50000,比較寄存器值為25000,那么占空比為50%。
原理部分就到此為止下面就講一下在RT-Thread Studio中的操作。
代碼實踐
首先我們選擇使用PWM設(shè)備驅(qū)動程序
然后我們需要在硬件中選擇使能PWM并且選擇相應(yīng)的定時器與通道,但是我們發(fā)現(xiàn)并沒有我們需要的timer5,這時候我們就需要修改Kconfig文件了。
我們在board/Kconfig中添加如下代碼,這里我們簡單的修改其他PWM配置即可。
之后我們使用Env工具進入工程所在目錄后輸入scons --pyconfig即可進入編輯界面。
這里我們就可以看到我們在Kconfig中添加的外設(shè),點擊使能,保存修改。
之后輸入scons --target=eclipse重新構(gòu)建工程,等號后面的參數(shù)取決于你使用的IDE,比如我原來使用的是Clion那么就輸入scons --target=cmake,RT-Thread Studio是基于eclipse的所以這里選擇scons --target=eclipse
回到RT-Thread Setting可以看到我們增加的外設(shè)了。
關(guān)于基于開發(fā)板工程添加外設(shè)相關(guān)操作大家可以參考這篇文章。
rt-thread/STM32系列外設(shè)驅(qū)動添加指南.md at master · RT-Thread/rt-thread (github.com)
之后我們就可以在main函數(shù)中編寫代碼,實現(xiàn)呼吸燈的功能了。
這里就是簡單的修改了官方的PWM例程代碼,我自己就不過多的說明了,大家可以看看注釋以及官方文檔PWM設(shè)備 (rt-thread.org)
1/*
2*Copyright(c)2006-2021,RT-ThreadDevelopmentTeam
3*
4*SPDX-License-Identifier:Apache-2.0
5*
6*ChangeLogs:
7*DateAuthorNotes
8*2018-11-06SummerGiftfirstversion
9*2021-06-30craztmodifyforrobomasterCboard
10*/
11#include
12#include
13#include
14#definePWM_DEV_NAME"pwm5"/*PWM設(shè)備名稱*/
15#definePWM_DEV_CHANNEL1/*PWM通道*/
16structrt_device_pwm*pwm_dev;/*PWM設(shè)備句柄*/
17intmain(void)
18{
19rt_uint32_tperiod,pulse,dir;
20period=500000;/*周期為0.5ms,單位為納秒ns*/
21dir=1;/*PWM脈沖寬度值的增減方向*/
22pulse=0;/*PWM脈沖寬度值,單位為納秒ns*/
23/*查找設(shè)備*/
24pwm_dev=(structrt_device_pwm*)rt_device_find(PWM_DEV_NAME);
25if(pwm_dev==RT_NULL)
26{
27rt_kprintf("pwmsamplerunfailed!can'tfind%sdevice!
",PWM_DEV_NAME);
28returnRT_ERROR;
29}
30/*設(shè)置PWM周期和脈沖寬度默認值*/
31rt_pwm_set(pwm_dev,PWM_DEV_CHANNEL,period,pulse);
32/*使能設(shè)備*/
33rt_pwm_enable(pwm_dev,PWM_DEV_CHANNEL);
34while(1)
35{
36rt_thread_mdelay(50);
37if(dir)
38{
39pulse+=5000;/*從0值開始每次增加5000ns*/
40}
41else
42{
43pulse-=5000;/*從最大值開始每次減少5000ns*/
44}
45if(pulse>=period/2)/*經(jīng)過測試發(fā)現(xiàn)占空比超過50%后對于亮度的影響較小因此就設(shè)置死區(qū)*/
46{
47dir=0;
48}
49if(0==pulse)
50{
51dir=1;
52}
53/*設(shè)置PWM周期和脈沖寬度*/
54rt_pwm_set(pwm_dev,PWM_DEV_CHANNEL,period,pulse);
55}
56returnRT_EOK;
57}
最終燒錄效果為藍燈進行呼吸燈操作。
后續(xù)有空的話,我會寫一篇小文章擴展教大家PWM進行呼吸燈aRGB調(diào)色,以及蜂鳴器唱歌的。
本次教程就講到這里謝謝大家。
———————End———————
版權(quán)聲明:
本文為RT-Thread論壇用戶「goldengrandpa」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:
https://club.rt-thread.org/ask/article/2240be90085f3b35.html
你可以添加微信:rtthread2020 為好友,注明:公司+姓名,拉進RT-Thread官方微信交流群!
愛我就給我點在看
點擊閱讀原文回看開發(fā)者大會
原文標題:基于RoboMasterC型開發(fā)板的RT-Thread使用分享(二)
文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
RT-Thread
+關(guān)注
關(guān)注
31文章
1261瀏覽量
39837
原文標題:基于RoboMasterC型開發(fā)板的RT-Thread使用分享(二)
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論