NEMO937 QZX 2024-07-25 03:46 采纳率: 33.3%
浏览 353

关于STM32对射式红外传感器计次问题

为什么我这个红外传感器计次每次都加好多啊?有时一次加几百有时一次加几千。

img


我设置了下降沿触发,每次count++。难道不对吗?
听说要像按键一样设置延时消抖。

  • 写回答

4条回答 默认 最新

  • GISer Liu 2024-07-25 03:47
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    问题分析

    用户在使用STM32控制对射式红外传感器进行计次时,遇到了计次不准确的问题,具体表现为每次计次时数值增加过多,有时一次增加几百甚至几千。用户已经设置了下降沿触发,并在触发时执行count++操作。用户怀疑是否需要像按键一样设置延时消抖。

    关键点

    1. 下降沿触发:用户已经设置了下降沿触发,这是正确的。
    2. 计次不准确:每次计次时数值增加过多,可能是由于信号抖动或误触发。
    3. 延时消抖:用户提到是否需要像按键一样设置延时消抖。

    解决方案

    针对上述问题,我们可以通过以下步骤来解决:

    1. 确认硬件连接:确保红外传感器的输出信号线连接到STM32的正确GPIO引脚。
    2. 软件消抖:在软件层面进行消抖处理,避免误触发。
    3. 调试和验证:通过调试和验证确保计次准确。

    详细步骤

    1. 确认硬件连接

    确保红外传感器的输出信号线连接到STM32的正确GPIO引脚,并且传感器工作正常。

    2. 软件消抖

    在软件层面进行消抖处理,可以使用延时或状态机的方法。以下是一个基于延时消抖的示例代码:

    #include "stm32f10x.h"
    
    #define SENSOR_PIN GPIO_Pin_0
    #define SENSOR_PORT GPIOA
    
    volatile uint32_t count = 0;
    
    void GPIO_Configuration(void) {
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
        GPIO_InitStructure.GPIO_Pin = SENSOR_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 输入下拉
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SENSOR_PORT, &GPIO_InitStructure);
    }
    
    void EXTI_Configuration(void) {
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    
        EXTI_InitStructure.EXTI_Line = EXTI_Line0;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
    
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    }
    
    void EXTI0_IRQHandler(void) {
        if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
            static uint32_t last_time = 0;
            uint32_t current_time = SysTick_Val;
    
            if ((current_time - last_time) > 5000) { // 5ms消抖时间
                count++;
                last_time = current_time;
            }
    
            EXTI_ClearITPendingBit(EXTI_Line0);
        }
    }
    
    int main(void) {
        SysTick_Config(SystemCoreClock / 1000); // 配置SysTick每毫秒中断一次
        GPIO_Configuration();
        EXTI_Configuration();
    
        while (1) {
            // 主循环
        }
    }
    

    3. 调试和验证

    通过调试和验证确保计次准确。可以在每次计次时通过串口打印计次值,观察计次是否准确。

    总结

    通过上述步骤,可以有效解决红外传感器计次不准确的问题。关键在于软件消抖处理,确保每次触发都是有效的。希望以上解决方案能帮助用户解决问题。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论
编辑
预览

报告相同问题?

问题事件

  • 创建了问题 7月25日