chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

撞上電子 ? 2023-11-07 08:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

讀取某一個(gè)上拉電平信號(hào),它可能輸出是低電平,可能是高電平,可能是方波,并且這個(gè)方波不知道頻率何占空比,那么如何來(lái)通過(guò)程序來(lái)判斷呢?高電平和低電平都好說(shuō),利用HAL庫(kù)讀取即可,如下:

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

重點(diǎn)是方波,如何讀取方波信號(hào)呢?

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

#include "stm32f4xx.h"#include "stm32f4xx_hal.h"
ADC_HandleTypeDef hadc1;
void Error_Handler(void) { // 處理錯(cuò)誤}
void SystemClock_Config(void) { // 配置系統(tǒng)時(shí)鐘}
void ADC_Config(void) { // 初始化ADC外設(shè) 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; // 連續(xù)模式,以便不斷地測(cè)量電壓 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();
// 啟動(dòng)ADC轉(zhuǎn)換 if (HAL_ADC_Start(&hadc1) != HAL_OK) { Error_Handler(); }
uint32_t adcValue; while (1) { // 等待ADC轉(zhuǎn)換完成 if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) { // 讀取ADC數(shù)據(jù)寄存器 adcValue = HAL_ADC_GetValue(&hadc1); // 判斷電壓值來(lái)判斷是高電平、低電平還是方波信號(hào) } }}

方法二:外部中斷

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

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

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

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

#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) { // 處理錯(cuò)誤}
void SystemClock_Config(void) { // 配置系統(tǒng)時(shí)鐘}
void TIM2_Config(void) { // 初始化定時(shí)器2 (TIM2) htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFFFFFF; // 設(shè)置定時(shí)器周期為最大值 if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); }}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 每當(dāng)定時(shí)器2溢出時(shí)執(zhí)行
// 更新方波頻率和占空比的測(cè)量值 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) { // 每當(dāng)定時(shí)器2的捕獲比較中斷時(shí)執(zhí)行
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) { // 當(dāng)外部信號(hào)為高電平時(shí)執(zhí)行 highPulse = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1); } else { // 當(dāng)外部信號(hào)為低電平時(shí)執(zhí)行 lowPulse = __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1); period = highPulse + lowPulse; } }}
int main(void) { HAL_Init(); SystemClock_Config(); TIM2_Config();
// 配置外部中斷線(xiàn) __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);
// 配置中斷優(yōu)先級(jí) HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);
// 啟動(dòng)定時(shí)器 if (HAL_TIM_Base_Start(&htim2) != HAL_OK) { Error_Handler(); }
while (1) { // 在這里可以執(zhí)行其他任務(wù) }}

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 方波
    +關(guān)注

    關(guān)注

    4

    文章

    82

    瀏覽量

    34164
  • 低電平
    +關(guān)注

    關(guān)注

    1

    文章

    233

    瀏覽量

    13838
  • 高電平
    +關(guān)注

    關(guān)注

    6

    文章

    224

    瀏覽量

    22533
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    TPS3824-Q1 高電平和低電平有效,汽車(chē)電壓監(jiān)控器(復(fù)位IC)帶看門(mén)狗和手動(dòng)復(fù)位技術(shù)手冊(cè)

    閾值電壓 VIT? 以下,電源電壓監(jiān)控器就會(huì)監(jiān)控 VDD 并保持 RESET 低電平。內(nèi)部定時(shí)器延遲輸出返回到非活動(dòng)狀態(tài) (高),以驗(yàn)證系統(tǒng)復(fù)位是否正確。延遲時(shí)間 td 在 VDD 上升到閾值電壓 VIT - 以上后開(kāi)始。當(dāng)電源電壓降至閾值電壓 VIT? 以下時(shí),輸出再次變?yōu)橛行?(
    的頭像 發(fā)表于 04-11 18:01 ?617次閱讀
    TPS3824-Q1 <b class='flag-5'>高電平和</b><b class='flag-5'>低電平</b>有效,汽車(chē)電壓監(jiān)控器(復(fù)位IC)帶看門(mén)狗和手動(dòng)復(fù)位技術(shù)手冊(cè)

    THS1206測(cè)試data_av信號(hào)輸出的高電平和低電平都是mv級(jí)別的,請(qǐng)問(wèn)是什么情況呢?

    您好,我在使用THS1206,AVDD=5V,BVDD=DVDD=3.3V; 輸入時(shí)鐘為3MHZ,和FPGA進(jìn)行連接; 測(cè)試data_av信號(hào)輸出的高電平和低電平都是mv級(jí)別的,請(qǐng)問(wèn)是什么情況呢?
    發(fā)表于 02-14 08:25

    ADS1198 DRDY并沒(méi)有自動(dòng)變成高電平,而是一直維持在低電平,為什么?

    手冊(cè)上說(shuō)DRDY會(huì)在SCLK的下降沿自動(dòng)變成高電平(DRDY s pulled high at the falling edge of SCLK),但為什么我做了幾次后發(fā)現(xiàn)DRDY并沒(méi)有自動(dòng)變成高電平,而是一直維持在低電平。
    發(fā)表于 02-06 07:14

    DAC7565 SYNC這個(gè)IO腳在常態(tài)應(yīng)該置為低電平還是高電平?

    手冊(cè)中關(guān)于SYNC的描述是:SYNC低電平時(shí)使能輸入移位寄存器,SYNC需要保持低電平到接收玩24個(gè)SCLK周期才能更新DA輸出,如果沒(méi)到24個(gè)SCLK周期就變?yōu)?b class='flag-5'>高電平,輸入移位寄存器將復(fù)位。 我
    發(fā)表于 02-05 09:31

    怎樣測(cè)量TTL電平電壓 TTL電平信號(hào)的特性分析

    。 使用示波器的垂直靈敏度(Volts/Division)和水平時(shí)間(Time/Division)旋鈕調(diào)整顯示范圍,使得信號(hào)穩(wěn)定地顯示在屏幕上。 連接探頭 : 將示波器的探頭連接到TTL信號(hào)輸出端,注意探頭的地線(xiàn)接示波器的地端,以確保測(cè)量的準(zhǔn)確性。 測(cè)量高電平和低電平
    的頭像 發(fā)表于 01-31 10:05 ?2000次閱讀

    TTL電平高電平信號(hào)的轉(zhuǎn)換

    在電子工程領(lǐng)域,信號(hào)電平的轉(zhuǎn)換是一個(gè)常見(jiàn)的需求,尤其是在不同技術(shù)標(biāo)準(zhǔn)之間。TTL(晶體管-晶體管邏輯)電平和高電平信號(hào)是兩種不同的電平標(biāo)準(zhǔn),它們?cè)陔妷核?/div>
    的頭像 發(fā)表于 01-16 10:28 ?1256次閱讀

    TTL電平噪聲容忍度分析

    定了高電平和低電平的具體范圍。在計(jì)算機(jī)處理器控制的設(shè)備內(nèi)部的數(shù)據(jù)傳輸中,TTL電平信號(hào)是理想的,其電平標(biāo)準(zhǔn)通常如下: 輸出高電平(H):大于
    的頭像 發(fā)表于 01-16 10:26 ?1700次閱讀

    TTL電平低電平信號(hào)的區(qū)別

    在數(shù)字電子學(xué)中,信號(hào)的傳輸和處理依賴(lài)于電壓水平來(lái)表示邏輯狀態(tài)。TTL電平和低電平信號(hào)是兩種常見(jiàn)的電壓水平,它們?cè)跀?shù)字電路中扮演著重要的角色。 TTL電平 TTL電平是一種廣泛使用的數(shù)字
    的頭像 發(fā)表于 01-16 10:21 ?1573次閱讀

    為什么ISO7230M輸入高電平時(shí)輸出確偶發(fā)了低電平?

    示波器通道1監(jiān)測(cè)輸入通道A(input)一直為高電平,高電平時(shí)偶爾有干擾,但是示波器通道2監(jiān)測(cè)輸出通道A(output)由高電平變?yōu)榱?b class='flag-5'>低電平。而
    發(fā)表于 01-13 06:52

    用信號(hào)發(fā)生器產(chǎn)生3.3V方波信號(hào),經(jīng)過(guò)16245電平轉(zhuǎn)換后得到的低電平卻是負(fù)電壓,如圖中CH2波形所示,為什么?

    用信號(hào)發(fā)生器產(chǎn)生3.3V方波信號(hào)(低電平為0V,高電平為3.3V),經(jīng)過(guò)16245電平轉(zhuǎn)換后得到的低電平卻是負(fù)電壓,如圖中CH2波形所示,
    發(fā)表于 12-11 06:26

    ADS1224怎么實(shí)現(xiàn)對(duì)一個(gè)頻率為5hz低電平為0v,高電平為2v的方波進(jìn)行采樣?

    怎么實(shí)現(xiàn)對(duì)一個(gè)頻率為5hz低電平為0v,高電平為2v的方波進(jìn)行采樣,怎么樣才能只采集2v的高電平?謝謝
    發(fā)表于 11-20 08:21

    啟動(dòng)ADC converter,EOC同時(shí)由高電平變?yōu)?b class='flag-5'>低電平,Teoc為0us,為什么?

    我們的START和ALE連接到一個(gè)管腳,使用STC89C52控制,ADC的時(shí)鐘為28K,啟動(dòng)ADC轉(zhuǎn)換即Star由低電平變?yōu)?b class='flag-5'>高電平后,EOC也立即由高電平變?yōu)?b class='flag-5'>低電平,TEOC的延遲時(shí)
    發(fā)表于 11-19 07:10

    關(guān)于cs1237發(fā)送時(shí)鐘高低電平延時(shí)較長(zhǎng)才能正確讀取ADC數(shù)據(jù)的問(wèn)題

    主控發(fā)送時(shí)鐘信號(hào)的高電平和低電平延時(shí)40us以上才能正確讀取數(shù)據(jù)線(xiàn)的電平,這是為什么呢?
    發(fā)表于 11-07 09:39

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

    ”。 1. 數(shù)字信號(hào)基礎(chǔ) 數(shù)字信號(hào)是電子系統(tǒng)中用來(lái)表示信息的電壓或電流的變化。在最簡(jiǎn)單的形式中,數(shù)字信號(hào)只有兩種狀態(tài):高電平和低電平。這些狀態(tài)對(duì)應(yīng)于二進(jìn)制數(shù)字系統(tǒng)中的“1”和“0”。 1.1 高電平輸入
    的頭像 發(fā)表于 10-17 14:56 ?9923次閱讀

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

    (黃色插頭)。這些連接器通常用于連接家庭影院系統(tǒng)、音響設(shè)備、游戲機(jī)和其他多媒體設(shè)備。 關(guān)于RCA輸出是低電平還是高電平,這實(shí)際上是一個(gè)關(guān)于信號(hào)電平的問(wèn)題。在電子學(xué)中,電平通常指的是信號(hào)
    的頭像 發(fā)表于 10-17 11:01 ?3198次閱讀