国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    82

    瀏覽量

    34564
  • 低電平
    +關注

    關注

    1

    文章

    238

    瀏覽量

    13987
  • 高電平
    +關注

    關注

    6

    文章

    225

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    一個MOSFET電平轉換電路原理

    電路原理很簡單,分兩種情況: 1.從A到B A為高電平時,MOS管關斷,B端通過上拉,輸出高電平; A為低電平時,MOS管內的體二極管導通,使MOS管的S極被拉低,從而使Vgs
    發表于 12-04 06:27

    解鎖PWM功能:ZMC900E主站控制器的高效應用指南

    。PWMPWM(脈沖寬度調制)是一種通過控制脈沖信號的寬度來調節輸出功率的技術。PWM信號是一種方波信號,它在高電平和低電平之間快速切換。通過改變高電平(脈沖寬度)的持續時
    的頭像 發表于 09-05 11:35 ?749次閱讀
    解鎖PWM功能:ZMC900E主站控制器的高效應用指南

    請問為什么M0519引腳的某些部分在配置為GPIO功能后無法將輸出控制到高電平低電平狀態?

    為什么M0519引腳的某些部分在配置為GPIO功能后無法將輸出控制到高電平低電平狀態?
    發表于 08-27 15:00

    當I/O上電初始配置為準高電平時,需要多少個下拉電阻來保持I/O低電平

    當I/O上電初始配置為準高電平時,需要多少個下拉電阻來保持I/O低電平
    發表于 08-26 07:40

    當I/O上電初始配置為準高電平時,需要多少個下拉電阻來保持I/O低電平呢?

    當I/O上電初始配置為準高電平時,需要多少個下拉電阻來保持I/O低電平
    發表于 08-21 07:54

    什么情況會導致BUFFER_RYD一直為低電平

    一直為低電平 按照“Detailed LVDS transaction diagram”中的流程,在完成“PHY and LINK training”后,BUFFER_RDY信號應該從低電平拉升
    發表于 08-14 06:21

    為什么 KT142C 芯片 BUSY 腳空閑高電平僅 0.2V?附低功耗模式配置指南

    文檔圍繞 KT142C 芯片 busy 引腳展開,該引腳為 15 腳 PA12,播放時輸出低電平,空閑時本應輸出 3.3V 高電平,但芯片空閑 5 秒進入 2μA 超低功耗狀態后,busy 腳呈高阻
    的頭像 發表于 06-16 09:38 ?1287次閱讀
    為什么 KT142C 芯片 BUSY 腳空閑<b class='flag-5'>高電平</b>僅 0.2V?附低功耗模式配置指南

    幾種電平轉換電路,適用于不同的場景

    ,I2Cdata/clk腳雙方直接通訊等。當器件的IO電壓不一樣的時候,就需要進行電平轉換,不然無法實現高低電平的變化。二.電平轉換電路常見的有幾種
    的頭像 發表于 05-12 19:33 ?1978次閱讀
    有<b class='flag-5'>幾種</b><b class='flag-5'>電平</b>轉換電路,適用于不同的場景

    電平轉換電路設計原理和常見問題及解決辦法

    原理分析 當輸入端3.3V為低電平時,D1導通,輸出端 1.8V為低電平,實現兩端都為低電平。當輸入端 3.3V為高電平時,D1截止,輸出端被 R1 上拉至 1.8V ,為
    發表于 04-27 15:54

    DS1232LPS-2+T&amp;R,在什么情況下,5腳RST會一直輸出高電平

    DS1232LPS-2+T&R,這款芯片在什么情況下,5腳RST會一直輸出高電平?(正常時序是上電有個400多ms的高電平后,一直處于低電平,如果7腳沒有及時喂狗,會觸發復位,也就是重復400多ms的
    發表于 04-18 07:51

    TPS3824-Q1 高電平和低電平有效,汽車電壓監控器(復位IC)帶看門狗和手動復位技術手冊

    閾值電壓 VIT? 以下,電源電壓監控器就會監控 VDD 并保持 RESET 低電平。內部定時器延遲輸出返回到非活動狀態 (高),以驗證系統復位是否正確。延遲時間 td 在 VDD 上升到閾值電壓 VIT - 以上后開始。當電源電壓降至閾值電壓 VIT? 以下時,輸出再次變為有效 (
    的頭像 發表于 04-11 18:01 ?927次閱讀
    TPS3824-Q1 <b class='flag-5'>高電平和</b><b class='flag-5'>低電平</b>有效,汽車電壓監控器(復位IC)帶看門狗和手動復位技術手冊

    為什么T4240的HRESET引腳總是低電平

    驗證: (1) 我們擦除了 CPLD 中的所有 logic 并使用 CPU 的默認值進行 RCW_SRC,全部設置為 1。上電后,我們測得 PORESET 信號為高電平,但 HRESET 保持低電平
    發表于 04-04 08:10

    如何在不使用DMA的情況下減少ECSPI CS高電平時間?

    我遇到了一個問題,即 Chip Select (CS) 在大約 5 μs 內保持高電平。 最初,在使用 DMA 時,我觀察到在 SCLK (串行時鐘)開始之前,CS 低電平時間延長了約 2.2 μs
    發表于 03-31 06:56

    硬件基礎篇——TTL與CMOS電平

    一、電平規范 1、名稱解釋Uoh -> 輸出高電平,Uol -> 輸出低電平;Uih -> 輸入高電平,Uil -> 輸入
    發表于 03-22 15:21

    變頻器是否有故障的方法判斷

    變頻器是否有故障用這幾種方法就可以輕松判斷,維修使用建議熟記?
    發表于 03-06 17:19 ?2次下載