STM32F103 TIM电容按键检测

STM32F103C8T6最小系统开发板使用HAL固件库,TIM电容按键检测控制LED灯亮灭

在本篇文章中,我们将介绍如何在STM32F103C8T6最小系统开发板上使用HAL固件库,通过TIM定时器进行电容按键检测,并控制PC13引脚连接的LED灯的亮灭。按键的触摸将会直接影响LED的开关。

1. 硬件设计

1.1 STM32F103C8T6最小系统开发板

STM32F103C8T6最小系统开发板是基于STM32F103C8T6芯片的开发板,具备多种常用外设,如GPIO、ADC、SPI、I2C、USART等。我们将利用该开发板的TIM定时器和GPIO功能来完成电容按键的检测与LED控制。

1.2 电容按键电路

电容按键一般由一个金属板、电容和一根电缆组成。通过使用定时器输入捕获功能,可以测量电容按键的电容变化,检测是否发生触摸事件。为简单起见,本篇教程假设电容按键已正确连接到定时器输入引脚(例如TIM2通道1)。

1.3 LED灯电路

PC13引脚通常用于STM32F103C8T6开发板上的LED灯控制。我们将使用该引脚来控制LED的点亮和熄灭。

2. TIM电容按键检测原理

TIM定时器可以配置为输入捕获模式,在检测到引脚电平变化时,能够记录下捕获的时间戳。通过分析捕获值的变化,可以判断电容按键是否被触摸。

在此例中,我们使用TIM2通道1作为输入捕获通道,检测电容按键的触摸。当按键被触摸时,电容值变化,TIM2会捕获到变化并触发中断。

3. 软件设计

3.1 配置GPIO

首先,配置PC13引脚为输出模式,用于控制LED灯。然后,通过初始化TIM定时器,设置为输入捕获模式,用于检测按键的触摸。

3.2 初始化TIM2输入捕获

我们通过TIM2的输入捕获模式读取电容按键的状态。通过设置定时器预分频器和计数周期,可以根据实际需求调整按键响应的速度。

3.3 中断处理

当TIM2捕获到一个时间戳后,我们判断电容按键的触摸情况。如果触摸事件发生,我们控制PC13引脚的LED灯亮起,否则熄灭LED。

4. 详细操作步骤及示例代码

4.1 系统初始化与时钟配置

void SystemClock_Config(void)
{
    // 系统时钟配置代码(根据具体需要设置)
}

4.2 GPIO初始化代码

void GPIO_Init(void)
{
    __HAL_RCC_GPIOC_CLK_ENABLE();  // 启用GPIOC时钟

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* 配置PC13引脚为输出,用于控制LED */
    GPIO_InitStruct.Pin = LED_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  // 推挽输出模式
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);  // 初始化PC13
}

4.3 TIM2初始化代码

void TIM2_Init(void)
{
    __HAL_RCC_TIM2_CLK_ENABLE();  // 启用TIM2时钟

    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 71;  // 设置预分频器
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 0xFFFF;  // 设置计数周期
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_IC_Init(&htim2);  // 初始化TIM2输入捕获

    /* 配置输入捕获通道 */
    sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING;
    sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    sConfigIC.ICFilter = 0x0F;
    HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);
}

4.4 启动TIM2输入捕获

void TIM2_IC_Start(void)
{
    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);  // 启动输入捕获并启用中断
}

4.5 TIM2中断处理程序

void TIM2_IRQHandler(void)
{
    if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_CC1) != RESET)
    {
        __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_CC1);  // 清除中断标志
        uint32_t capture_value = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);  // 读取捕获值

        /* 按键触摸检测逻辑 */
        if (capture_value > threshold_value)  // 如果捕获值大于设定阈值,认为按键被触摸
        {
            HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);  // 点亮LED
        }
        else
        {
            HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);  // 熄灭LED
        }
    }
}

4.6 主程序

int main(void)
{
    HAL_Init();  // 初始化HAL库
    SystemClock_Config();  // 配置系统时钟
    GPIO_Init();  // 初始化GPIO
    TIM2_Init();  // 初始化TIM2
    TIM2_IC_Start();  // 启动TIM2输入捕获

    while (1)
    {
        // 主循环
    }
}

4.7 编译并下载程序

stlink

  1. 连接 STLink-V2 到开发板。
  2. 使用 STM32CubeIDE 或 Keil 进行编译。
  3. 通过 STLink-V2 烧录程序。

5. 注意事项

  1. threshold_value 是用于判断电容按键是否被触摸的阈值。根据具体应用场景,可以通过实验来调整该值。
  2. 在实际应用中,可以通过调节定时器的预分频器和计数周期,来适配不同的按键响应速度和时间精度。
  3. 根据具体需求,可能需要修改GPIO的配置以及TIM2的其他参数,如输入捕获通道、滤波等。

6. 总结

通过本篇文章的学习,我们掌握了如何使用STM32F103C8T6最小系统开发板的TIM定时器功能进行电容按键的检测,并基于此实现了LED的亮灭控制。这个方案简单且高效,适合在各种嵌入式项目中应用。

posted @ 2025-02-07 15:52  jeikerxiao  阅读(278)  评论(0)    收藏  举报