stm32定時器輸入捕獲模式

頻率測量

頻率測量有兩種方法

  • 測頻法:在閘門時間T內,對上升沿或下降沿計次,得到N,則評率fx=N/T
  • 測周法:兩個上升沿內,以標準頻率fc計次得到N,則頻率fx= fc/N
  • 中界頻率:測頻法和測周法誤差相等的點fm=√(fc/T),fx大于fm選用測頻法更準確。

定時器輸入捕獲測頻原理

在說原理前需要先講一下定時器的主從模式
主模式則是設置定時器輸出時上升沿/下降沿觸發自動執行的操作
從模式則是設置定時器輸入時上升沿/下降沿觸發自動執行的操作
下面我們用到的從模式是復位模式,進入中斷定時器的計數器會自動復位清零

在這里插入圖片描述
這是定時器運行框圖,輸入捕獲只有看紅色框出來的部分就可以了。可能有點抽象,接下來我來翻譯一下。

首先是第一框中的TI1代表的是定時器x的通道1GPIO引腳輸入的波頻,TI2、3、4同理

然后看到是第二個框中第一條通道的TI1FP1和TI1FP2,分別代表的是,TI1這個波頻輸入哪一個通道處理,TI1FP1則使用定時器通道1的資源對TI1這個波頻進行捕獲上升沿/下降沿,TI1FP2則使用的是定時器通道2的資源,TI2FP1則代表TI2這個波頻使用定時器通道1的資源。

然后就到了處理波頻的步驟了,在我們第一個上升沿到來時,定時器的CNT寄存器開始計時,然后下一個上升沿到來,CNT里的值傳入CCR輸入/比較寄存器,接下來從模式將CNT寄存器自動清零。我們將CCR里的值取出就可以知道一個周期計時值,通過該值大小知道該波頻的頻率高低。

整個流程如下圖
在這里插入圖片描述

定時器輸入捕獲測量占空比(PWMI模式)

上文提到,定時器通道1的引腳輸入的波頻可以分為TI1FP1和TI2FP2到兩個通道的計時器處理,那么我們將一段波頻分別給兩個定時器通道處理,一個捕獲上升沿,一個捕獲下降沿,在第二次捕獲上升沿的中斷進入時,用捕獲上升沿的CCR1獲取的值減去捕獲下降沿的CCR2的值就可以得到高電平的時間,計算即可得到占空比。

如下圖所示
在這里插入圖片描述
具體步驟:
第一次捕獲到上升沿:CNT開始計時
第一次捕獲到下降沿:CCR2獲取CNT的值,得到高電平時間
第二次捕獲到上升沿:CCR1獲取CNT的值,進入從模式清除CNT的值,得到周期

那么就可以計算出占空比了。

定時器編碼器模式

stm32的定時器擁有編碼器模式,使我們可以使用編碼器,計算電機轉速

AB相編碼器

這種編碼器可以理解為編碼器會輸出兩個相差90°相位差的波頻,而通過A相在前還是B相在前,判斷電機正轉反轉。
在這里插入圖片描述
該模式的操作原理比較簡單
兩波頻進入編碼器接口后,判斷相位差是哪個在前,如果為A相在前就將計數器加1,負責計數器減1。

使用定時器編碼模式的軟件代碼

