软件实现PWM信号,LED闪烁

OrangePi ZERO 2 外设应用程序开发之PWM输出 PWM(Pulse Width Modulation)简称脉宽调制,根据相应载荷的变化来调制晶体管基极或 MOS 管栅极的偏置,来实现晶体管或 MOS 管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。说白了,PWM 也是一连串的脉冲列,它是一种特殊的方波。 阅读详情

【原创作品,转帖注明出处:blog.youkuaiyun.com/lanmanck】


假设一个GPIO接了一个LED,低电平就点亮LED。现在使用一个定时器,来实现LED的各种闪烁状态。

又假设一个闪烁波形为:1秒内闪2次,如下:

----|       |-----|       |-------------------

     |___|       |___|

     |(起始处)------------------------>|(1秒到)


我把每次定时器进来叫做一个step,这里假设定时器时间为100ms,以step为单位定义整个周期为total_period,定义亮的时间为on_period,定义灭的时间为off_period。

最后,还要定义亮多少次为blink_cnt.

因此,如果定义一个周期为1秒,则1个total_period=1000/100ms=10个step,这样比较好计算。例如上述波形,假设:

亮200ms,灭200ms,亮2次。

则

total_period = 1000/100ms=10,

on_period=200ms/100ms=2,

off_period=200ms/100ms=2.

变量定义好了,说下产生波形的思路。定义好一个数组,用来记录哪个step需要亮灯:

u8 steps_on[128];

例如上面波形,steps_on[0/1/4/5]都等于1表示亮灯,然后呢,在定时器里面每次step++,如果发现steps_on[step]==1,那就置低电平让LED亮,这就可以了!

那么,如何初始化steps_on[]呢?看代码:

int i,j,b_cnt=0,continue_cnt=0;
	for(i=0;i<total_period;i++){
		j = i%(on_period+off_period);

		/* 一个周期的开始 */
		if(j==0){
			if(b_cnt<blink_cnt){
				continue_cnt = 0;
				b_cnt++;

				if(continue_cnt<on_period){
					continue_cnt++;
					steps_on[i] = 1;
				}
			}
		}else {
			if(continue_cnt<on_period){
				continue_cnt++;
				steps_on[i] = 1;
			}
		}
	}

大体思路如下,在每次开始我就认为要点亮,然后记录这个step,因为点亮有时间,则使用on_period看到了没有,没有就记录一次,下次重复波形的时候就检查

是不是闪烁的次数够了,不够就继续记录。

最后实现定时器函数,比较简单了:

static int led_status=LED_STATUS_OFF;

	if(steps_on[steps] == LED_STATUS_ON){
		if(led_status!=LED_STATUS_ON){
			led_status = LED_STATUS_ON;
			led_on(GPIO_LED);
		}
	}
	else{
		if(led_status!=LED_STATUS_OFF){
			led_status = LED_STATUS_OFF;
			led_off(GPIO_LED);
		}
	}

	steps++;
	steps %= total_period;

讲的不是很明白,有问题欢迎探讨哈!


Arduino PWM调光改造24V LED灯串:实现随机呼吸灯效果 PWM(脉冲宽度调制)是一种通过快速开关控制信号占空比来调节平均功率的技术,广泛应用于LED调光、电机调速等领域。其原理是利用微控制器输出不同占空比的方波,控制开关器件的通断时间比例,从而实现对负载功率的线性调节。这项技术的核心价值在于高效、精准且不改变负载工作电压,避免了直接电压调光可能导致的颜色偏移或器件损坏。在智能照明、装饰灯光等场景中,PWM调光能轻松实现亮度渐变、动态效果。本文以Arduino Nano为核心,结合MOSFET驱动模块,详细展示了如何为24V LED灯串注入灵魂,通过随机算法和符合 阅读详情

相关推荐

MSL2100高精度LED驱动芯片:从恒流源到PWM调光的深度解析与应用实战

在LED显示与照明控制领域,恒流源和PWM调光是实现精准、稳定光输出的两大核心技术基石。恒流源通过闭环反馈机制,确保LED电流不受电压波动影响,为亮度一致性提供硬件保障;而数字PWM调光则通过调节脉冲占空比,高效、无级地控制灰度等级,是实现平滑渐变和丰富色彩的关键。这两项技术的结合,为高刷新率、高灰度等级的视觉应用创造了条件,尤其在Mini/Micro LED显示屏、专业舞台灯光及医疗照明等对色彩还原和稳定性要求极高的场景中价值凸显。本文以MSL2100这款8通道高精度驱动芯片为例,深入剖析其内部高精度恒流

