序言
本人一枚軟件編程人員,有一定C語言基礎(chǔ),目前自學(xué)STM32單片機,寫下此篇一鞏固所學(xué)二交流分享。
按照慣例,先介紹理論再實戰(zhàn)上手,穿插習(xí)題,最后給出我的愚見。
SG90屬于一種舵機,最適合小白入門,可直接由單片機驅(qū)動。另外,單片機中給我們封裝了很多東西,所以有些地方,讀者只要記住就好,不理解的地方,不要尋根究底,你就默認(rèn)單片機底層給你實現(xiàn)了某項功能就好,不用在意其實現(xiàn)基礎(chǔ)細(xì)節(jié)原理。
這篇理論講的很淺顯,是為了讓大家容易看懂。
一、基礎(chǔ)理論
1.1 舵機控制原理–PWM
舵機一般可以再0-180度或0-360度轉(zhuǎn)動任意角度,經(jīng)常用于小車小船轉(zhuǎn)向控制和機械臂的關(guān)節(jié)等。舵機的轉(zhuǎn)動角度范圍不是固定的,請購買時問問商家,到底是哪個范圍的。實際使用中,我們對舵機有兩個基本需求:
- 舵機轉(zhuǎn)動一定角度。
- 舵機轉(zhuǎn)動時,控制者要求舵機轉(zhuǎn)到一個新的角度。
機器如何給舵機發(fā)送其轉(zhuǎn)動角度呢?首先,要低成本,信號線要少。其次,要滿足任意角度和中途打斷。設(shè)計者推出了一個簡單的方法:用一個時長為20ms的信號去控制舵機,信號的前一段為高電平,持續(xù)時間0.5ms到2.5ms,代表轉(zhuǎn)動角度0-180或者360度,后半段為低電平,這就是PWM信號,具體如下圖:
容易看出來,PWM信號利用前段為高電平持續(xù)時間控制旋轉(zhuǎn)角度,本質(zhì)用占空比控制了旋轉(zhuǎn)角度。
運轉(zhuǎn)時,舵機轉(zhuǎn)到你指定的角度需要一定的時間,轉(zhuǎn)動的角度越大,需要的時間越久,所以你可能需要等待一定的時間。如果你剛剛給舵機發(fā)送指令轉(zhuǎn)到180度,緊接著又發(fā)送指令轉(zhuǎn)到90度,舵機會不轉(zhuǎn)到180度再轉(zhuǎn)到90度,而是在接受到信號時直接在當(dāng)前的角度直接轉(zhuǎn)到90度去。
習(xí)題
習(xí)題110. 如果2.5ms為90度,那么36度的PWM信號是高電平時間長度是?
習(xí)題111. 為什么是PWM控制舵機,有沒有其他的方法?
習(xí)題112. PWM信號屬于串行還是并行通信?全工還是單工?為什么要這么設(shè)計?
習(xí)題113. PWM信號長度為20ms,為什么一般只用前2.5ms?
1.2 定時器
為什么要講解定時器,要用它去產(chǎn)生PWM信號。
1.2.1 基礎(chǔ)定時器
定時器,顧名思義,按照定下鬧鐘到了某個時刻做某件事情。比如,你定下鬧鐘早上6點起床跑步,或者每隔半個小時喝一次水。你也可以給機器制作一個鬧鐘,每隔半秒二極管發(fā)光或者熄滅,或者每隔4秒燈亮起來再過4秒燈熄滅。
為了達(dá)成“每隔4秒二極管亮起來再過4秒二極管熄滅”,咱們構(gòu)造一套定時器系統(tǒng),它也許很奇怪,設(shè)計的有些復(fù)雜,但是還請你壓制疑問,跟我一起把它造出來。
- 咱們構(gòu)造一個時鐘裝置,每過20ms,它響一次,也就是它將1秒切成50份,每份長20ms。(為什么要造這么一個時鐘呢,這是因為單片機的時鐘就是這種時鐘,將1秒切成n份)
- 為了能夠?qū)崿F(xiàn)間隔4秒,咱們再做一個循環(huán)計數(shù)裝置:每當(dāng)時鐘響1次,它的數(shù)值加一,但是智商有限,只知道0-199,到了199后再加一,數(shù)值歸為0。
- 最后做一個開關(guān)裝置,當(dāng)計數(shù)裝置數(shù)字為199時開關(guān)就反轉(zhuǎn)一次,燈亮或者熄滅。
動畫效果如下:
在上述的過程中,我們就利用制作了一個套裝置,其中時鐘是現(xiàn)實世界的時間源,循環(huán)計數(shù)裝置提供實際需要的循環(huán)固定間隔,它們兩個組成一個完整的簡陋定時器,與單片機的基礎(chǔ)定時器基本功能一致,下面正式介紹他們。
時鐘裝置
時鐘裝置
:一般是STM32單片機的系統(tǒng)時鐘,用變量sys_tck表示,頻率72MHz,即將1秒分為7200萬份,顯然太細(xì),頻率太高了,需要降低頻率,將原來的頻率切分為原來的n分之一,即
72
,
000
,
000
n
\frac{72,000,000}{n}
n72,000,000?,術(shù)語叫做分頻。如果采用720分頻,即將原來72M頻率除以720,即0.1MHz,每份約0.01ms。STM32單片機允許的最大分頻數(shù)為65536,其為uint16類型數(shù)字,這個分頻數(shù)其實是一個寄存器。
循環(huán)計數(shù)器
循環(huán)計數(shù)器
:由一些寄存器構(gòu)成。最重要的兩個:
- 計數(shù)寄存器CK_CNT,可以存儲一個uint16數(shù)字,時鐘前進(jìn)一下,其數(shù)值自動加一或減一。
- 自動重載寄存器ARR,當(dāng)CK_CNT大于ARR時,CK_CNT會自動變化,重新循環(huán)計數(shù)。如果你會設(shè)置中斷的話,當(dāng)CK_CNT>ARR時,會觸發(fā)一個中斷。
循環(huán)計數(shù)器有三種模式:
模式名 | 解釋 | 圖像表示 |
---|---|---|
向上計數(shù) | 計數(shù)是自動加一,CK_CNT從0增長到ARR | ![]() |
向下計數(shù) | 計數(shù)是自動減一,CK_CNT從ARR減小到0 | ![]() |
中心對齊 | 計數(shù)是先自動加一,再自動減一,CK_CNT先從0加到ARR然后再減到0 | ![]() |
1.2.2 比較定時器
只有基礎(chǔ)時鐘是無法產(chǎn)生PWM信號的,因為它只能提供循環(huán)固定間隔,不能將間隔分為前半段和后半段,進(jìn)而產(chǎn)生PWM。為了做到這點,需要給循環(huán)計數(shù)器加一個比較數(shù)字CCR,當(dāng)計數(shù)器的值更新時,與CCR比較,并對外輸出比較的結(jié)果,以方便做其他動作。
接上面燈泡明亮的例子,我們改成燈泡在一秒亮三秒滅的模式。我們只需要在上述提到的理想裝置中再加一個比較數(shù)字就好:
CCR在STM32中是叫做比較寄存器,是循環(huán)計數(shù)器的第三個重要的寄存器。是STM32高級定時器才有的功能。
習(xí)題
習(xí)題121. 定時器的時鐘裝置,循環(huán)計數(shù)器各發(fā)揮了什么作用,請談?wù)勀睦斫猓?br> 習(xí)題122. 循環(huán)計數(shù)器有哪些重要參數(shù)要設(shè)置?
習(xí)題123. STM32時鐘頻率為72MHz,分頻數(shù)為uint16,CK_CNT為uint16,則最大循環(huán)時間間隔為多久時間?最小呢?
習(xí)題124. 如果要產(chǎn)生一個旋轉(zhuǎn)360度的PWM信號,請設(shè)置時鐘裝置和循環(huán)計數(shù)器的寄存器值?
二、實戰(zhàn)上手
STM32已經(jīng)為我們在硬件上封裝好了上述的提到的:時鐘裝置、循環(huán)計數(shù)器和對外輸出裝置,以及計數(shù)器的自動比較等功能,你我現(xiàn)階段無需關(guān)心其細(xì)節(jié)。我們只需要對這些東西進(jìn)行相關(guān)設(shè)置和接線就好。
2.1 設(shè)置定時器和單片機接線
習(xí)題
習(xí)題211: 為什么Counter Period是這里為1999,而不是2000?
2.2 代碼
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
TIM1->CCR1=50;
HAL_Delay(1000);
TIM1->CCR1=150;
HAL_Delay(1000);
}
/* USER CODE END 3 */
}
三、習(xí)題答案
習(xí)題110. 如果2.5ms為90度,那么36度的PWM信號是高電平時間長度是?
- PWM信號最短0.5ms(對應(yīng)0度),最長2.5ms(對應(yīng)90度),所以:(2.5 - 0.5) / 90 * 36 + 0.5 = 1.3ms。
習(xí)題111. 為什么是PWM控制舵機,有沒有其他的方法?
- PWM將用時間長度表示轉(zhuǎn)動角度,在硬件支持的情況下,該協(xié)議能夠滿足不同精度的細(xì)分轉(zhuǎn)動角度。只用了一根導(dǎo)線來傳輸信號,相對價格便宜,好用。
- 可能有。
習(xí)題112. PWM信號屬于串行還是并行通信?全工還是單工?為什么要這么設(shè)計?
- 一根導(dǎo)線,所以是串行。舵機是信息接收端,不會發(fā)信息給另一端,所以是單工。
- 很顯然,一根導(dǎo)線很便宜,PWM機制很可靠,執(zhí)行端不用發(fā)信息給信號源端。
習(xí)題113. PWM信號長度為20ms,為什么一般只用前2.5ms?
- 2.5ms為20ms的八分之一,利用率確實不高,我不知道確切原因。我的猜想是:空余出來的17.5ms,足夠讓執(zhí)行端區(qū)分出線路上的雜音信號,并準(zhǔn)備好接收下一次的pwm信號。
習(xí)題121. 定時器的時鐘裝置,循環(huán)計數(shù)器各發(fā)揮了什么作用,請談?wù)勀睦斫猓?/p>
- 定時器一般會循環(huán)執(zhí)行某一操作。時鐘裝置提供了現(xiàn)實世界中的時間粒度,循環(huán)計數(shù)器記錄一次循環(huán)中已經(jīng)流失的時間以方便在特定的時刻,執(zhí)行特定的操作。
習(xí)題122. 循環(huán)計數(shù)器有哪些重要參數(shù)要設(shè)置?
- 循環(huán)周期長度,即一個輪回的長度。
習(xí)題123. STM32時鐘頻率為72MHz,分頻數(shù)為uint16,CK_CNT為uint16,則最大循環(huán)時間間隔為多久時間?最小呢?文章來源:http://www.zghlxwxcb.cn/news/detail-409206.html
- uint16的值為0~65536,則分頻后的時鐘頻率為 72 65536 \frac{72}{65536} 6553672? ~ 72 MHZ,即時鐘間隔范圍為1.38e-07~0.00910秒。
- CK_CNT為uint16,則ARR為1~65536。
- 最小循環(huán)時間間隔為1.38e-07s x 1 = 1.38e-07s。最小循環(huán)時間間隔為65536s*0.00910 = 596.3776s。
習(xí)題124. 如果要產(chǎn)生一個旋轉(zhuǎn)360度的PWM信號,請設(shè)置時鐘裝置和循環(huán)計數(shù)器的寄存器值?文章來源地址http://www.zghlxwxcb.cn/news/detail-409206.html
- 360度對應(yīng)時間為2.5ms,
到了這里,關(guān)于小白入門STM32(2)---控制SG90舵機---基礎(chǔ)工作原理詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!