首页 > 其他分享 >STM32使用PWM制作呼吸灯

STM32使用PWM制作呼吸灯

时间:2025-01-16 21:58:47浏览次数:3  
标签:定时器 HAL 呼吸 STM32 TIM PWM RCC

一、引言

在 STM32 微控制器的众多应用中,PWM(脉冲宽度调制)功能是一项非常实用的技术。PWM 可以通过控制信号的占空比来实现对输出功率的精确控制,其应用范围广泛,从电机速度控制、灯光亮度调节到音频信号的生成等。其中,使用 PWM 制作呼吸灯是一个经典的入门示例,能够帮助我们很好地理解 PWM 的原理和 STM32 的相关配置与编程方法。呼吸灯效果通过不断改变 LED 的亮度,使其呈现出由暗到亮,再由亮到暗的渐变效果,就像人的呼吸一样,给人一种柔和、流畅的视觉感受。

二、PWM 原理概述

PWM 信号是一种周期性的方波信号,它的一个周期由高电平和低电平组成。占空比是指一个周期内高电平持续的时间与整个周期时间的比值,通常用百分比表示。通过改变占空比,可以改变平均输出电压,进而实现对连接到该输出的负载(如 LED)的功率控制。对于呼吸灯,我们将通过逐渐增加和逐渐减小占空比,使 LED 的亮度产生周期性的变化。

三、硬件连接

对于 STM32 微控制器,通常需要将一个 LED 连接到一个具有 PWM 功能的引脚。例如,在 STM32F4 系列中,可以使用 TIM(定时器)的输出比较通道来生成 PWM 信号。假设我们将一个 LED 的正极通过一个限流电阻连接到 STM32 的 PA8 引脚,该引脚可作为 TIM1 的通道 1 的输出。

四、STM32 软件实现

以下是使用 STM32 的 HAL 库实现呼吸灯的示例代码:

#include "stm32f4xx_hal.h"

// 定义定时器句柄
TIM_HandleTypeDef htim1;

// 定时器初始化函数
void MX_TIM1_Init(void)
{
    // 配置定时器基本参数
    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 0;
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 1000;
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    if (HAL_TIM_PWM_Init(&htim1)!= HAL_OK)
    {
        Error_Handler();
    }
}

// 配置 PWM 通道
void MX_PWM_Init(void)
{
    TIM_OC_InitTypeDef sConfigOC;

    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1)!= HAL_OK)
    {
        Error_Handler();
    }
}

// 错误处理函数
void Error_Handler(void)
{
    while(1);
}

// 启动 PWM
void PWM_Start(void)
{
    if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1)!= HAL_OK)
    {
        Error_Handler();
    }
}

// 呼吸灯函数
void Breath_Light(void)
{
    int i;
    for (i = 0; i < 1000; i++)
    {
        // 增加占空比,使 LED 变亮
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, i);
        HAL_Delay(1);
    }
    for (i = 1000; i > 0; i--)
    {
        // 减小占空比,使 LED 变暗
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, i);
        HAL_Delay(1);
    }
}

int main(void)
{
    HAL_Init();

    // 配置系统时钟
    SystemClock_Config();

    // 初始化定时器
    MX_TIM1_Init();
    // 初始化 PWM 通道
    MX_PWM_Init();
    // 启动 PWM
    PWM_Start();

    while (1)
    {
        // 调用呼吸灯函数
        Breath_Light();
    }
}

