在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

判斷高電平,低電平和方波的幾種方法

撞上電子 ? 2023-11-07 08:00 ? 次閱讀

讀取某一個上拉電平信號,它可能輸出是低電平,可能是高電平,可能是方波,并且這個方波不知道頻率何占空比,那么如何來通過程序來判斷呢?高電平和低電平都好說,利用HAL庫讀取即可,如下:

int main(void) { HAL_Init(); SystemClock_Config();
// 初始化 GPIO GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); // 啟用 GPIOA 時鐘
GPIO_InitStruct.Pin = GPIO_PIN_0; // 選擇要讀取的引腳 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 設置為輸入模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 沒有上下拉電阻 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 讀取 GPIO 電平 uint8_t gpioState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
// 現在 gpioState 包含了引腳的電平狀態 (GPIO_PIN_SET 或 GPIO_PIN_RESET)
while (1) { // 在這里可以執行其他任務 }}

重點是方波,如何讀取方波信號呢?

方法一:讀取ADC電壓高電平是3.3V左右,低電平是0V左右,那么介于中間的就是方波,這個是很直觀的,以下便是讀取ADC的程序:

#include "stm32f4xx.h"#include "stm32f4xx_hal.h"
ADC_HandleTypeDef hadc1;
void Error_Handler(void) { // 處理錯誤}
void SystemClock_Config(void) { // 配置系統時鐘}
void ADC_Config(void) { // 初始化ADC外設 hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = DISABLE; hadc1.Init.ContinuousConvMode = ENABLE; // 連續模式,以便不斷地測量電壓 hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.NbrOfDiscConversion = 0; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); }
// 配置ADC通道 ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_0; // 選擇要讀取的ADC通道 sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_84CYCLES; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); }}
int main(void) { HAL_Init(); SystemClock_Config(); ADC_Config();
// 啟動ADC轉換 if (HAL_ADC_Start(&hadc1) != HAL_OK) { Error_Handler(); }
uint32_t adcValue; while (1) { // 等待ADC轉換完成 if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) { // 讀取ADC數據寄存器 adcValue = HAL_ADC_GetValue(&hadc1); // 判斷電壓值來判斷是高電平、低電平還是方波信號 } }}

方法二:外部中斷

如果是方波,外部中斷肯定會觸發,外部電路是上拉,我們需要將STM32配置成上拉,下降沿觸發外部中斷。在1s內如果有中斷被觸發就是方波,否則就是高或者低電平,以下是HAL的示例代碼:

#include "stm32f4xx.h" #include "stm32f4xx_hal.h"
void Error_Handler(void) { // 處理錯誤}
void SystemClock_Config(void) { // 配置系統時鐘}
void EXTI_Config(void) { // 配置外部中斷 __HAL_RCC_GPIOA_CLK_ENABLE(); // 啟用GPIOA時鐘 __HAL_RCC_SYSCFG_CLK_ENABLE(); // 啟用SYSCFG時鐘
GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; // 配置外部中斷引腳,例如GPIOA的引腳0 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; // 上升沿和下降沿觸發外部中斷 GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉電阻 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置外部中斷線 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // 配置中斷優先級 HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 啟用外部中斷
// 配置外部中斷觸發 EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.Line = EXTI_LINE_0; // 配置外部中斷線 EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT; EXTI_InitStruct.Trigger = EXTI_TRIGGER_RISING_FALLING; // 上升沿和下降沿觸發 HAL_EXTI_SetConfigLine(&EXTI_InitStruct);}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { // 外部中斷回調函數,當外部中斷觸發時執行
// 在這里可以執行你的方波信號檢測邏輯 // 如果外部中斷觸發,表示方波信號 // 否則,表示高電平或低電平}
int main(void) { HAL_Init(); SystemClock_Config(); EXTI_Config();
while (1) { // 在這里可以執行其他任務 }}

方法三:讀取方波的頻率和占空比

這個是直接的,也是最直觀的,我們還可以額外知道該方波的一些信息。以下是示例代碼:

#include "stm32f4xx.h"#include "stm32f4xx_hal.h"
TIM_HandleTypeDef htim2;uint32_t highPulse = 0;uint32_t lowPulse = 0;uint32_t period = 0;uint32_t frequency = 0;float dutyCycle = 0.0f;
void Error_Handler(void) { // 處理錯誤}
void SystemClock_Config(void) { // 配置系統時鐘}
void TIM2_Config(void) { // 初始化定時器2 (TIM2) htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFFFFFF; // 設置定時器周期為最大值 if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); }}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 每當定時器2溢出時執行
// 更新方波頻率和占空比的測量值 frequency = HAL_RCC_GetPCLK1Freq() / (period + 1); dutyCycle = (float)highPulse / (period + 1); highPulse = 0; lowPulse = 0; }}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 每當定時器2的捕獲比較中斷時執行
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) { // 當外部信號為高電平時執行 highPulse = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1); } else { // 當外部信號為低電平時執行 lowPulse = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1); period = highPulse + lowPulse; } }}
int main(void) { HAL_Init(); SystemClock_Config(); TIM2_Config();
// 配置外部中斷線 __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置外部中斷引腳 EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.Line = EXTI_LINE_0; EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT; EXTI_InitStruct.Trigger = EXTI_TRIGGER_RISING_FALLING; HAL_EXTI_SetConfigLine(&EXTI_InitStruct);
// 配置中斷優先級 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);
// 啟動定時器 if (HAL_TIM_Base_Start(&htim2) != HAL_OK) { Error_Handler(); }
while (1) { // 在這里可以執行其他任務 }}

以上就是想到的3種方法,歡迎方法補充,最后如果你知道方波的頻率和占空比,還有一個方法,你知道嗎?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 方波
    +關注

    關注

    4

    文章

    81

    瀏覽量

    33473
  • 低電平
    +關注

    關注

    1

    文章

    157

    瀏覽量

    13552
  • 高電平
    +關注

    關注

    6

    文章

    178

    瀏覽量

    21828
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    THS1206測試data_av信號輸出的高電平和低電平都是mv級別的,請問是什么情況呢?

    您好,我在使用THS1206,AVDD=5V,BVDD=DVDD=3.3V; 輸入時鐘為3MHZ,和FPGA進行連接; 測試data_av信號輸出的高電平和低電平都是mv級別的,請問是什么情況呢?
    發表于 02-14 08:25

    TTL電平高電平信號的轉換

    在電子工程領域,信號電平的轉換是一個常見的需求,尤其是在不同技術標準之間。TTL(晶體管-晶體管邏輯)電平和高電平信號是兩種不同的電平標準,它們在電壓水
    的頭像 發表于 01-16 10:28 ?640次閱讀

    TTL電平低電平信號的區別

    在數字電子學中,信號的傳輸和處理依賴于電壓水平來表示邏輯狀態。TTL電平和低電平信號是兩種常見的電壓水平,它們在數字電路中扮演著重要的角色。 TTL電平 TTL電平是一種廣泛使用的數字
    的頭像 發表于 01-16 10:21 ?694次閱讀

    為什么ISO7230M輸入高電平時輸出確偶發了低電平

    示波器通道1監測輸入通道A(input)一直為高電平高電平時偶爾有干擾,但是示波器通道2監測輸出通道A(output)由高電平變為了低電平。而
    發表于 01-13 06:52

    ADS1224怎么實現對一個頻率為5hz低電平為0v,高電平為2v的方波進行采樣?

    怎么實現對一個頻率為5hz低電平為0v,高電平為2v的方波進行采樣,怎么樣才能只采集2v的高電平?謝謝
    發表于 11-20 08:21

    啟動ADC converter,EOC同時由高電平變為低電平,Teoc為0us,為什么?

    我們的START和ALE連接到一個管腳,使用STC89C52控制,ADC的時鐘為28K,啟動ADC轉換即Star由低電平變為高電平后,EOC也立即由高電平變為低電平,TEOC的延遲時
    發表于 11-19 07:10

    高電平輸入和低電平輸入是什么意思

    ”。 1. 數字信號基礎 數字信號是電子系統中用來表示信息的電壓或電流的變化。在最簡單的形式中,數字信號只有兩種狀態:高電平和低電平。這些狀態對應于二進制數字系統中的“1”和“0”。 1.1 高電平輸入
    的頭像 發表于 10-17 14:56 ?6200次閱讀

    rca輸出是低電平還是高電平

    (黃色插頭)。這些連接器通常用于連接家庭影院系統、音響設備、游戲機和其他多媒體設備。 關于RCA輸出是低電平還是高電平,這實際上是一個關于信號電平的問題。在電子學中,電平通常指的是信號
    的頭像 發表于 10-17 11:01 ?1859次閱讀

    雙色led燈的引腳為高電平還是低電平

    雙色LED燈的引腳電平高電平低電平)取決于其電路設計和控制方式。雙色LED燈通常包含兩個LED芯片(如紅色和綠色),它們共用一個引腳(共陰或共陽),另外兩個引腳則分別控制這兩個LED芯片的開關。
    的頭像 發表于 10-01 17:25 ?1961次閱讀

    芯片引腳懸空是高電平還是低電平

    芯片引腳懸空時的電平狀態(高電平低電平)并不是一個固定答案,它取決于多個因素,包括芯片類型、生產廠家、引腳特性以及周圍電路環境等。 首先,從邏輯門電路的角度來看,當引腳懸空時,其電平
    的頭像 發表于 08-28 09:55 ?3946次閱讀

    OPA690運放構成方波發生電路,方波低電平幅值較大,為什么?

    從仿真上看,輸出的方波低電平近似為零,但是按照圖中參數搭出的電路進行測試,發現方波低電平幅值較大,約為1V左右,這個方波是要輸給后端的
    發表于 08-22 07:11

    TLV3502輸出電平錯誤的原因?

    芯片的3.3V的供電正常,但是輸出的電平高電平和低電平電壓均不對。如下圖1所示,方波為比較器的輸出信號OUTA,高電平為1V,
    發表于 07-29 08:03

    高電平和低電平輸入有什么區別

    在數字電子學中,高電平和低電平是兩種基本的信號狀態,它們分別代表二進制數字1和0。這兩種電平狀態在數字電路設計、通信和計算機系統中扮演著至關重要的角色。 高電平和
    的頭像 發表于 07-23 11:25 ?8378次閱讀

    電平dcdc拓撲結構有幾種

    的開關狀態,實現輸入電壓與輸出電壓之間的轉換。三電平DC-DC拓撲結構的基本原理是利用三個電平的電壓來實現輸入電壓與輸出電壓之間的轉換。 在三電平DC-DC拓撲結構中,輸入電壓被分為三個電平
    的頭像 發表于 07-12 09:45 ?2407次閱讀

    示波器探頭電容對信號低電平抬高的影響原因及解決方法

    示波器探頭是一種用于測量電信號的探頭,由于探頭本身的電容,可能會導致信號低電平抬高。本文將介紹示波器探頭電容對信號低電平抬高的影響原因及解決方法。 1. 探頭電容對信號低電平抬高的影響
    的頭像 發表于 05-20 11:10 ?813次閱讀
    示波器探頭電容對信號<b class='flag-5'>低電平</b>抬高的影響原因及解決<b class='flag-5'>方法</b>
    主站蜘蛛池模板: 黄色三级视频在线观看 | 中文字幕久久精品波多野结 | 婷婷四房播客五月天 | 日本免费成人 | 日韩免费高清一级毛片 | aaa一区二区三区 | 日韩在线免费看网站 | 亚洲精品91香蕉综合区 | 91大神亚洲影视在线 | 色图综合网 | 国产一级真人毛爱做毛片 | 亚洲福利片 | 免费的黄色的视频 | 日本特黄特色 | 在线播放ww | 色狠狠xx| 天天干天天插天天 | 99色在线观看 | 优优色综合 | 日本网站免费观看 | 国产精品女人在线观看 | 激情六月综合 | 操到喷水 | 亚洲男人的天堂久久香蕉网 | 午夜综合| 在线免费看高清视频大全 | 黄色片网站日本 | 午夜精品在线视频 | 天天操天天干天天爽 | 欧美疯狂爱爱xxxxbbbb | 亚洲va老文色欧美黄大片人人 | 岛国大片在线 | 草草操| 赛罗奥特曼银河帝国普通话免费版 | 四虎永久免费最新在线 | 国产福利萌白酱喷水视频铁牛 | 亚欧乱色束缚一区二区三区 | 黄色在线免费看 | 亚洲精品乱码久久久久久蜜桃图片 | 美女视频很黄很暴黄是免费的 | 久久99精品久久久久久久野外 |