weixin_31785177的博客 285

软件模拟PWM写法

软件模拟PWM推法

admwtf的博客 3532

高云GW5AT-LV60 FPGA开发套件与LED控制实战

FPGA(现场可编程门阵列)作为可重构硬件核心器件,通过硬件描述语言实现数字电路设计。其并行处理特性相比传统MCU在图像处理、工业控制等领域具有显著性能优势。高云GW5AT-LV60开发套件采用40nm工艺,集成60K逻辑单元和DSP模块,配合云源开发环境可快速实现外设驱动开发。以LED控制为例,通过Verilog实现基础闪烁、PWM调光及状态机控制,涉及引脚约束、时序分析和SignalTap调试等关键技术环节。开发过程中需特别注意跨时钟域信号处理与时序约束,这是确保FPGA设计稳定性的关键要素。

weixin_33835103的博客 314

实现PWM的方法

PWM(脉冲宽度调制)是一种模拟信号电平的数字编码方法,它通过改变一系列等幅矩形波(即脉冲序列)的占空比来调整输出信号的有效值。PWM技术广泛应用于从电机控制到LED亮度调节等各种应用中,因为它能够提供高效能和精确度。

qq_40698086的博客 1375

初学HAL库|利用PWM实现LED呼吸灯

基于STM32F103C8T6的HAL库学习,使用CubeMx生成初始化代码,利用PWM实现LED呼吸灯。

Na0H_的博客 3431

STM32 定时器控制LED闪烁&PWM完成呼吸灯

PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;它是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。

m0_74103610的博客 1525

一个TIMER软件模拟输出6个PWM

51单片机的timer很少,往往16bit的timer只有一个,可以硬件输出的channel也不多。只能使用软件模拟了。pwm是1-20ms一个周期,要是设置一个固定的周期,中断间隔就必须比较小,如0.01ms , 这个精度已经不怎么样了,但是每秒还是需要100000次中断,对于51来说,这个压力很大,实测效果很差。1. pwm需要每20ms对pin脚操作两次,周期开始设置它为1,到达指定时间时设置它为0,这个宽度,在航模的信号里,是1-2ms之间。我们将6个通道,每个分时3ms给它做这第一项的两次设置。

aerror的专栏 1051

基于STM32CubeMX和keil采用通用定时器中断实现固定PWM&可调PWM波输出分别实现LED闪烁与呼吸灯

上一篇博客里面写了基本定时器实现LED闪烁,主要就是一个预分频以及计数的使用,再加上一个电平翻转,原理以及具体操作比较简单。这篇博客选择通用定时器进行稍微难一点的效果演示,用到输出PWM波的功能。这篇博客写输出固定PWM以及可变PWM,进一步实现LED0闪烁以及LED0呼吸灯效果。PF9输出PWM波控制LED0闪烁,1s周期,0.5s改变一次状态。PF9输出PWM波控制LED0实现呼吸灯,一个时钟周期20ms。

Edwinwzy的博客 2671

简单明了的说明STM32的PWM原理以及实现方法

STM32的PWM 定时器2的pwm stm32f1的pwm

u014428915的博客 3077

Allegro 16.6 高级技巧实战:用Region规则和动态间距搞定高密度连接器布局布线

本文深入探讨了Allegro 16.6在高密度连接器布局布线中的高级技巧,重点介绍了Region规则和动态间距属性的应用。通过局部规则覆盖和分层控制,解决0.5mm以下引脚间距的布线难题,提升PCB设计效率和质量。

weixin_30352645的博客 439

逆变器方案(工频全套)工频正弦波逆变器开发板全套设计资

逆变器方案(工频全套)工频正弦波逆变器开发板,24V-72V通用12只TO-247封装MOS管,额定输出功率6500W以下;配有触摸屏操作界面,运行数据一目了然,带市电互补UPS功能,可选择电池优先或市电有限工作,我们的开发板均从实战角度出发,让您的学习更便捷,包含全套设计资料,PCB.原理图.源代码,程序均有中文注释,MCU选用美国微芯公的PIC-8位单片机,民用数字电源首选单片机,抗干扰能力强,运行稳定。...