代码解释:

  1. 头文件引入
    • stm32f4xx_hal.h 是 STM32 的 HAL 库头文件,包含了操作 STM32 所需的各种函数和数据类型。
  2. 定时器句柄定义
    • TIM_HandleTypeDef htim1; 用于管理和操作 TIM1 定时器。
  3. 定时器初始化函数
    • MX_TIM1_Init() 函数对 TIM1 定时器进行初始化,设置其预分频器为 0,计数器模式为向上计数,周期为 1000。预分频器和周期的设置决定了 PWM 信号的频率。这里将 Period 设置为 1000 意味着计数器从 0 计数到 1000,形成一个周期。
  4. PWM 通道配置函数
    • MX_PWM_Init() 函数配置 TIM1 的通道 1 的 PWM 模式,初始脉冲宽度(占空比)为 0,输出极性为高电平,关闭快速模式。OCMode 设置为 TIM_OCMODE_PWM1 表示使用 PWM 模式 1,在该模式下,当计数器的值小于比较值时输出高电平,否则输出低电平。
  5. 错误处理函数
    • Error_Handler() 函数在出现错误时进入一个无限循环,便于调试时定位问题。
  6. 启动 PWM 函数
    • PWM_Start() 函数使用 HAL_TIM_PWM_Start() 启动 TIM1 的通道 1 的 PWM 输出。
  7. 呼吸灯函数
    • Breath_Light() 函数实现呼吸灯效果。首先通过一个 for 循环将占空比从 0 逐渐增加到 1000(对应 Period),每次增加后调用 HAL_Delay(1) 延迟 1 毫秒,使 LED 逐渐变亮。然后另一个 for 循环将占空比从 1000 逐渐减小到 0,使 LED 逐渐变暗。

五、配置系统时钟

为了保证定时器和 PWM 功能正常工作,需要正确配置系统时钟。以下是一个简单的系统时钟配置示例:

void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    // 配置时钟源
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStruct.PLL.PLLM = 16;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
    RCC_OscInitStruct.PLL.PLLQ = 4;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
    {
        Error_Handler();
    }

    // 配置系统时钟
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5)!= HAL_OK)
    {
        Error_Handler();
    }
}

代码解释:

  1. 时钟源配置
    • RCC_OscInitStruct 结构体用于配置时钟源,这里使用内部高速时钟(HSI)作为输入,开启 PLL 并设置其参数,将其倍频到更高频率,以满足系统和定时器的时钟需求。
  2. 系统时钟配置
    • RCC_ClkInitStruct 结构体用于配置系统时钟的不同分频器,包括 HCLK、SYSCLK、PCLK1 和 PCLK2 的分频,以确保各个模块得到合适的时钟频率。

六、注意事项

  1. 确保硬件连接正确,特别是 LED 的极性和限流电阻的取值,以防止损坏 LED 和 STM32 引脚。
  2. 对于不同的 STM32 型号,定时器和 PWM 引脚的映射可能不同,需要根据具体的数据手册进行调整。
  3. 在配置定时器和 PWM 时,要根据所需的 PWM 频率和分辨率来调整预分频器和周期的值。例如,如果需要更高的频率,可以减小周期并适当调整预分频器;反之,如果需要更高的分辨率,可以增大周期。

七、总结

通过使用 STM32 的 PWM 功能,我们可以方便地实现呼吸灯效果,这个示例展示了如何使用 HAL 库对定时器进行初始化和配置,如何设置 PWM 通道,以及如何通过改变占空比来实现 LED 亮度的渐变。在实际开发中,可以根据具体的需求对 PWM 的频率、占空比范围和呼吸灯的速度进行调整。同时,PWM 技术在其他许多领域都有广泛的应用,理解和掌握 PWM 的原理和实现方法对于 STM32 的开发非常重要。

上述代码只是一个基础示例,在实际应用中,可能需要根据不同的 STM32 系列和具体的应用场景进行优化和扩展。例如,可以使用中断来控制 PWM 的更新,避免使用 HAL_Delay() 函数,以提高系统的实时性和效率。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

标签:定时器,HAL,呼吸,STM32,TIM,PWM,RCC
From: https://blog.csdn.net/duierrorshuobu/article/details/145192772

