有人使用STM32G4系列的通用型TIMER基于捕獲功能對(duì)外來(lái)信號(hào)進(jìn)行周期及占空比的測(cè)量。他用TIM3產(chǎn)生頻率、占空比可調(diào)的PWM輸出做為被測(cè)信號(hào)。TIM4用來(lái)進(jìn)行頻率測(cè)量,工作在復(fù)位從模式,被測(cè)信號(hào)接到其通道2的輸入腳。然后經(jīng)內(nèi)部邊沿檢測(cè)和內(nèi)部濾波電路后,兵分兩路分別連接到IC1和IC2。顯然IC2使用直接輸入模式,IC1使用間接輸入模式,如下圖功能框圖示意。
但他發(fā)現(xiàn)被測(cè)信號(hào)頻率較高時(shí),誤差就明顯變大了。當(dāng)然,他也知道,任何測(cè)量肯定是有極限的。他現(xiàn)在就是想知道,能否基于現(xiàn)有方案將測(cè)量極限拉高點(diǎn)。比方說(shuō),他現(xiàn)在測(cè)量20KHz信號(hào)時(shí)就明顯誤差過(guò)大,導(dǎo)致測(cè)算結(jié)果難以采用。是否可以將可靠的測(cè)量結(jié)果提升到25KHz或更高呢。
我們不妨一起看看這個(gè)問(wèn)題。依然保持相同的測(cè)量方案,TIM4工作在復(fù)位從模式,TIM3輸出的被測(cè)信號(hào)連接到TIM4的CH2,然后兵分兩路連接都TIM4的IC1與IC2。
顯然,我們先要確定測(cè)量的計(jì)時(shí)起點(diǎn)??梢圆捎肐C2的上沿捕獲事件作為測(cè)量起點(diǎn),即進(jìn)入測(cè)試狀態(tài)。也可以基于上沿觸發(fā)信號(hào)產(chǎn)生定時(shí)器復(fù)位導(dǎo)致的更新事件加觸發(fā)事件作為測(cè)量起點(diǎn),我在下面就是使用后者來(lái)進(jìn)行測(cè)量并組織相應(yīng)代碼。
IC1的下降沿觸發(fā)捕獲,捕獲到的計(jì)數(shù)器值存放于變量Value_1stCap【結(jié)合上圖來(lái)看】。
IC2的上升沿作為T(mén)IM4的觸發(fā)復(fù)位信號(hào),且基于上升沿事件進(jìn)行捕獲, 捕獲值存于Value_2ndCap。
從發(fā)生復(fù)位事件到發(fā)生第2次捕獲期間,對(duì)TIM4的更新事件次數(shù)進(jìn)行統(tǒng)計(jì),總的更新事件次數(shù)計(jì)為T(mén)otal_Num_OvEvent。
從發(fā)生復(fù)位事件到發(fā)生第1次捕獲期間,對(duì)TIM4的更新事件次數(shù)進(jìn)行統(tǒng)計(jì)后,計(jì)為Front_Num_OvEvent。
現(xiàn)在使用STM32CubeMx進(jìn)行配置。重點(diǎn)關(guān)注TIM4的配置。TIM4的時(shí)基和捕獲配置參數(shù)如下:
結(jié)合上面配置我們不難看出,TIM4的溢出周期為20ms,TI2FP2作為T(mén)IM4的復(fù)位觸發(fā)信號(hào),上沿觸發(fā),同時(shí)IC2針對(duì)輸入信號(hào)的上沿進(jìn)行捕獲。IC1針對(duì)輸入信號(hào)的下沿進(jìn)行捕獲。
至于TIM3的配置沒(méi)啥特別的,就是產(chǎn)生PWM輸出信號(hào),在代碼里將調(diào)整其PSC分頻系數(shù)和ARR參數(shù)以及CCR參數(shù),以改變其頻率和占空比。選擇其通道1做PWM輸出。下面測(cè)試中,TIM3輸出的PWM波形的占空比固定為40%。
另外,STM32G4的系統(tǒng)主頻配置為170MHz,使用HSE 時(shí)鐘源。開(kāi)啟TIM4的中斷響應(yīng)使能。完成配置后創(chuàng)建工程。添加必要的用戶初始及啟動(dòng)代碼。
__IO uint32_t Vaule_2ndCap = 0u;
__IO uint32_t Vaule_1stCap = 0u;
__IO float Signal_Cycle= 0.0f;
__IO float Signal_Duty = 0.0f;
__IO float Signal_Freq = 0.0f;
__IO uint32_t Total_Num_OvEvent=0u;
__IO uint32_t Front_Num_OvEvent=0u;
__IO uint32_t Num_OvEvent =0u ;
__IO uint32_t Measure_State = 0u;
__IO uint32_t Clk_Internal;
__HAL_TIM_CLEAR_IT(&htim4, TIM_IT_UPDATE);
__HAL_TIM_ENABLE_IT(&htim4, TIM_IT_UPDATE);
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2); //enable IC1 interrupt of TIM4
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1); //enable IC2 interrupt of TIM4
__HAL_TIM_CLEAR_IT(&htim4, TIM_IT_UPDATE);
__HAL_TIM_CLEAR_IT(&htim4, TIM_IT_TRIGGER);//enable Update interrupt of TIM4
Clk_Internal=HAL_RCC_GetHCLKFreq();//170MHzforG4Series
Measure_State = 0x00; //initial state of Measuring
Num_OvEvent = 0x00; //initial value of update count of TIM4
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
TIM4事件的所有中斷共用同一個(gè)中斷矢量入口。為了盡可能地測(cè)得較高的信號(hào)頻率,中斷處理代碼盡量要簡(jiǎn)潔些,避免過(guò)多、過(guò)深的函數(shù)調(diào)用。
有關(guān)TIM4的捕獲中斷及更新中斷的處理代碼如下,包括IC1、IC2的捕獲中斷處理和更新中斷處理代碼,以及相關(guān)計(jì)算處理代碼。
void HAL_TIM4_PWM_Measure_IRQ(TIM_HandleTypeDef *htim)
{
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET)
{
__HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER);
if (Measure_State == 0)
{
Num_OvEvent = 0; // prepare count overflow events
Measure_State = 0x01; //start measurement
}
}
else
{
if(Measure_State != 0)
{
Num_OvEvent++;
}
}
}
/* Capture compare 1 event */
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET)
{
__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
if (Measure_State == 0x01)
{
Front_Num_OvEvent = Num_OvEvent;
Measure_State =0x02;
}
}
/* Capture compare 2 event */
if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET)
{
__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2);
if(Measure_State == 0x02)
{
Measure_State =0x03;
Total_Num_OvEvent = Num_OvEvent;
HAL_TIM4_IC_CaptureCallback(htim); //go to calculate pulse width and duty
}
}
}
void HAL_TIM4_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
/* Get the Input Capture value */
Vaule_1stCap = TIM4->CCR1;//HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
Vaule_2ndCap = TIM4->CCR2;//HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
Signal_Duty =(float)((Vaule_1stCap+(Front_Num_OvEvent*(TIM4_PERIOD+1)))*100u)/
(float)(Vaule_2ndCap+(Total_Num_OvEvent*(TIM4_PERIOD+1)));
// Clk_Internal = HAL_RCC_GetHCLKFreq();
Signal_Freq =(float)(Clk_Internal/(TIM4_PSC+1))/(float)((Vaule_2ndCap+(Total_Num_OvEvent*(TIM4_PERIOD+1))));
Signal_Cycle = (float) (1.000f/Signal_Freq) ;
Measure_State = 0x00;
Num_OvEvent = 0x00;
__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
__HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2);
__HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
__HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER);
}
現(xiàn)在基于上面的配置及用戶代碼進(jìn)行測(cè)量驗(yàn)證。我們發(fā)現(xiàn)當(dāng)TIM3輸出的待測(cè)信號(hào)頻率達(dá)到25KHz時(shí),測(cè)得的頻率及占空比就發(fā)生了明顯的偏差。見(jiàn)下圖標(biāo)注問(wèn)號(hào)的第4欄信息。
即當(dāng)被測(cè)頻率為25KHz,占空比為40%時(shí),測(cè)得結(jié)果是下面的樣子,明顯偏差過(guò)大。
如果說(shuō)被測(cè)信號(hào)頻率進(jìn)一步提升的話,誤差會(huì)變得更大。那么,這種情形是否有改善機(jī)會(huì)呢?即在當(dāng)前的測(cè)試方案下,可準(zhǔn)確測(cè)量的被測(cè)信號(hào)頻率是否可以提高。
目前的中斷處理代碼應(yīng)該說(shuō)比較精簡(jiǎn),沒(méi)有什么可以優(yōu)化的余地了。
聊到這里,有人可能發(fā)現(xiàn)了,我前面配置TIM4時(shí),它是用來(lái)完成測(cè)量任務(wù)的,它的分頻系數(shù)PSC為169。即TIM4的計(jì)數(shù)器計(jì)數(shù)時(shí)鐘為1MHz,其計(jì)數(shù)分辨率為1us。不難理解,這個(gè)PSC系數(shù)應(yīng)該會(huì)直接影響TIM4的計(jì)數(shù)精度,按理會(huì)影響到測(cè)量結(jié)果,尤其被測(cè)信號(hào)頻率較高時(shí)。
既然這樣,我們將TIM4的PSC系數(shù)改為0,并適當(dāng)調(diào)整其ARR值再來(lái)實(shí)施測(cè)量,看看結(jié)果會(huì)怎么樣。見(jiàn)下圖,TIM3輸出的信號(hào)頻率仍然是占空比為40% 、頻率為25KHz的PWM信號(hào)。測(cè)量結(jié)果顯著地明顯改善,應(yīng)該說(shuō)此時(shí)結(jié)果是可以接受的,畢竟浮點(diǎn)運(yùn)算也會(huì)帶來(lái)些偏差。
我們不妨在保持TIM3的PSC為0的條件下,將輸出頻率提升到50KHz、100KHz。繼續(xù)看看測(cè)量結(jié)果,見(jiàn)下圖:
從測(cè)試結(jié)果來(lái)看,當(dāng)被測(cè)信號(hào)頻率提升到50KHz,測(cè)量結(jié)果仍然很好,完全可以采用。即使當(dāng)被測(cè)信號(hào)頻率提升到100KHz時(shí),測(cè)量結(jié)果雖發(fā)生了一些偏差,但此時(shí)的偏差相比PSC=169、被測(cè)信號(hào)為25KHz時(shí)的測(cè)試結(jié)果還要好得多。我把二者單列出來(lái)一起比較,見(jiàn)下圖:
經(jīng)過(guò)上面的討論和驗(yàn)證,我們知道,在使用TIMER做信號(hào)的頻率及占空比的測(cè)量時(shí),當(dāng)確定好測(cè)試方案后,為了盡可能地提升可以準(zhǔn)確測(cè)試信號(hào)的頻率,一方面代碼要盡可能精簡(jiǎn)、優(yōu)化,另一方面,因測(cè)試TIMER的分頻系數(shù)會(huì)影響測(cè)試結(jié)果的精度及準(zhǔn)確性,此時(shí)測(cè)試TIMER的分頻系數(shù)要盡可能設(shè)置小、或不做分頻,這點(diǎn)結(jié)合具體應(yīng)用場(chǎng)景來(lái)定。
上一篇:基于機(jī)智云物聯(lián)網(wǎng)的智能花卉栽培系統(tǒng)
下一篇:使用74HC595驅(qū)動(dòng)LED流水燈實(shí)驗(yàn)
- 熱門(mén)資源推薦
- 熱門(mén)放大器推薦
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- AM3G-2412DZ ±12V 3 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- 使用 LT3045IDD 并聯(lián)多個(gè)使用 ILIM(電流監(jiān)視器)以消除鎮(zhèn)流電阻壓降的典型應(yīng)用
- LTC1921 在一個(gè) 4 二極管設(shè)計(jì)電路中監(jiān)控卡邊緣的每個(gè)電源
- LT1021BCN8-5 具有升壓輸出電流和電流限制的電壓基準(zhǔn)的典型應(yīng)用
- DC2263A-A,用于 LTC3887EUJ (RSENSE) 雙路 PMBU 降壓轉(zhuǎn)換器的演示板,7V = VIN = 18V,Vout0/Vout1 = 0.8V 至 1.8V @ 25A
- LT3990IMSE-5 2.5V 降壓轉(zhuǎn)換器的典型應(yīng)用
- 使用 ROHM Semiconductor 的 BD4958 的參考設(shè)計(jì)
- TL431 可編程精密基準(zhǔn)電壓源的典型應(yīng)用,用于串聯(lián)通路穩(wěn)壓器的高電流分流穩(wěn)壓器
- 基于VIPer06的12V-4W,115kHz隔離反激
- LTC7813EUH 寬輸入范圍至 10V/10A 低 IQ 級(jí)聯(lián)升壓+降壓穩(wěn)壓器的典型應(yīng)用電路
- 貿(mào)澤授權(quán)代理Texas Instruments 豐富多樣的產(chǎn)品
- 美國(guó)為何恢復(fù)英偉達(dá)H20對(duì)華銷(xiāo)售?白宮AI負(fù)責(zé)人回應(yīng)
- Cadence 率先推出業(yè)內(nèi)首款 LPDDR6/5X 14.4Gbps 內(nèi)存 IP,為新一代 AI 基礎(chǔ)架構(gòu)助力
- 手把手教你從零設(shè)計(jì)一款算力超過(guò) 1000Tops 的智能駕駛芯片
- OrangeBox汽車(chē)連接域控制器(CDC)開(kāi)發(fā)平臺(tái)
- 采用反激式轉(zhuǎn)換器進(jìn)行高功率應(yīng)用設(shè)計(jì)
- Vishay推出PLCC-6封裝RGB LED通過(guò)獨(dú)立控制紅色、綠色和藍(lán)色芯片實(shí)現(xiàn)寬色域
- 芯對(duì)話 | CBMG719單刀雙擲模擬開(kāi)關(guān):高精度信號(hào)切換低阻高速寬溫
- 大聯(lián)大詮鼎集團(tuán)推出基于Qualcomm和Thundercomm產(chǎn)品的AI電子圍欄方案
- AMD:AI加速卡MI308將恢復(fù)出貨,許可證申請(qǐng)將被推進(jìn)至審核流程
- 90%的AI企業(yè)都在虧損,“藥神”也拯救不了?
- 銀行服務(wù)要順應(yīng)企業(yè)需求,發(fā)明專(zhuān)利也能抵押貸款
- 蘋(píng)果推出3億美元“首創(chuàng)”清潔能源基金,釋放什么信號(hào)?
- 人工智能會(huì)替代多少人力勞動(dòng)?
- 還在萌芽期的AI,該如何成長(zhǎng)?
- 華為拉貨效應(yīng)!韓9月前10日出口僅降0.2%
- 微容科技:高端MLCC才是本土廠商突圍唯一出路
- 大族激光:激光類(lèi)封測(cè)設(shè)備逐步獲訂單,光刻機(jī)項(xiàng)目進(jìn)展
- 中國(guó)電信深度定制,摩托羅拉razr 5G手機(jī)發(fā)布了
- TCL科技:并購(gòu)重組事項(xiàng)近日上會(huì) 當(dāng)天股票停牌了
- 如下流程圖,如何用verilog hdl 來(lái)實(shí)現(xiàn)
- 如何獲取多個(gè)串口(分布在不同位置)的輸出?
- 2021物聯(lián)網(wǎng)發(fā)展趨勢(shì)大預(yù)測(cè)
- cc2530 zigbee-zha修改支持串口1位置1 P0_4 P0_5
- 請(qǐng)大家看下我的情況 想還工作了
- 請(qǐng)問(wèn),我的PC上運(yùn)行的在 linux 操作系統(tǒng),請(qǐng)問(wèn)在這個(gè)環(huán)境里用什么工具進(jìn)行 ARM 嵌入式軟件開(kāi)發(fā)?
- 關(guān)于掛載sd的問(wèn)題
- 賺點(diǎn)幣要不下不了
- 1.接地電阻測(cè)試儀和兆歐表有何區(qū)別?這個(gè)儀器主要是用來(lái)測(cè)試什么參數(shù)的? 2.這兩個(gè)...
- 求一塊MSP430FR4133的LAUNCHPAD