【MSPM0G3519 系列】外部時鐘輸入測頻
引言
外部被測信號作為其中一個定時器1的外部時鐘輸入,每來一個上升沿CNT值就加一,在中斷定義一個extern_count ++,記錄溢出了多少次;另一個定時器2定時1或2秒,進入中斷后定義變量timer_count,獲取當前定時器1的cnt值,然后計算得到頻率值:

syscofg配置
外部時鐘輸入配置()
注意,這里中斷觸發要選擇load觸發,否則使用CC0_DN的話在低頻會非常不準

1或2秒定時器配置

程序
點擊查看代碼
#include "headers.h"
int main(void)
{
SYSCFG_DL_init();
Set_CurrentUART(UART0_IDX);
printf(" <復位>\r\n\r\n");
bsp_adc_init();
NVIC_EnableIRQ(TIMER_1_INST_INT_IRQN);
NVIC_EnableIRQ(COMPARE_0_INST_INT_IRQN);
while (1) {
// adc_dsp_opration();
}
}
volatile uint32_t extern_count;
void COMPARE_0_INST_IRQHandler(void)
{
switch (DL_TimerA_getPendingInterrupt(COMPARE_0_INST)) {
case DL_TIMERA_IIDX_LOAD:
extern_count ++;
break;
default:
break;
}
}
uint32_t timer_count;
void TIMER_1_INST_IRQHandler(void)
{
uint32_t freq;
switch (DL_TimerA_getPendingInterrupt(TIMER_1_INST)) {
case DL_TIMERA_IIDX_ZERO:
timer_count = DL_TimerA_getTimerCount(COMPARE_0_INST);
freq = timer_count + extern_count * (DL_TimerA_getLoadValue(COMPARE_0_INST) + 1);
printf("freq = %d Hz\r\n\r\n", freq / 2);
extern_count = 0;
timer_count = 0;
DL_TimerA_setTimerCount(COMPARE_0_INST, 0);
break;
default:
break;
}
}
測試數據

更新
移步至:【MSPM0G3519系列】定時器級聯時鐘輸入測頻率【進階版】學習更優測頻方案。
博客導航
本文來自博客園,作者:膝蓋中箭衛兵,轉載請注明原文鏈接:http://www.rzrgm.cn/Skyrim-sssuuu/p/18977710

浙公網安備 33010602011771號
https://orcid.org/0000-0001-5102-772X