相关文章

  • STM32 RTC 功能详解与代码示例
    一、引言STM32微控制器的实时时钟(RTC)功能在许多应用中都非常重要,它允许设备保持精确的时间和日期信息,即使在系统断电或复位后,只要有备用电源(如锂电池)为RTC供电,就能继续运行。这对于需要时间戳、定时任务、日历功能以及其他需要精确时间信息的应用程序来说是必不可少的,例......
  • stm32与昆仑通态modbus通讯
    一、引言在工业自动化和物联网等领域,STM32微控制器和昆仑通态人机界面(HMI)的组合应用十分广泛。为了实现它们之间的数据交换和设备控制,通常采用Modbus通信协议。Modbus是一种简单且通用的通信协议,支持多种物理接口,如RS-485、RS-232和TCP/IP等,其具有易于实现、开放性......
  • STM32H563 HAL库 LWIP裸机移植
    一、STM32H563与LWIP简介STM32H563是STMicroelectronics推出的一款高性能32位微控制器,具有丰富的外设和强大的处理能力,适用于各种复杂的嵌入式系统应用。LWIP(LightweightIP)是一个小型开源的TCP/IP协议栈,旨在为嵌入式系统提供轻量级的网络功能,它能够在资源有限的......
  • STC12单片机设置50Hz的PWM波驱动舵机
    STC12单片机设置50Hz的PWM波驱动舵机一、引言在机器人控制、航模制作以及各种自动化设备领域,舵机作为一种关键的执行元件,能够精准地控制角度,实现诸如机械臂关节运动、模型转向等功能。而使用STC12单片机来产生50Hz的PWM波驱动舵机,是一种经济高效且灵活的方案。STC12系列单......
  • 动画+使用动画实现呼吸效果
    <动画>---->使用@keyframes+动画名字,动画的改变可以从from到to,或者是从0%到100%变化,变化不知可以变化背景颜色,还可以变化包括      长高之类的CSS属性      在对应的盒子中添加animation属性,animation:name(设置动画的名称)duration(设置动画的持......
  • STM32F103使用flash_algo解析FLM相关
    1、全局区(.bss段和.data段)根据实际情况修改2、栈顶地址根据实际情况修改/*FlashOSRoutines(AutomagicallyGenerated)*Copyright(c)2009-2015ARMLimited*/#include"flash_blob.h"//代码区flash_code[]使用JLINK/STLINK等放到RAM,一般是0x20000000staticconst......
  • stm32 无源蜂鸣器实验 播放音乐 猪八戒背媳妇
    前言在8051及stm32各类教辅资料中,均有无源蜂鸣器相关的实验。可以通过单片机控制无源蜂鸣器发出指定频率和时长的声音,从而实现播放音乐的功能。在以往的此类案例中,乐谱的谱写非常不方便,除了案例提供的乐谱数据外,学者要将一个其它的简谱转换成单片机可以播放的数据,基本不可......
  • STM32简介
    1、STM32是基于ARM-Cortex-M内核开发的32位微控制器。STM32分为高性能系列,主流系列,低功耗系列、无线系列:视频采用STM32F1系列高性能系列:STM32F2,F4,F7,H7(3224内核跑分,双核微控制器=550MHz的Cortex-M7+240MHz的Cortex-M4)2、ARM内核型号:经典ARM处理器:ARM7、ARM9、ARM11Corte......
  • 基于STM32的AI物联网计算实现指南
    基于STM32的AI物联网计算实现指南版权所有©深圳市为也科技有限公司摘要随着人工智能(AI)和物联网(IoT)的快速发展,智能设备在各行各业中的应用日益广泛。STM32系列微控制器凭借其高性能、低功耗和丰富的外设接口,成为实现AI物联网计算的理想选择。本文将全面介绍如何利用S......
  • 基于STM32控制VS1053B芯片的音频处理开发指南
    基于STM32控制VS1053B芯片的音频处理开发指南版权所有©深圳市为也科技有限公司摘要VS1053B是由VLSISolution推出的一款功能强大的音频编解码芯片,广泛应用于音频播放器、语音记录设备和其他嵌入式音频应用中。结合STM32微控制器,开发者可以实现高质量的音频处理功能......