C语言-STM32:介绍PWM,并使用PWM实现呼吸灯

2024-05-11 15:12

本文主要是介绍C语言-STM32:介绍PWM,并使用PWM实现呼吸灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        1、什么是PWM

        PWM,全称为Pulse Width Modulation,中文名为脉冲宽度调制。这是一种模拟控制技术,通过改变脉冲信号的宽度来表征一个连续变量的平均值,通常用于对模拟信号的数字化控制,特别是在功率转换和信号处理中非常常见。以下是PWM的一些关键特性:

  1. 基本原理

    • PWM信号是由一系列宽度可变的脉冲组成,每个脉冲的周期是固定的,但高电平(导通)时间(脉冲宽度)是可以变化的。
    • 占空比(Duty Cycle)是脉冲宽度与周期的比例,通常以百分比表示。高占空比意味着更多的时间处于高电平状态,低占空比则相反。
  2. 应用

    • 电源管理:在电源转换器中,PWM用于控制输出电压的平均值,例如在开关电源中,通过改变开关元件的导通时间来调整输出电压。
    • 电机控制:在电机驱动系统中,通过改变PWM信号的占空比来调整电机的速度和扭矩。
    • LED亮度控制:在照明应用中,改变PWM信号的占空比可以调整LED的亮度,而不改变其工作电流的峰值。
    • 音频信号处理:在数字音频系统中,PWM可用于编码和解码音频信号。
    • 通信系统:在一些通信协议中,PWM可以作为数据传输的方式。
  3. 优点

    • 效率高:PWM技术允许高效地转换和控制电源,因为它通常在开关模式下操作,减少了能量损失。
    • 控制精度:通过精确调整占空比,可以实现精细的控制。
    • 简化电路:使用PWM可以简化模拟电路设计,因为许多功能可以通过数字逻辑来实现。
  4. 生成PWM

    • PWM信号通常由微控制器(如STM32系列)或其他数字逻辑设备生成,这些设备通常内置了PWM发生器模块,可以通过编程设置周期、占空比和其他参数。
  5. 实现

    • 在STM32等微控制器中,初始化一个定时器(如TIM2),设置预分频器、计数器周期和比较值,就可以生成PWM信号。通过比较单元,当计数值与比较值匹配时,输出状态会发生变化,从而形成不同宽度的脉冲。

        综上所述,PWM是一种广泛应用的数字调制技术,通过简单的数字信号实现对模拟信号的控制,广泛应用于各种电子设备和系统中。

        2、使用PWM实现呼吸灯

#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_tim.h"
#include "stm32f1xx_hal_gpio.h"TIM_HandleTypeDef htim3;
volatile uint32_t timerCounter = 0;int main(void) {// 初始化HAL库HAL_Init();// 系统时钟配置SystemClock_Config();// GPIO初始化,配置LED为推挽输出GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = LED_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);// 初始化TIM3为PWM__HAL_RCC_TIM3_CLK_ENABLE();htim3.Instance = TIM3;htim3.Init.Prescaler = 84 - 1; // 假设系统时钟72MHz,预分频因子为72-1htim3.Init.CounterMode = TIM_COUNTERMODE_UP;htim3.Init.Period = 10000 - 1; // 10ms周期,可以根据需要调整htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_PWM_Init(&htim3);TIM_PWMOutputStateTypeDef pwmState = TIM_OUTPUTSTATE_ENABLE;HAL_TIM_PWM_ConfigChannel(&htim3, &htim3.ChannelConfig[0], pwmState);HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);// 呼吸灯循环while (1) {for (timerCounter = 0; timerCounter <= 10000; timerCounter++) {// 设置PWM占空比,从0到100%HAL_TIM_PWM_SetPulse(&htim3, TIM_CHANNEL_1, timerCounter);HAL_Delay(1); // 延时1ms,使得变化更平滑}for (timerCounter = 10000; timerCounter > 0; timerCounter--) {HAL_TIM_PWM_SetPulse(&htim3, TIM_CHANNEL_1, timerCounter);HAL_Delay(1);}}
}

        当然,在实际使用时,还是需要进行驱动文件的封装和调用。

这篇关于C语言-STM32:介绍PWM,并使用PWM实现呼吸灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/979887

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr