基於stm32f103微控制器對訊號頻率、占空比的測量。
最近開始儀器儀表方面的學習了,計畫後期做乙個示波器。所以這週就在stm32f103上面做了乙個測量頻率、占空比的小設計。總體上精度還是比較高的,測量頻率量程在35hz—190khz。頻率可以精確到小數點後四位,占空比測量的精度也比較高,可以到小數點後兩位。
說到用stm32測頻率,都會想到用定時器的輸入捕獲模式,只需要乙個定時器和乙個io口即可,前幾天在論壇上看到還有一種是用兩個定時器測頻率,乙個定時器用來檢測訊號跳變沿,另外乙個用來精準定時,比如說用tim1檢測跳變沿(假設為上公升沿),tim2開乙個1s的定時器中斷,這個1s就比較準確,在1s內tm1檢測到了多少個上公升沿改訊號的頻率就是多少。這種方法我本周二試過,精度比輸入捕獲模式下的高,而且還比較穩定,缺點是用到了兩個定時器,占用的cpu資源較多。考慮到我後面任務需要,定時器可能會不夠用,故還是用的輸入捕獲模式。
實驗平台:stm32f103zet6
定時器及通道:tim2的通道2
io口:pa1
定時器及輸入捕獲模式的配置:
u8 edge_flag; //定時器2的中斷服務函式:高低電平的標誌位
u16 rising,falling,rising_last;
//定時器2輸入捕獲中斷初始化
void
tim2_cap_init()
void tim2_irqhandler(void輸入捕獲模式下,中斷服務函式裡面處理的內容要盡量少,所以在記錄定時器捕獲到值時,直接將tim2的ccr2暫存器裡面的值賦值給相應變數。)
else
if(edge_flag==2
)
else
}tim_clearitpendingbit(tim2,tim_it_cc2);
//清除標誌位
}
主函式:
int main(void變數rising_last為第二次檢測到上公升沿捕獲到的值,falling為第一次捕獲到的值,兩者之差為定時器計數的數值差,根據tim_prescaler=0(即不分頻),主頻為72m,頻率f=72m/(rising_last-falling)。而rising-falling為高電平的時間,除以乙個週期就是占空比了。)
}
實驗現象
頻率10k,占空比60%
stm32檢視當前時鐘頻率
最近畢業設計需要做了乙個stm32最小系統板,上電後發現延時函式不對勁,1s的led延時大概等了10s左右,初步判斷晶振電路出了問題。獲取當前時鐘頻率方法 庫函式 定義乙個全域性變數 rcc clockstypedef get rcc clock 獲取系統時鐘狀態 rcc clockstypedef...
利用STM32的外部中斷和定時器測量頻率
摘要 利用定時器產生pwm波。然後利用32的外部中斷和定時器來測量32輸出的波形 硬體 stm32f103c8t6核心板 示波器 串列埠除錯助手 所用到的的引腳為pa8和pa0。測量方案 在第一次外部中斷 上公升沿觸發 到之時,開啟定時器,同時計數器清零。然後等待第二次中斷到來,在第二次外部中斷 上...
stm32模擬輸出PPM訊號
ppm訊號週期為20ms,分成10分代表10個通道訊號,也就是2ms代表乙個訊號。0.5ms代表乙個通道訊號的開始,所以0.5ms 2ms為通道範圍控制。led p1 a 8 io口初始化,這裡就不介紹了,推挽輸出 u16 count 0 u16 pwm count 1000 總計數 週期20ms,...