2018年11月28日 星期三

DIY - ESP32:ESP32 PCNT API 函數模塊介紹(四十)

DIY - ESP32:ESP32 PCNT API 函數模塊介紹(四十):

ESP32 的 PCNT(Pulse Counter / 脈衝計數器)API 函數模塊用於計算輸入信號的上升沿(Rising Edges)和下降沿(Falling Edges)的數量。 ESP32 內有 8組脈衝計數器單元,每個脈衝計數器單元都有一個 16位有符號計數器寄存器(16-bit Signed Counter Register)和兩個通道(Two Channels),可配置為遞增(Increment)或遞減(Decrement)計數器。 每個通道都有一個接收待檢測信號邊沿的信號輸入,以及一個可用於啟用或禁用信號輸入的控制輸入。 輸入具有可選硬件濾波器(Filters),可用於丟棄信號中不需要的毛刺(Glitches)。
ESP32 PULSE_CNT 單元基本架構圖
功能概述:
此 API 的功能描述分為四個部分:
配置(Configuration) - 描述計數器的配置參數以及如何設置計數器。
操作計數器(Operating the Counter) - 提供有關暫停,測量和清除計數器的控制功能的信息。
濾波脈衝(Filtering Pulses) - 描述濾波脈沖和計數器控制信號的選項。
使用中斷(Using Interrupts) - 介紹如何在計數器的特定狀態上觸發中斷。

配置(Configuration):
PCNT 模塊有 8個獨立的計數“單位”,編號從 0 到 7.在 API 中,它們使用 pcnt_unit_t 引用。 每個單元有兩個獨立的通道,編號為 0 和 1,並用 pcnt_channel_t 指定。
使用 pcnt_config_t 為每個單元的通道單獨提供配置,並涵蓋:
此配置所指的單元和通道編號。
脈衝輸入和脈衝門輸入的 GPIO 編號。
兩對參數:pcnt_ctrl_mode_t 和 pcnt_count_mode_t,用於定義計數器如何根據控制信號的狀態作出反應以及如何計算脈衝的正 / 負邊緣。
當脈衝計數滿足特定限制時,用於建立觀察點和触發中斷的兩個限制值(最小 / 最大值)。
然後通過調用上面的 pcnt_config_t 作為輸入參數的函數 pcnt_unit_config()來完成特定通道的設置。
要在配置中禁用脈衝或控制輸入引腳,請提供 PCNT_PIN_NOT_USED 而不是 GPIO 編號。

操作計數器(Operating the Counter):
在使用 pcnt_unit_config()進行設置後,計數器立即開始運行。 可以通過調用 pcnt_get_counter_value()來檢查累積的脈衝計數。
有幾個函數可以控制計數器的操作:pcnt_counter_pause(),pcnt_counter_resume()和pcnt_counter_clear()
也可以通過調用 pcnt_set_mode()使用 pcnt_unit_config()動態更改先前設置的計數器模式。
如果需要,可以使用pcnt_set_pin()“動態”更改脈衝輸入引腳和控制輸入引腳。 要禁用特定輸入,請提供功能參數 PCNT_PIN_NOT_USED 而不是 GPIO 編號。

注意:
為了使計數器不會錯過任何脈衝,脈衝持續時間應該長於一個 APB_CLK 週期(12.5 ns)。 脈沖在 APB_CLK 時鐘的邊沿上採樣,如果在邊緣之間落下,則可能會丟失。 這適用於有或沒有文件管理器的計數器操作。

脈衝濾波(Filtering Pulses):
PCNT 單元在每個脈沖和控制輸入上都有濾波器,增加了忽略信號中短毛刺的選項。
通過調用 pcnt_set_filter_value()在 APB_CLK 時鐘週期中提供忽略脈衝的長度。 可以使用 pcnt_get_filter_value()檢查當前過濾器設置。 APB_CLK 時鐘以 80 MHz 運行。
通過調用 pcnt_filter_enable()暫停過濾器的操作。

使用中斷(Using Interrupts):
在 pcnt_evt_type_t 中定義的五個計數器狀態監視事件能夠觸發中斷。 事件發生在脈衝計數器

達到特定值:
最小或最大計數值:在配置中討論的 pcnt_config_t 中提供的 counter_l_lim 或 counter_h_lim
使用函數 pcnt_set_event_value()設置閾值 0 或閾值 1 值。
脈衝計數= 0

PCNT的中斷源呢一共有五個:
L_LIM - 最小計數值中斷,意思就是達到最小計數值的時候就會觸發該中斷,最小計數值在初始化的時候有配置
H_LIM - 最大計數值中斷,意思是達到最大計數值的時候回觸發該中斷
THRES_0 - 閾值 0 中斷,也就是自己設定一個值,當計數到達該值的時候就會觸發中斷
THRES_1 - 閾值 1中斷,和閾值 0 功能一樣,只是可以設定兩個閾值
ZERO - 計數為 0 中斷,當計數器值記到0時產生該中斷

要註冊,啟用或禁用中斷以服務上述事件,請調用 pcnt_isr_register(),pcnt_intr_enable()。 和 pcnt_intr_disable()。 要在達到閾值時啟用或禁用事件,您還需要調用函數 pcnt_event_enable()和 pcnt_event_disable()。
要檢查當前設置的閾值,請使用函數 pcnt_get_event_value()。

Header File:driver/include/driver/pcnt.h

相關網址:
※ DIY - ESP32:ESP32 PCNT 脈衝計數器電路(三十八)
※ DIY - ESP32:ESP32 PCNT 脈衝計數器程式(三十九)
※ DIY - ESP32:ESP32 PCNT API 函數(四十一)
※ DIY - ESP32:ESP32 PCNT API 函數結構件及其它(四十二)

2018年 11月 28日 天氣報告
氣溫:21.1@ 19:40
相對濕度:百分之 80%
天氣:多雲

沒有留言:

張貼留言