#include "stm32f10x.h"
#include "hal_TIM.h"/****************************************************************************
*@*名稱 : hal_TIM_Encoder_Config
*@*功能 : 初始化定時器2的編碼器模式
*@*形參 : 無
*@*返回值 : 無
****************************************************************************/
static void hal_TIM_Encoder_Config(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;									//上拉輸入GPIO_InitStructure.GPIO_Pin = TIM_ENCODER_A_PIN | TIM_ENCODER_B_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//時鐘分頻因子TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;		//PSC	預分頻器		//使用系統時鐘作為定時器的編碼器模式的時鐘,實現 1 至 65536 分頻TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStructure);TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(&TIM_ICInitStructure);												//因為結構體沒有定義完整,但擔心有不知名錯誤,先初始化結構體TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;TIM_ICInitStructure.TIM_ICFilter = 0xF;												//濾波次數7次TIM_ICInit(TIMx, &TIM_ICInitStructure);TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;TIM_ICInitStructure.TIM_ICFilter = 0xF;TIM_ICInit(TIMx, &TIM_ICInitStructure);TIM_EncoderInterfaceConfig(TIMx, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_Cmd(TIMx, ENABLE);
}/****************************************************************************
*@*名稱 : hal_TIM_Encoder_Init
*@*功能 : 初始化定時器2的編碼器模式
*@*形參 : 無
*@*返回值 : 無
****************************************************************************/
void hal_TIM_Encoder_Init(void)
{hal_TIM_Encoder_Config();
}/****************************************************************************
*@*名稱 : hal_TIM_Encoder_Get
*@*功能 : 獲取定時器編碼器模式計數的CNT(TIM_EncoderMode_TI12通道12都計數,一個周期記4次)
*@*形參 : 無
*@*返回值 : CNT計數值
****************************************************************************/
int16_t hal_TIM_Encoder_Get(void)
{int16_t Temp;Temp = TIM_GetCounter(TIMx);return Temp;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161444.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark的通用運行流程與Spark YARN Cluster 模式的運行流程

Spark的通用運行流程 集群啟動后Worker節點會向Master節點心跳匯報資源Client向Driver提交APP,根據不同的運行模式在不同的地方創建Driver。Driver以粗粒度的方式向Master注冊應用并申請資源(在Application執行之前,將所有的資源申請完畢&…

助力企業前行——ScalaSpark最佳實踐課程

時間飛逝,轉眼間我們的Scala&Spark培訓課程已經圓滿結束!在這段精彩的學習旅程中,你們展現了堅韌、決心和追求卓越的品質。 scala(Scalable Language)是一種多范式的編程語言,其設計的初衷是要集成面向對象編程和函數式編程的…

Cookie與Session知識

目錄 一.Cookie與Session的發展史 1.Cookie的發展史 2.Session的發展史 3.Cookie和Session的關系 4.總結 二.Cookie與Session詳解 1.Cookie 2.Session 3.token 4.總結 三.Django操作Cookie 1.設置Cookie 2.獲取Cookie 3.設置超時時間 4.注銷Cookie 5.登錄功能實…

【機器學習】On the Identifiability of Nonlinear ICA: Sparsity and Beyond

前言 本文是對On the Identifiability of Nonlinear ICA: Sparsity and Beyond (NIPS 2022)中兩個結構稀疏假設的總結。原文鏈接在Reference中。 什么是ICA(Independent component analysis)? 獨立成分分析簡單來說,就是給定很多的樣本X,通…

Springboot-熱部署-IDEA2023

方式一&#xff1a;jrebel 方式二&#xff1a; 1、導入依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <…

C++ DAY08 異常

概念 異常事件&#xff08;如&#xff1a;除 0 溢出&#xff0c;數組下標越界&#xff0c;所要讀取的文件不存在 , 空指針&#xff0c;內存不足 等等&#xff09; 在 C 語言對錯誤的處理是兩種方法&#xff1a; 一是使用整型的返回值標識錯誤&#xff1b; 二是使用 errn…

自動解決IP沖突的問題 利用批處理更改末位IP循環+1直到網絡暢通為止 解放雙手 事半功倍

好久沒出來寫點什么了&#xff0c;難道今天有點時間&#xff0c;順便把這兩天碰到的問題出個解決方法吧。 這幾天去客戶那兒解決網絡問題&#xff0c;因為客戶的網絡是固定的靜態IP&#xff0c;因為沒做MAC綁定&#xff0c;IP固定在本地電腦上&#xff0c;只要上不了網&#xf…

PDF轉Word,1行Python代碼就夠了,免費用

大家好&#xff0c;這里是程序員晚楓。 今年十一假期沒出去旅游&#xff0c;在家里更新一套原創課程&#xff0c;&#x1f449;給小白的《50講Python自動化辦公》。 所有功能&#xff0c;都只需要1行代碼&#xff0c;非常適合非程序員入門Python使用。 目前全網播放量直逼100…

RK3588平臺開發系列講解(嵌入式AI篇)RKNPU詳解

文章目錄 一、CPU、GPU、FPGA和NPU介紹二、CPU、GPU、FPGA和NPU區別三、NPU 應用四、RKNPU沉淀、分享、成長,讓自己和他人都能有所收獲!?? ?? 本篇將給大家介紹什么是RKNPU。 一、CPU、GPU、FPGA和NPU介紹 二、CPU、GPU、FPGA和NPU區別 若考慮成本、功耗、計算能力以及體…

探秘開發app與小程序:一場技術與創新的博弈

app與小程序&#xff1a;一場技術與創新的博弈隨著科技的飛速發展&#xff0c;移動應用程序已經成為我們日常生活中不可或缺的一部分。在這個充滿競爭的時代&#xff0c;企業紛紛投身于開發各類移動應用&#xff0c;以期在市場中占據一席之地。然而&#xff0c;面對多樣化的應用…

PC訪問華為昇騰開發板的摸索過程

作者&#xff1a;朱金燦 來源&#xff1a;clever101的專欄 為什么大多數人學不會人工智能編程&#xff1f;>>> 最近要折騰華為昇騰開發板&#xff08;官方名稱叫&#xff1a;Atlas 200I DK&#xff09;。先是按照官方教程折騰&#xff1a;Atlas200DK環境部署。我發現…

Spark---轉換算子、行動算子、持久化算子

一、轉換算子和行動算子 1、Transformations轉換算子 1&#xff09;、概念 Transformations類算子是一類算子&#xff08;函數&#xff09;叫做轉換算子&#xff0c;如map、flatMap、reduceByKey等。Transformations算子是延遲執行&#xff0c;也叫懶加載執行。 2)、Transf…

Jina AI 的 8K 向量模型上線 AWS Marketplace,支持本地部署!

在當前多模態 AI 和大模型技術風頭正勁的背景下&#xff0c;Jina AI 始終領跑于創新前沿&#xff0c;技術領先。2023 年 10 月 30 日&#xff0c;Jina AI 隆重推出 jina-embeddings-v2&#xff0c;這是全球首款支持 8192 輸入長度的開源向量大模型&#xff0c;其性能媲美 OpenA…

匯編-PROC定義子過程(函數)

過程定義 過程用PROC和ENDP偽指令來聲明&#xff0c; 并且必須為其分配一個名字(有效的標識符) 。目前為止&#xff0c; 我們所有編寫的程序都包含了一個main過程&#xff0c; 例如&#xff1a; 當要創建的過程不是程序的啟動過程時&#xff0c; 就用RET指令來結束它。RET強制…

Bean依賴注入注解開發

value Value("xfy")private String userName;private String userName;Value("xiao")public void setUserName(String userName) {this.userName userName;} Autowired // 根據類型進行注入 如果同一類型的Bean有多個&#xff0c;嘗試根基名字進行二次…

AIGC,ChatGPT AI繪畫 Midjourney 注冊流程詳細步驟

AI 繪畫,Midjourney完成高清圖片繪制,輕松掌握AI工具。 前期準備: ① 一個能使用的谷歌賬號 ② 可以訪問外網 Midjourney注冊 1.進入midjourney官網https://www.midjourney.com 點擊左下角”Join the Beta”,就可以注冊,第一次使用的小伙伴會彈出提示,只需要點擊Acc…

2019年12月 Scratch(三級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 怎樣修改圖章的顏色? A:只需要一個數字來設置顏色 B:設置RGB的值 C:在畫筆中設置顏色、飽和度、亮度 D:在外觀中設置或修改角色顏色特效 答案:D 在外觀中設置或修改角色顏色特…

【深度學習】臉部修復,CodeFormer,論文,實戰

代碼&#xff1a; https://github.com/sczhou/CodeFormer 論文&#xff1a;https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目錄 論文摘要1 引言2 相關工作**4 實驗****4.1 數據集****4.2 實驗設置和指標***…

【ArrayList是如何擴容(ArrayList、LinkedList、與Vector的區別)】

ArrayList、LinkedList、與Vector的區別 解讀ArrayList 是一個可改變大小的數組LinkedList 是一個雙向鏈表Vector 屬強同步類 拓展知識面ArrayList是如何擴容&#xff1f;如何利用List實現LRU&#xff1f; 解讀 List主要有ArrayList、LinkedList與Vector幾種實現。這三者都實現…

[論文筆記] Scaling Laws for Neural Language Models

概覽: 一、總結 計算量、數據集大小、模型參數量大小的冪律 與 訓練損失呈現 線性關系。 三個參數同時放大時,如何得到最佳的性能? 更大的模型 需要 更少的樣本 就能達到相同的效果。 </