m0_73494033的博客 892

使用定时器中断生成精准PWM波:驱动LED的实践指南

通过定时器中断技术实现高精度PWM波形输出,有效控制led亮度与闪烁频率,提升嵌入式系统中led响应的稳定性和可调性,适用于多种实时控制场景。

weixin_32252929的博客 1111

AD创建属于自己的元件库(详细)

我今天开始学习AD2022,但是我想自己创建属于自己的元件库,但是奈何找了好多教程就是随便几句话就把我打发走了,弄了一天都没搞定(也许是我比较菜),所以现在乱懂了,自己写一个属于我们自己小白的教程,希望有用吧哈哈我比较偷懒,直接使用嘉立创上画好的元件导入,和我们自己创建自己画的步骤其实都一样。

qq_33591173的博客 2万+

【STM32开发】PWM实现调光

本文详细介绍了基于STM32的PWM调光技术实现过程。首先阐述了PWM调光原理,包括频率和占空比的概念及其对LED亮度的影响。接着从硬件搭建到软件编程(使用STM32CubeMX和Keil MDK)逐步指导实现PWM调光,并提供了常见问题解决方案。文章还探讨了多通道调光、传感器联动等进阶应用,以及代码优化策略。最后展望了智能调光技术的发展前景,为电子爱好者和嵌入式开发者提供了实用指导。

大雨淅淅的博客 2298

立创·庐山派-K230-CanMV(嘉楠勘智)开发板通过ATK-ESP8266实现图像识别数据无线传输至原子云

本文详细介绍了如何使用立创·庐山派-K230-CanMV开发板,通过ATK-ESP8266 WIFI模块实现图像识别数据的无线传输至原子云平台。内容包括硬件连接、软件环境搭建、AT指令控制、原子云连接及数据上传的全过程,并提供了实用的调试技巧和常见问题解决方案,为物联网应用开发提供了完整实践指南。

potato的博客 742

unity pc运行包导入glb

本文介绍了在Unity中实现GLB/GLTF模型动态导入的方法。主要使用glTFast插件进行模型导入,配合StandaloneFileBrowser实现文件选择功能。文章提供了详细的插件安装方式(包括国内镜像源),并给出了核心导入脚本代码。脚本实现了模型加载、父对象设置、材质修复等功能,解决了常见的材质显示异常问题。该方法支持编辑器和PC平台,兼容不同版本的glTFastAPI,通过简易UI操作即可完成模型导入,适合需要运行时加载3D模型的Unity项目开发。

懒懒的蓝的博客 544

零基础入门硬件编程:用米思奇图形化工具实现Arduino LED闪烁

数字输出是微控制器编程中最基础且核心的概念之一,它定义了引脚在高低电平两种状态下的输出能力,是控制外部设备(如LED、继电器、电机驱动器)的底层机制。其原理是通过程序指令改变微控制器内部寄存器的值,从而控制对应引脚与电源或地之间的连接状态,实现电流的通断。掌握数字输出技术是构建任何嵌入式系统或物联网设备的基石,它直接应用于智能家居控制、机器人执行器驱动、工业自动化开关量输出等广泛场景。本文以Arduino开发板和米思奇图形化编程环境为例,通过实现经典的LED闪烁项目,直观演示了如何配置引脚模式、设置高低电平

weixin_34357887的博客 411

Arduino读取串口接收到的数据并发送数据

