問題由來:專案需要對乙個外部輸入訊號統計一段時間內負脈衝(低電平)的個數
思路:乙個定時器用來計時1分鐘,乙個定時器通過etr模式進行邊沿檢測並計數(本次檢測下降沿以獲取負脈衝個數)
平台:stm32f103小板-正點原子(pwm輸出,上一次已介紹)+stm32f407最小系統板(定時計數)
定時1分鐘實現:由於採用的f407 的tim3進行計時,,tim3 的時
鐘為 84m,再根據我們設計的 arr 和 psc 的值,就可以計算中斷時間了。計算公式如下:
tout= ((arr+1)*(psc+1))/tclk;
其中:tclk:tim3 的輸入時鐘頻率(單位為 mhz)。
tout:tim3 溢位時間(單位為 us)。
而arr和psc兩個最大取到65535,最大計時約為51秒多一點,因此單個中斷不能實現,這裡就設定6秒進一次中斷,在中斷裡用乙個變數進行計數,當計數到10時再去執行其他操作。tim3配置和中斷函式如下:
//通用定時器3中斷初始化
//arr:自動重灌值。
//psc:時鐘預分頻數
//定時器溢位時間計算方法:tout=((arr+1)*(psc+1))/ft us.
//ft=定時器工作頻率,單位:mhz
//這裡使用的是定時器3!
void tim3_int_init(u16 arr, u16 psc)
u16 cnt=0;
u8 count=0;
//定時器3中斷服務函式
void tim3_irqhandler(void)
tim_clearitpendingbit(tim3, tim_it_update); //清除中斷標誌位
}
脈衝計數採用tim5,每個下降沿計數一次,tim配置如下:
void tim5_etr_init(u16 arr)
void tim5_irqhandler()
}
主函式:
int main(void)
led0=!led0;
delay_ms(1000);
}}
本次傳送的波形頻率為100hz,週期為10ms,第一分鐘的計數值誤差較大,後續計數穩定在5917負脈衝,理論上應該6000個負脈衝,最初以為是計數器精度問題,後用示波器實際測量輸出波形,發現其頻率為10.14ms左右,60s內的負脈衝個數算出來約為5917,因此判斷問題是由於pwm波傳送的實際週期大於設定週期導致。
stm32關定時器 STM32定時器TIM3程式
include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...
stm32學習 SysTick定時器
systick定時器是乙個簡單的定時器,cm3和cm4核心晶元都有systick定時器。systick定時器是乙個24位的倒計數定時器,計到0時,將從reload暫存器中自動重裝載定時初值。只要不把它在systick控制及狀態暫存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。systick...
STM32學習 定時器(通用定時器)
如圖所示,輸出理解時注意兩種訊號ocxref和ocx,ocx是直接連到埠的訊號,ocxref是輸出控制的輸出訊號。一般在參考手冊中大多數講ocxref。ocx與ocxref可由ccxp控制是否反向,由ccxe控制訊號輸出。比較輸出功能 輸出乙個波形 指示一段給定時間已到。它的原理是通過計數器的值cn...