前言: STM32定時(shí)器輸入捕獲簡(jiǎn)介
STM32的輸入捕獲可以用于捕獲脈寬, 測(cè)量時(shí)間 . 例如超聲波測(cè)距模塊就是需要用輸入捕獲功能, 通過(guò)測(cè)量輸入脈沖的高電平脈寬 , 從而計(jì)算出測(cè)量物體的距離 ;
定時(shí)器PWM工作模式上篇博客講過(guò)了, 上篇是輸出PWM, 本篇是要輸入, 即外面的信號(hào)送給單片機(jī)的引腳, 然后單片機(jī)測(cè)量出脈寬 ;
注: 下面根據(jù)正點(diǎn)原子的標(biāo)準(zhǔn)庫(kù)函數(shù)教程分析, 并用CubeMX完成配置以及HAL庫(kù)函數(shù)編程
如圖所示 : 以測(cè)量高電平脈寬為例, 我們先設(shè)置定時(shí)器通道為上升沿捕獲, 到1的時(shí)候觸發(fā)定時(shí)器計(jì)數(shù), 然后立刻設(shè)置為下降沿捕獲, 到2的時(shí)候就捕獲到下降沿, 再記錄輸入捕獲寄存器的值, 兩個(gè)時(shí)間差就是高電平時(shí)長(zhǎng)tH;
需要注意的是, 在tH這段高電平時(shí)間內(nèi), 是由很多個(gè)向上計(jì)數(shù)的脈沖來(lái)計(jì)數(shù)的。在這里面計(jì)數(shù)可能溢出N多次; 下面是原子的庫(kù)函數(shù)指南pdf里面講解的圖
在tH這段高電平里面, 可能有多個(gè)向上計(jì)數(shù)的脈沖, 而那個(gè)三角向上計(jì)數(shù)脈沖也可能溢出多次。就是利用這N多個(gè)向上計(jì)數(shù)的脈沖來(lái)計(jì)算tH的值的。??ARR的值是我們自己設(shè)定的,所以可以知道溢出一次是多長(zhǎng)時(shí)間, 每溢出一次, 都給溢出次數(shù)加一。 溢出次數(shù)以及檢測(cè)高低電平的數(shù)據(jù)記錄在自己設(shè)定的一個(gè)變量里面
N*ARR + CCRx2即為CNT計(jì)數(shù)次數(shù), 從而就可以算出計(jì)數(shù)時(shí)間, 算出高電平時(shí)長(zhǎng)
N: 溢出次數(shù)??ARR: 溢出一次的時(shí)間?? 在一個(gè)tH內(nèi),溢出的次數(shù)不一定正好是整數(shù), 所以用記錄下CCRx2的值, 用以補(bǔ)充, 這樣tH的值就更精確了
這是一個(gè)八位的變量,可以將其看做8位寄存器,不同的位儲(chǔ)存不同的數(shù)據(jù)
5.1 操作簡(jiǎn)介
?? 通過(guò)信號(hào)發(fā)生器給單片機(jī)對(duì)應(yīng)引腳輸入一個(gè)給定頻率和占空比的矩形波信號(hào), 單片機(jī)通過(guò)輸入捕獲測(cè)量出高電平時(shí)長(zhǎng); 通過(guò)串口發(fā)送至PC端的串口調(diào)試助手查看測(cè)量的脈寬是否準(zhǔn)確
5.2 STM32CubeMX配置初始化+IAR編程
Step1 : Cube配置
(1) 新建工程
? RCC和SYS配置, 時(shí)鐘樹(shù)配置都同前面一樣; 還要用串口打印數(shù)據(jù), 測(cè)試用。
RCC和SYS配置
USART1串口1配置(按照串口那一篇配置串口即可–>串口通信 )
注: 詳細(xì)解釋轉(zhuǎn)至串口通信
時(shí)鐘樹(shù)配置
(2)TIM5參數(shù)配置
使用TIM5的通道一(TIM5_CH1)接收外部輸入的信號(hào)。配置如下
注: 上一篇介紹了如何計(jì)算定時(shí)器溢出時(shí)間,這里溢出時(shí)間為1us??點(diǎn)擊查看—>定時(shí)器中斷及定時(shí)器產(chǎn)生PWM
使能TIM5中斷(要在中斷里面計(jì)數(shù)高電平脈寬)
NVIC設(shè)置(同樣可以查看上一篇看詳細(xì)講解NVIC配置以及中斷分組詳解)
(3) 工程配置(Project Manager)
注 : 高級(jí)設(shè)置默認(rèn)即可
(4) 生成代碼(Generate Code)
Step2 : Keil/IAR編程
(1)重定向printf函數(shù)(重定向之后我們才可以使用printf函數(shù)將調(diào)試信息打印到串口調(diào)試助手) 下面是串口通信那一篇博客寫(xiě)的話,直接搬到這里:
在學(xué)習(xí)C語(yǔ)言的時(shí)候, 大家肯定都用過(guò)printf這個(gè)函數(shù), printf可以將指定字符打印到電腦的顯示器上;
但是, 單片機(jī)要使用這個(gè)就要把他打印的方向改一下, 不是打印在電腦的命令行中, 而是打印到串口里面,傳輸?shù)酱谡{(diào)試助手. 因此我們需要重定向printf函數(shù);
重定向后我們要將調(diào)試信息打印到USART1中, 需要對(duì)printf所依賴(lài)的打印函數(shù)fputc()重定向 .
在usart.c里面添加重定向代碼
以后這段代碼直接抄就好了, copy下來(lái)用
/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__*/
// 重定向C語(yǔ)言中的printf函數(shù)
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END 0 */
(2) 查看一下定時(shí)器相關(guān)代碼學(xué)習(xí)
打開(kāi)之后跟正點(diǎn)原子的標(biāo)準(zhǔn)庫(kù)函數(shù)寫(xiě)的代碼對(duì)比一下, 又利于自己理解CubeMX配置的機(jī)理, 以后會(huì)更得心應(yīng)手, 慢慢的自己就可以一直標(biāo)準(zhǔn)庫(kù)函數(shù)用HAL庫(kù)寫(xiě)了。
這張圖左邊是CubeMX配置后自動(dòng)生成的代碼, 藍(lán)色框框里面就是對(duì)應(yīng)的CubeMX里面的配置; 右側(cè)是原子的標(biāo)準(zhǔn)庫(kù)例程代碼, 可以對(duì)比一下, 增強(qiáng)理解
tips:CSDN只能上傳不超過(guò)5M的圖片, 所以這個(gè)圖片經(jīng)過(guò)了壓縮 , 放大看可以看清晰一點(diǎn)。
(3) 編寫(xiě)中斷部分函數(shù)
因?yàn)橐谥袛嘀胁东@上升沿和下降沿, 所以主要代碼寫(xiě)在中斷服務(wù)函數(shù)里面
下圖是計(jì)數(shù)中斷
TIM5CH1_CAPTURE_STA雖然是我們定義的一個(gè)變量,但可以把它看做是一個(gè)8位的寄存器
下圖是捕獲中斷
在HAL_TIM_PeriodElapsedCallback()回調(diào)函數(shù)中用以處理計(jì)數(shù)次數(shù)和時(shí)間;?? 在HAL_TIM_IC_CaptureCallback()回調(diào)函數(shù)負(fù)責(zé)處理捕獲到的上升沿和下降沿,
并隨著捕獲到上升沿而更改為下降沿捕獲,?? 隨著捕獲到下降沿而更改定時(shí)器為上升沿捕獲.
下面是完整代碼:
/* USER CODE BEGIN 1 */
/* bit7 捕獲完成標(biāo)識(shí) bit6 捕獲到高電平標(biāo)識(shí) bit5~0 捕獲高電平后定時(shí)器溢出的次數(shù) */
uint8_t TIM5CH1_CAPTURE_STA = 0; // 輸入捕獲狀態(tài)
uint32_t TIM5CH1_CAPTURE_VAL; // 輸入捕獲值(TIM2/TIM5是32位的定時(shí)器所以這里定義為uint32_t)
// 中斷服務(wù)函數(shù)里面會(huì)自動(dòng)調(diào)用這個(gè)回調(diào)函數(shù) 這個(gè)是定時(shí)器更新中斷中處理的函數(shù)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM5) // 判斷是定時(shí)器5發(fā)生中斷
{
if ((TIM5CH1_CAPTURE_STA & 0x80) == 0) // 還未成功捕獲
{
if (TIM5CH1_CAPTURE_STA & 0x40) // 捕獲到高電平
{
if ( (TIM5CH1_CAPTURE_STA & 0x3f) == 0x3f ) // 如果高電平太長(zhǎng) 做溢出處理
{
TIM5CH1_CAPTURE_STA |= 0x80; // 標(biāo)記成功捕獲了一次
TIM5CH1_CAPTURE_VAL = 0xffffffff;
}
else
{
TIM5CH1_CAPTURE_STA++; // 若沒(méi)有溢出, 就只讓TIM5CH1_CAPTURE_STA自加就ok
}
}
}
}
}
// 定時(shí)器輸入捕獲中斷處理回調(diào)函數(shù),該函數(shù)在 HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) 中會(huì)被調(diào)用
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if ( (TIM5CH1_CAPTURE_STA & 0x80) == 0 ) // 還未成功捕獲
{
if (TIM5CH1_CAPTURE_STA & 0x40) // 捕獲到一個(gè)下降沿
{
TIM5CH1_CAPTURE_STA |= 0x80; // 標(biāo)記成功捕獲到一次高電平脈寬
TIM5CH1_CAPTURE_VAL = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_1); // 獲取當(dāng)前的捕獲值. 即CCRx2
TIM_RESET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1); // 清除原來(lái)的設(shè)置
TIM_SET_CAPTUREPOLARITY(&htim5, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING); // 配置TIM5通道1上升沿捕獲
}
else
{
TIM5CH1_CAPTURE_STA = 0; // 清空自定義的狀態(tài)寄存器
TIM5CH1_CAPTURE_VAL = 0; // 清空捕獲值
TIM5CH1_CAPTURE_STA |= 0x40;// 標(biāo)記捕獲到了上升沿
__HAL_TIM_DISABLE(&htim5); //關(guān)閉定時(shí)器5
__HAL_TIM_SET_COUNTER(&htim5,0);
TIM_RESET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1); //一定要先清除原來(lái)的設(shè)置?。?p> TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//定時(shí)器5通道1設(shè)置為下降沿捕獲
__HAL_TIM_ENABLE(&htim5);//使能定時(shí)器5
}
}
}
/* USER CODE END 1 */
=
tips:每句話都有注釋, 不要一看到密密麻麻代碼就不看了, 看一下并不是很難理解。 也不要因?yàn)榭吹饺谴髮?xiě)字母的函數(shù)或者變量而犯怵, 靜下心來(lái)用兩分鐘看一看很容易看懂
還有一個(gè)問(wèn)題:就是這里為什么用HAL_TIM_PeriodElapsedCallback而不是其他的callback呢? 原因在IRQ_Handler函數(shù)里面。
(4) 主函數(shù)程序(main.c)
首先使能定時(shí)器中斷、同時(shí)定義一個(gè)變量備用:
/* USER CODE BEGIN 2 */
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1); // 開(kāi)啟輸入捕獲中斷
__HAL_TIM_ENABLE_IT(&htim5,TIM_IT_UPDATE); //使能更新中斷
long long temp = 0; // 定義一個(gè)變量用以存儲(chǔ)捕獲到的時(shí)間 long long型是為了防止數(shù)據(jù)溢出
/* USER CODE END 2 */
在while(1)循環(huán)測(cè)量數(shù)據(jù)并打印
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(10);
// 信號(hào)發(fā)生器輸入信號(hào) 串口打印高電平時(shí)長(zhǎng) ms
if (TIM5CH1_CAPTURE_STA & 0x80) // 如果捕獲完成
{
temp = TIM5CH1_CAPTURE_STA & 0x3f;
temp *= 0xffffffff; // Total Overflow Time(總的溢出時(shí)間)
temp += TIM5CH1_CAPTURE_VAL; // Get Total High Level Time(獲取總的高電平時(shí)長(zhǎng))
printf("HIGH: %lld msrn", temp/1000); // Print Total High Level Time(打印總的高電平時(shí)長(zhǎng))
TIM5CH1_CAPTURE_STA = 0; // Clear Capture State , Open The Next Capture(清除捕獲狀態(tài),打開(kāi)下一次捕獲)
}
}
/* USER CODE END 3 */
(5) 至此程序就完成了.
2020年4月10日2020年4月10日20:53:30
== 補(bǔ)充說(shuō)明:==
輸入捕獲這一節(jié) 有個(gè)學(xué)弟反應(yīng)有點(diǎn)問(wèn)題,如果用檢測(cè)按鍵輸入,按下時(shí)間太久了就會(huì)顯示4194ms ; 類(lèi)比到我這里的操作就是,信號(hào)發(fā)生器產(chǎn)生的波形頻率很低的時(shí)候,就達(dá)到了測(cè)量上限,高電平最多4194ms;
這是因?yàn)樵拥睦逃幸粋€(gè)時(shí)間上限 在于0x3f那個(gè)地方,0x3F就限制了時(shí)間的上限;下面這個(gè)是他給我的截圖;
后面返校之后我會(huì)修改代碼,完善這個(gè)地方
在主函數(shù)里面, TIM5CH1_CAPTURE_STA & 0x80的意思是判斷有沒(méi)有捕獲到高電平 用TIM5CH1_CAPTURE_STA和0x80相與, 從而判斷TIM5CH1_CAPTURE_STA的6位是否為1, 進(jìn)而判斷出是否捕獲到高電平; 下面的一些涉及到相與的操作也都類(lèi)似, 把一個(gè)變量看做一個(gè)寄存器, 把0x80、 0xffffffff等轉(zhuǎn)換為二進(jìn)制就好判斷了, 在演草紙上畫(huà)一下就很清楚
(6) 編譯下載
上述代碼都是之前經(jīng)過(guò)測(cè)試的,但是當(dāng)前由于疫情,沒(méi)有條件展現(xiàn)結(jié)果, 如果有人用了這些代碼并測(cè)試,有什么問(wèn)題的話可以下面評(píng)論告知,感激不盡。效果展示會(huì)在后期補(bǔ)上
上一篇:STM32CubeMX 配置STM32F407 實(shí)現(xiàn)HAL庫(kù)延時(shí)微妙方案
下一篇:第六節(jié):STM32基于HAL庫(kù)的IIC通信
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- ARXML 規(guī)則下 ECU 總線通訊與 ADTF 測(cè)試方案
- 日產(chǎn)在歐洲推出第三代e-POWER技術(shù)
- 福特CEO更看好Waymo激光雷達(dá)方案:比特斯拉純視覺(jué)自動(dòng)駕駛路線可靠
- 智元機(jī)器人兩大核心產(chǎn)品啟動(dòng)規(guī)?;a(chǎn)
- 固態(tài)電池2026量產(chǎn)豪賭,真相還是泡沫?
- 100億元!湖北“下注”人形機(jī)器人產(chǎn)業(yè)
- 海外磷酸鐵鋰電池產(chǎn)能從0到1
- 基于多傳感器數(shù)據(jù)的自動(dòng)駕駛仿真確定性驗(yàn)證
- 國(guó)芯科技發(fā)布全球首款48V安全氣囊芯片,引領(lǐng)智能汽車(chē)新紀(jì)元
- 亞馬遜全球部署100萬(wàn)臺(tái)機(jī)器人
- 速度與激情,為你私人訂制。R&S攜多功能基礎(chǔ)示波器帶你身臨其境!
- 您的電源符合能耗標(biāo)準(zhǔn)嗎?關(guān)注PI InnoSwitch3系列,答題贏好禮!
- TI 圖形化界面助力快速開(kāi)發(fā),這就是您想要的MSP430™通用MCU!
- ADI 生命體征監(jiān)測(cè)技術(shù):對(duì)人體實(shí)施狀態(tài)監(jiān)控,答題有好禮
- 【泰有聊】第二期:泰克CEO為你解讀低噪聲背后的科學(xué)
- 有獎(jiǎng)直播:助力AI算力,下一代GPU服務(wù)器中卡緣高速互連解決方案哪里找?
- 家電新風(fēng)尚,PI開(kāi)啟您的家電新生活!下載產(chǎn)品資料答題贏好禮!
- 下載泰克高速接口標(biāo)準(zhǔn)電子書(shū),參與翻蓋有禮,驚喜多多!
- 有獎(jiǎng)直播:瑞薩電子安全物聯(lián)網(wǎng)套件為您提供安全云聯(lián)接解決方案
- 【泰克注冊(cè)觀看有禮】 PCI-SIG 前主席解析:PCI Express5.0測(cè)試方案和測(cè)量挑戰(zhàn)
- 四大問(wèn)題,三大方向,關(guān)于5G預(yù)商用這些應(yīng)當(dāng)知道!
- 分布式能源商業(yè)模式大盤(pán)點(diǎn)
- 固德威與安森美成立聯(lián)合實(shí)驗(yàn)室 共同推動(dòng)光伏逆變器新技術(shù)發(fā)展
- 校園戲曲新花樣,機(jī)器人來(lái)做評(píng)委
- 李之勤:機(jī)器人領(lǐng)域的好榜樣
- 中興天機(jī)Axon 10 Pro采用F2FS文件系統(tǒng),速度更快
- iQOO微博宣布推新版vivo錢(qián)包 升級(jí)增9張公交卡
- 蘋(píng)果A13芯片曝光:7核設(shè)計(jì)性能超筆電 AI能力倍增
- macOS 10.15將發(fā)布 這些新功能讓Mac更好用
- 紅色黑莓Key2登陸美國(guó):驍龍660售價(jià)699美元