Arduino读取串口接收到的数据并发送数据 源程序: void setup() { Serial.begin(115200); } void loop() { String comdata ; while (Serial.available() > 0) { comdata += char(Serial.read()); delay(2); } if (comdata.length() > 0) { Serial.print("串口接收到的数据:"); Serial.println(comd

perseverance51博客 1万+

PIC单片机LPC开发板入门:从LED闪烁到ADC模拟信号读取实战

单片机是嵌入式系统的核心,通过GPIO(通用输入输出)实现数字信号控制,如驱动LED。其工作原理基于寄存器配置,通过设置方向寄存器(TRIS)控制引脚模式。模数转换器(ADC)则将连续模拟信号(如电压)转换为数字值,是连接物理世界与数字系统的关键技术,在传感器数据采集、工业控制中广泛应用。本文以PIC单片机LPC开发板为例,详解如何从零搭建开发环境,通过MPLAB X IDE和XC8编译器,完成从GPIO控制LED闪烁到配置ADC模块读取电位器信号的完整流程,并实现用ADC值动态控制LED亮度的软件PWM综

weixin_42531588的博客 301

SpringBoot系列之实现一个AI聊天助手

本文介绍了基于Spring Boot框架实现的AI聊天助手项目。该项目使用Spring Boot 3.2.3、Spring AI 1.0.0-M5等技术栈,集成DeepSeek-R1-Distill-Llama-8B模型实现智能对话功能。文章详细介绍了项目配置流程、运行方式和核心代码实现,包括ChatMessage模型类和服务类ChatService的关键功能,如消息处理、历史记录管理和AI响应获取等。读者可通过提供的GitHub链接获取完整代码,快速搭建自己的AI聊天应用。

Nicky's blog 1451

从 SM30 到 Fiori:在 SAP BTP ABAP Environment 里创建 Business Configuration 配置维护对象的完整路径

摘要 在SAP BTP的ABAP环境中,传统SAP GUI和SM30配置方式被Business Configuration (BC)替代。BC通过Fiori应用维护配置,支持传输和权限控制。配置表需满足可维护性条件,如允许数据维护、包含技术字段等。通过ADT生成Maintenance Object和Transport Object,实现配置发布与治理。权限管理需创建IAM App和Business Catalog,确保配置可维护。BC在云端延续了可控、可追溯、可发布的治理原则。 (字数:150)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 242

PWM --用按键控制 LED 的亮度

以前写过一篇关于 PWM 的博文,已经有一年了,链接如下:http://hi.baidu.com/do_sermon/item/ff523b0a8b9d3d173b53ee74文中使用了示波器来显示不同占空比的波形。其实,利用 LED 也能通过亮度来表现出 PWM 参数的变化,用实物进行测试,效果很好,但是用 PROTEUS 进行仿真试验,却只是看到闪烁的厉害,基本上看不出亮度的变化。近来发现,加

做而论道的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F103C8T6定时器实现led的周期闪烁及PWM实现流水灯

STM32f103系列一共有8个16位的定时器;其中TIM6、TIM7是基本定时器,TIM2、3、4、5是通用定时器,TIM1、8是高级定时器;这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,适用于工业控制领域。PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;

weixin_52650112的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

嵌入式STM32入门之定时器控制LED闪烁与产生PWM脉冲宽度调制信号

前面的实验中,我们学习了如何进行串口通信、中断的方式实现,但是在这之前的功能都是通过delay函数实现的。这种方式,相当于让CPU一直在做无用功,还不能做别的事情。这一节通过定时器的方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。定时器作为微控制器不可缺少的外设,在STM32中也是如此。相信不少初学者学到定时器的时候对STM32的学习热情就大打折扣甚至想要放弃了,因为这一部分知识确实比较复杂。

huang_527的博客 4554

STM32定时器实现LED闪烁、USART及输出PWM实现呼吸灯

r\n";

2201_75737320的博客 3975

STM32开发板使用PWM原理让LED闪烁

当然,这只是入门级的示例,你可以根据自己的需求扩展代码,实现更复杂的功能。在这个例子中,我们使用PA5引脚来控制LED的开关。代码逻辑很简单,先将PA5引脚设置为高电平(LED开启),然后延迟500毫秒,再将PA5引脚设置为低电平(LED关闭),再延迟500毫秒,如此循环。在LED控制中,我们可以通过PWM技术控制LED灯的亮度,或者通过改变信号频率实现LED的闪烁效果。在本文中,我将介绍如何使用STM32开发板以及相应的代码来实现LED的闪烁效果。接下来,我们将使用生成的代码实现LED的闪烁效果。

Azcz66的博客 1151
上一篇: 寄存器位读写,结构体位域定义,位域操作,位操作
下一篇: davinci 达芬奇 时钟驱动分析 dm365/dm368 struct clk
#Page#
博客等级 码龄23年 1691粉丝 360原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值