stm32怎么实现 pulseIn 请示例

在STM32中实现pulseIn函数,需要使用定时器来测量输入信号的脉冲宽度。下面是一个基于STM32 HAL库的示例代码,演示如何实现pulseIn函数:

#include "stm32f1xx_hal.h"

// 定义定时器和GPIO口
TIM_HandleTypeDef htim2;
#define Input_Pin GPIO_PIN_0
#define Input_Port GPIOA

// 定义pulseIn函数
uint32_t pulseIn(uint16_t pin, uint8_t state, uint32_t timeout)
{
    uint32_t start = HAL_GetTick();
    uint32_t duration = 0;
    uint32_t previous = HAL_GetTick();

    // 配置GPIO口
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(Input_Port, &GPIO_InitStruct);

    // 配置定时器
    TIM_IC_InitTypeDef sConfigIC = {0};
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 72 - 1;
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 0xFFFF;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_IC_Init(&htim2);
    sConfigIC.ICPolarity = state ? TIM_INPUTCHANNELPOLARITY_RISING : TIM_INPUTCHANNELPOLARITY_FALLING;
    sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    sConfigIC.ICFilter = 0;
    HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);

    // 启动定时器
    HAL_TIM_Base_Start(&htim2);
    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

    // 等待输入信号变化或超时
    while (HAL_GetTick() - start < timeout && duration == 0) {
        if (HAL_GetTick() - previous > 10) {
            previous = HAL_GetTick();
            duration = __HAL_TIM_GET_COUNTER(&htim2);
        }
    }

    // 停止定时器
    HAL_TIM_IC_Stop_IT(&htim2, TIM_CHANNEL_1);
    HAL_TIM_Base_Stop(&htim2);

    return duration;
}

在上面的代码中,我们通过配置GPIO口为输入模式,然后配置定时器的输入捕获模式来测量输入信号的脉冲宽度。函数的参数包括输入引脚pin、输入信号的状态state(高电平或低电平)、以及等待超时时间timeout。函数返回值为输入信号的脉冲宽度,单位为微秒。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32水流量传感器是一种利用STM32单片机核心板、水流量传感器、LCD1602液晶显示、按键、蜂鸣器及电源等组成的系统。其主要功能包括实时显示瞬时流量和累计流量、设置累计流量阈值、报警、继电器控制水阀开关等。具体特点如下: 1. 水流量传感器采用椭圆齿轮传感器,能够准确测量水流量。 2. 通过液晶LCD1602液晶实时显示瞬时流量和累计流量、设置的累计流量,方便用户了解水流量情况。 3. 通过按键设置累计流量阈值,如果累计流量超过设置阈值,蜂鸣器报警、继电器断开,否则不报警继电器闭合,保证水流量在安全范围内。 4. 继电器模拟水阀开关,如果当前累计流量低于设置流量,打开继电器打开水阀的意思,方便用户控制水流量。 5. 按键有设置按键、设置+、设置-,在设置情况下可以对设置值进行加减运算,方便用户设置累计流量阈值。 代码示例: ```c //定义引脚 #define FlowPin PA0 #define RelayPin PA1 #define BeepPin PA2 #define Key1Pin PA3 #define Key2Pin PA4 #define Key3Pin PA5 //定义变量 float flow = 0; //瞬时流量 float total = 0; //累计流量 float setTotal = 100; //设置的累计流量 int alarm = 0; //报警标志 int relay = 0; //继电器状态 int key1 = 0; //设置按键状态 int key2 = 0; //设置+按键状态 int key3 = 0; //设置-按键状态 void setup() { pinMode(FlowPin, INPUT); pinMode(RelayPin, OUTPUT); pinMode(BeepPin, OUTPUT); pinMode(Key1Pin, INPUT_PULLUP); pinMode(Key2Pin, INPUT_PULLUP); pinMode(Key3Pin, INPUT_PULLUP); Serial.begin(9600); } void loop() { flow = pulseIn(FlowPin, HIGH); //读取瞬时流量 flow = flow / 7.5; //转换为L/min total += flow * 0.05; //累计流量 if (total >= setTotal) { //如果累计流量超过设置阈值 alarm = 1; //报警 digitalWrite(RelayPin, LOW); //继电器断开 digitalWrite(BeepPin, HIGH); //蜂鸣器报警 } else { alarm = 0; //不报警 digitalWrite(RelayPin, HIGH); //继电器闭合 digitalWrite(BeepPin, LOW); //蜂鸣器不报警 } key1 = digitalRead(Key1Pin); //读取设置按键状态 key2 = digitalRead(Key2Pin); //读取设置+按键状态 key3 = digitalRead(Key3Pin); //读取设置-按键状态 if (key1 == LOW) { //如果按下设置按键 while (digitalRead(Key1Pin) == LOW); //等待按键释放 delay(10); if (key2 == LOW) { //如果同时按下设置+按键 while (digitalRead(Key2Pin) == LOW); //等待按键释放 delay(10); setTotal += 10; //设置值加10 } else if (key3 == LOW) { //如果同时按下设置-按键 while (digitalRead(Key3Pin) == LOW); //等待按键释放 delay(10); setTotal -= 10; //设置值减10 } } Serial.print("Flow: "); Serial.print(flow); Serial.print(" L/min, Total: "); Serial.print(total); Serial.print(" L, SetTotal: "); Serial.print(setTotal); Serial.print(" L, Alarm: "); Serial.print(alarm); Serial.print(", Relay: "); Serial.println(relay); delay(50); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值