STM8S003F3通过PWM波实现三基色呼吸灯
呼吸灯原理
呼吸灯原理呼吸灯,顾名思义,就像是一种具有呼吸般的灯光效果,它会在亮度逐渐增加和减小之间循环变化,给人一种柔和而温馨的感觉。
那么,呼吸灯是如何实现这样的灯光效果的呢?接下来,我们就来详细了解一下呼吸灯的原理。
首先,呼吸灯的原理是基于PWM(Pulse Width Modulation,脉宽调制)技术的。
PWM技术是一种通过改变信号的脉冲宽度来调节电平的技术,它可以实现对电路的精确控制。
在呼吸灯中,通过不断地改变LED灯的亮度,就可以实现呼吸般的灯光效果。
其次,呼吸灯的原理是通过控制LED灯的通电时间和断电时间来实现的。
当LED灯通电时间较长,断电时间较短时,灯光亮度就会逐渐增加;反之,当LED 灯通电时间较短,断电时间较长时,灯光亮度就会逐渐减小。
通过不断地改变LED灯的通断时间,就可以实现呼吸灯的灯光效果。
此外,呼吸灯的原理还涉及到人眼对光线变化的感知。
人眼对光线的感知是有一定延迟的,当灯光亮度逐渐增加时,人眼并不会立刻感知到亮度的变化,而是有一个过渡的时间;同样,当灯光亮度逐渐减小时,人眼也会有一个过渡的时间来感知亮度的变化。
因此,通过合理地控制LED灯的通断时间,就可以让人眼感知到一种呼吸般的灯光效果。
总的来说,呼吸灯的原理是基于PWM技术,通过控制LED灯的通断时间来实现灯光的呼吸效果,并利用人眼对光线变化的感知特性,使人们感受到柔和而温馨的光线变化。
这种原理不仅可以应用在家居照明中,也可以应用在舞台灯光、汽车灯光等领域,给人们带来更加舒适和温馨的光线体验。
希望通过本文的介绍,您对呼吸灯的原理有了更深入的了解,也可以在实际应用中更好地运用呼吸灯的效果,为人们带来更加舒适和温馨的光线体验。
单片机流水灯与呼吸灯结合
单片机流水灯与呼吸灯结合TWAS手把手教你做呼吸灯-基于51单片机学习板内容比较简单,发这个贴主要是针对新手!什么是呼吸灯?顾名思义,灯光在微电脑控制之下完成由亮到暗的逐渐变化,感觉像是在呼吸。
用专业的话来说是通过控制PWM的占空比来完成对LED亮度的控制什么是PWM和占空比?脉冲宽度调制(Pulse Width Modulation,简称PWM),是利用微处理器的数字输出来对模拟电路进行控制的一种技术。
占空比:高电平在一个周期之内所占的时间比率。
呼吸灯原理当一颗LED在高速闪烁,闪烁的频率已经超过了人眼的感知的范围,那么我们看到这颗LED就是一直亮的,也就是视觉暂留现象(余晖效应)。
如果我们控制一次闪烁中亮和灭的时间(修改占空比),就可以控制亮度。
代码实现:/******************************************************** 程序名称:main.c* 程序功能:实现呼吸灯的主程序文件* 程序作者:TWAS* 创建时间:2015-1-22* 修改时间:* 程序版本:V0.1*******************************************************//* 包含的头文件 */#include/* 寻址变量定义 */sbit LED_Drive = P3^5; /* 定义驱动LED的IO口,LED为共阳 *//******************************************************* 函数名称:main* 函数功能:主函数* 入口参数:NULL* 出口参数:NULL*******************************************************/int main(){unsigned char i;/* 初始化 */LED_Drive = 1;/* 主循环 */while(1){for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < 10){LED_Drive = 0;}else{LED_Drive = 1;}}}return 0;}/******************************************* 程序结束*****************************************/可以明显看出我们所控制的LED比电源灯暗许多,既然我们会控制亮度,想实现呼吸灯也就变的简单了代码实现:(为了节约空间和界面简洁,只贴出主要实现的部分)int main(){unsigned char i;unsigned char ucNum = 0; /* 新增两个变量,ucNum 控制占空比*/bit bAdd = 1; /* bAdd选择是增大占空比还是减小占空比 *//* 初始化 */LED_Drive = 1;/* 主循环 */while(1){for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < ucNum){LED_Drive = 0;}else{LED_Drive = 1;}/* 选择是增大占空比还是减小占空比 */if (1 == bAdd){ucNum++;}else{ucNum--;}/* 当Num等于200也就是最大值时,bAdd置0,Num开始减小*/if (200 == ucNum){bAdd = 0;}/* 当Num等于200也就是最大值时,bAdd置1,Num开始增大*/else if (0 == ucNum){bAdd = 1;}}return 0;}由于图片看不到效果,这个地方就不贴图了,根据测试,我们的所需要的功能实现了!但是这时候有的人就有疑问了,这是很普通的LED,那如果是特殊一点的呢?比如我所用的学习板上面,16颗LED是用595驱动的,那呼吸灯又该如何实现呢?其实很简单,我们把驱动LED的函数封装一下,直接替换,其它不变就行了!代码实现:(为了节约空间和界面简洁,只贴出主要实现的部分)for(i = 0; i < 200; i++){/* 外边的for循环共循环200次,前面10次点亮LED,后面180次熄灭LED* 通过修改if后面的值,就可以改变占空比*/if(i < ucNum){DriveLED(0x0003); /* LED驱动,点亮D1和D2 */}else{DriveLED(0x0002); /* LED驱动,熄灭D1点亮D2 */}}当我把程序改成这样的时候,出了一点问题,不能呼吸,变成闪烁了!等等,先把LED驱动部分发一下:/******************************************************* 函数名称:SendData* 函数功能:74HC595数据的发送* 入口参数:unsigned int uiDataOne, unsigned int uiDataTwo * 出口参数:void*******************************************************/void SendData(unsigned char ucDataOne, unsigned char ucDataTwo){unsigned int i = 0;/* 将片选信号置为低电平 */HC595RCK = 0;/* 输入第一个数据:uiDataOne */for (i = 0; i < 8; i++){/* 给出脉冲信号,首先将CLK置为0 */HC595CLK = 0;if (0 != (ucDataOne & 0x80)){HC595DATA = 1;}else{HC595DATA = 0;}/* 给出脉冲信号,首先将CLK置为1 */HC595CLK = 1;/* 准备第二个数据 */ucDataOne = ucDataOne << 1;}/* 输入第二个数据:uiDataTwo */for (i = 0; i < 8; i++){/* 给出脉冲信号,首先将CLK置为0 */HC595CLK = 0;if (0 != (ucDataTwo & 0x80)){HC595DATA = 1;}else{HC595DATA = 0;}/* 给出脉冲信号,首先将CLK置为1 */HC595CLK = 1;/* 准备第二个数据 */ucDataTwo = ucDataTwo << 1;}/* 将片选信号置为高电平 */HC595RCK = 1;}/******************************************************** * 函数名称:DriveLED* 函数功能:595驱动程序是分两个数据发的,* 本函数把它合并成一个数据* 入口参数:uiData:16颗LED需要显示的数据* 出口参数:NULL*******************************************************/void DriveLED(unsigned int uiData){SendData(uiData >> 8,uiData);}继续刚刚的问题,呼吸灯变成闪烁了,怎么回事呢?在程序逻辑上是没有问题的,我们只是更改了LED的驱动部分,看来就是LED驱动的问题了!先来Debug看一下,执行DriveLED这个函数,时间是接近400微妙,循环200次,就是差不多80毫秒,那么LED的闪烁频率为12.5HZ(都是大概的值,没有精确计算),还不足以形成视觉暂留现象。
呼吸灯的工作原理
呼吸灯的工作原理呼吸灯,是一种常见的LED灯光效果,其特点是灯光在亮度上的逐渐增加和逐渐减小,仿佛在呼吸一样,因此得名。
那么,呼吸灯是如何实现这一效果的呢?接下来,我们将深入探讨呼吸灯的工作原理。
首先,呼吸灯的工作原理与LED的调光技术密不可分。
LED(Light Emitting Diode)即发光二极管,是一种半导体器件,具有发光功能。
在呼吸灯中,LED的亮度是通过控制电流的大小来实现的。
一般来说,LED的亮度与电流成正比,因此,通过控制电流的大小,就可以实现LED的调光效果。
其次,呼吸灯的实现离不开PWM(Pulse Width Modulation)技术。
PWM技术是一种利用脉冲信号来调节电平的技术,通过控制脉冲信号的占空比,即高电平与低电平的时间比例,来实现对LED亮度的调节。
在呼吸灯中,通过不断改变PWM信号的占空比,可以实现LED灯光亮度的逐渐增加和逐渐减小,从而呈现出呼吸的效果。
此外,呼吸灯的工作原理还涉及到微控制器的应用。
微控制器是一种集成了处理器、存储器和各种输入输出接口的芯片,可以实现对LED灯光亮度的精确控制。
在呼吸灯中,通过编程控制微控制器,可以实现对PWM信号的精准调节,从而实现呼吸灯的效果。
总的来说,呼吸灯的工作原理是通过控制LED的亮度,利用PWM技术实现灯光的逐渐变化,再结合微控制器的精确控制,从而呈现出呼吸的效果。
这种工作原理不仅在LED灯光中得到了广泛应用,也为灯光设计带来了更多的创意和可能性。
通过以上的分析,我们对呼吸灯的工作原理有了更深入的了解。
希望本文能够帮助大家更好地理解呼吸灯的原理,并在实际应用中发挥更大的作用。
23. PWM呼吸灯实验
uint16_t TIM_OCNIdleState; //空闲状态下比较输出状态
} TIM_OCInitTypeDef;
普中STM32开发板带您进入ARM世界
如果我们要配置TIM3的CH1为PWM1模式,输出极性为低电平,并且使能 PWM输出,可以如下配置: TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OC1Init(TIM3,&TIM_OCInitStructure); //输出比较通道1初始化
普中STM32我们以ARR=8,CCRx=4为例进行介绍。第一阶段计数器CNT工作在递增 计数方式,从0开始计数,当TIMx_CNT < TIMx_CCRx时,PWM 参考信号 OCxREF为高电平,当TIMx_CNT >= TIMx_CCRx时,PWM 参考信号 OCxREF 为低电平。第二阶段计数器CNT工作在递减计数方式,从ARR开始递减计 数,当TIMx_CNT > TIMx_CCRx时,PWM 参考信号 OCxREF为低电平,当 TIMx_CNT <= TIMx_CCRx时,PWM 参考信号 OCxREF为高电平。
TIM_OCPreload); 第一个参数用于选择定时器,第二个参数用于选择使能还是失能输出比
较预装载寄存器,可选择为TIM_OCPreload_Enable、 TIM_OCPreload_Disable。 (7)使能 TIMx 在 ARR 上的预装载寄存器允许位 使能 TIMx 在 ARR 上的预装载寄存器允许位库函数是: void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState); 第一个参数用于选择定时器,第二个参数用于选择使能还是失能。
三路PWM呼吸灯程序及原理图
PWM三路呼吸灯系统主要是靠定时器产生最小时间,通过定时中断重装定时值和置位标记位22H。
总原理图中断按钮可以调节灯一(D3)的呼吸时间两位数码管显示灯的呼吸时间复位电路和晶振电路程序如下:ORG 0000HLJMP S00ORG 0003HLJMP ANORG 000BHLJMP DSQORG 0030HS00: SETB P2.0CLR P2.1CLR P2.2MOV IE,#83HSETB IT0MOV TMOD,#01HMOV TL0,#0DCHMOV TH0,#0BHSETB TR0MOV 30H,#00H //30H保存幅值MOV 31H,#00HMOV 32H,#00HMOV 33H,#04HCPL P2.4SETB 20HSETB 21HSETB 22HSETB 23HSS00: MOV C,22H //判断总刷新JNC S003CLR 22HSJMP S001S003: LJMP S030S001: CLR C //判断31H值,每段的加/减值MOV R2,30HCJNE R2,#00H,SS01SETB 20HMOV 31H,#5LJMP S019SS01: MOV A,30HSUBB A,#50JNC S010MOV 31H,#5S010: CLR CMOV A,30HSUBB A,#130JNC S012MOV 31H,#4SJMP S019S012: CLR CMOV A,30HSUBB A,#220JNC S013MOV 31H,#3SJMP S019S013: CLR CMOV A,30HSUBB A,#240JNC S014MOV 31H,#2SJMP S019S014: CLR CMOV R2,30HCJNE R2,#0FAH,S015CLR 20HS015: MOV 31H,#1S019: NOPS020: MOV C,20H //执行加/减JNC S021CLR CMOV A,30HADD A,31HMOV 30H,AMOV R2,ACJNE R2,#0FAH,S022CLR 20HLJMP S029S022: JNC S004SJMP S029S004: LJMP S00S021: CLR CMOV A,30HSUBB A,31HMOV 30H,AJC S100S100: CLR P2.0 //用于弥补减到最后不为零的数MOV P1,R2 //同时用于监测到不正常的数,重新执行LCALL DELAYSETB P2.0MOV 30H,#0SETB 20HLJMP S030S029: MOV A,30H //赋值给P1CLR P2.0MOV P1,ALCALL DELAYSETB P2.0S030: MOV C,23H //执行33H加减,同时计算32H单位时间的值JNC S039MOV C,21HMOV R2,33HJNC S031CJNE R2,#0AH,S032CLR 21HMOV 33H,#09HSJMP S035S032: INC 33HSJMP S035S031: CJNE R2,#01H,S033SETB 21HMOV 33H,#2SJMP S035S033: DEC 33HS035: MOV B,33HMOV A,#100DIV ABMOV 32H,A //赋值给32HS039: CLR 23HS040: //MOV C,23H //刷新显示//JNC S049MOV A,33HMOV B,#10DIV ABPUSH ACCMOV A,BMOV DPTR,#XSMOVC A,@A+DPTRSETB P2.1MOV P1,ALCALL DELAYCLR P2.1POP ACCMOV DPTR,#XSMOVC A,@A+DPTRSETB P2.2ANL A,#7FHMOV P1,ALCALL DELAYCLR P2.2S049: NOPS09: LJMP SS00DELAY: PUSH ACCPUSH PSWMOV A,R2PUSH ACCMOV A,R3PUSH ACCMOV R2,#10DE1: MOV R3,#50DE0: DJNZ R3,DE0DJNZ R2,DE1POP ACCMOV R3,APOP ACCMOV R2,APOP PSWPOP ACCRETAN: PUSH ACCPUSH PSWMOV A,R2PUSH ACCMOV A,R3PUSH ACCLCALL DELAYSETB 22HSETB 23HPOP ACCMOV R3,APOP ACCMOV R2,APOP PSWPOP ACCRETIDSQ: MOV TL0,#93HMOV TH0,#0FDHPUSH ACCPUSH PSWMOV A,R2PUSH ACCMOV A,R3PUSH ACCMOV A,34HCJNE A,#00H,DSQ0MOV A,32HMOV 34H,ASETB 22HSJMP DSQ9DSQ0: DEC 34HDSQ9: POP ACCMOV R3,APOP ACCMOV R2,APOP PSWPOP ACCRETIXS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END。
MEMORY存储芯片STM8S003F3P6中文规格书
This is information on a product in full production.August 2018DS7147 Rev 10Value line, 16-MHz STM8S 8-bit MCU, 8-Kbyte Flash memory, 128-byte data EEPROM, 10-bit ADC, 3 timers, UART, SPI, I²CDatasheet - production dataFeaturesCore•16 MHz advanced STM8 core with Harvard architecture and 3-stage pipeline •Extended instruction setMemories•Program memory: 8 Kbyte Flash memory; data retention 20 years at 55 °C after 100 cycles •RAM: 1 Kbyte•Data memory: 128 bytes true data EEPROM;endurance up to 100 k write/erase cyclesClock, reset and supply management• 2.95 V to 5.5 V operating voltage•Flexible clock control, 4 master clock sources –Low-power crystal resonator oscillator –External clock input–Internal, user-trimmable 16 MHz RC –Internal low-power 128 kHz RC •Clock security system with clock monitor •Power management–Low-power modes (wait, active-halt, halt)–Switch-off peripheral clocks individually –Permanently active, low-consumption power-on and power-down resetInterrupt management•Nested interrupt controller with 32 interrupts •Up to 27 external interrupts on 6 vectorsTimers•Advanced control timer: 16-bit, 4 CAPCOM channels, 3 complementary outputs, dead-time insertion and flexible synchronization •16-bit general purpose timer, with 3 CAPCOM channels (IC, OC or PWM)•8-bit basic timer with 8-bit prescaler •Auto wakeup timer•Window and independent watchdog timersCommunications interfaces•UART with clock output for synchronousoperation, SmartCard, IrDA, LIN master mode •SPI interface up to 8 Mbit/s •I 2C interface up to 400 Kbit/sAnalog to digital converter (ADC)•10-bit ADC, ± 1 LSB ADC with up to 5multiplexed channels, scan mode and analog watchdogI/Os•Up to 28 I/Os on a 32-pin package including 21high-sink outputs •Highly robust I/O design, immune against current injectionDevelopment support•Embedded single-wire interface module(SWIM) for fast on-chip programming and non-intrusive debuggingDescription STM8S003F3 STM8S003K3DS7147 Rev 102 DescriptionThe STM8S003F3/K3 value line 8-bit microcontrollers offer 8 Kbytes of Flash programmemory, plus integrated true data EEPROM. They are referred to as low-density devices in the STM8S microcontroller family reference manual (RM0016).The STM8S003F3/K3 value line devices provide the following benefits: performance, robustness and reduced system cost.Device performance and robustness are ensured by true data EEPROM supporting up to 100000 write/erase cycles, advanced core and peripherals made in a state-of-the-arttechnology at 16 MHz clock frequency, robust I/Os, independent watchdogs with separate clock source, and a clock security system.The system cost is reduced thanks to a high system integration level with internal clock oscillators, watchdog, and brown-out reset.Full documentation is offered as well as a wide choice of development tools.Table 1. STM8S003F3/K3 value line featuresFeaturesSTM8S003K3STM8S003F3Pin count3220Max. number of GPIOs (I/O)2816External interrupt pins 2716Timer CAPCOM channels 77Timer complementary outputs 32A/D converter channels 45High-sink I/Os2112Low-density Flash program memory (byte)8 K 8 K RAM (byte)1 K 1 K True data EEPROM (byte)128(1)1.Without read-while-write capability.128(1)Peripheral setMulti purpose timer (TIM1), SPI, I2C, UART, Window WDG, independent WDG, ADC, PWM timer (TIM2), 8-bit timer (TIM4)DS7147 Rev 10STM8S003F3 STM8S003K3Block diagram3 Block diagramFigure 1. STM8S003F3/K3 value line block diagramXTAL 1-16 MHzRC int. 16 MHzRC int. 128 kHzSTM8 coreDebug/SWIMUART1I2CSPIAWU timerReset blockResetPORBORClock controllerDetectorClock to peripherals and core400Kbit/s8Mbit/sup to 5A d d r e s s a n d d a t a b u sWindow WDG8 Kbyte 128 byte 1 Kbyte RAMADC1ResetSingle wiredebug interfaceprogram Flashdata EEPROM16-bit general purpose16-bit advanced controltimer (TIM1)timer (TIM2)8-bit basic timer(TIM4)Beeper1/2/4 kHz beepIndependent WDG4 CAPCOM channels Up to 3 CAPCOM channelsUp to + 3 complementaryoutputsLIN master channelsSPI emul.STM8S003F3 STM8S003K3Product overviewDS7147 Rev 10Product overview STM8S003F3 STM8S003K3DS7147 Rev 104.12 TIM4 - 8-bit basic timer•8-bit autoreload, adjustable prescaler ratio to any power of 2 from 1 to 128•Clock source: CPU clock•Interrupt source: 1 x overflow/update4.13 Analog-to-digital converter (ADC1)STM8S003F3/K3 value line products contain a 10-bit successive approximation A/Dconverter (ADC1) with up to 5 external multiplexed input channels and the following main features: •Input voltage range: 0 to V DDA •Conversion time: 14 clock cycles•Single and continuous, buffered continuous conversion modes •Buffer size (10 x 10 bits)•Scan mode for single and continuous conversion of a sequence of channels •Analog watchdog capability with programmable upper and lower thresholds •Analog watchdog interrupt •External trigger input •Trigger from TIM1 TRGO •End of conversion (EOC) interruptNote:Additional AIN12 analog input is not selectable in ADC scan mode or with analog watchdog. Values converted from AIN12 are stored only into the ADC_DRH/ADC_DRL registers.4.14 Communication interfacesThe following communication interfaces are implemented:•UART1: full feature UART, synchronous mode, SPI master mode, SmartCard mode,IrDA mode, LIN2.1 master capability •SPI: full and half-duplex, 8 Mbit/s •I²C: up to 400 Kbit/sTable 3. TIM timer featuresTimerCounter size (bits)PrescalerCounting mode CAPCOM channels Complem. outputs Ext. trigger Timersynchr-onization/ chainingTIM1 16Any integer from 1 to 65536Up/down 43Yes NoTIM2 16Any power of 2 from 1 to 32768Up 30No TIM48Any power of 2 from 1 to 128UpNo。
三色灯呼吸灯原理
三色灯呼吸灯原理
三色灯呼吸灯原理:
三色灯呼吸灯是一种常见的灯光效果,也被称为渐变灯。
它给人一种逐渐增强
和减弱的效果,仿佛灯光在呼吸一样。
这种效果常被用在装饰灯、舞台灯光和电子产品等领域。
三色灯呼吸灯的原理基于脉宽调制(PWM)技术。
PWM是通过短暂地改变电
源的开关状态来控制电流的技术。
三色灯呼吸灯利用PWM控制每个颜色的LED
灯的亮度,从而实现呼吸灯效果。
通常,三色灯呼吸灯由红、绿、蓝三个颜色的LED灯组成。
每个LED灯都通
过PWM控制器连接到微控制器或其他控制电路上。
PWM控制器会发送调整亮度
的指令给LED灯。
当LED灯处于呼吸灯模式时,PWM控制器会逐渐增强和减弱每个LED灯的
亮度。
这是通过不断改变PWM信号的占空比(即高电平和低电平的时间比)来实
现的。
当PWM信号的占空比增加时,LED灯会逐渐变亮;当占空比减小时,LED 灯会逐渐变暗。
三个LED灯的PWM信号可以同步或异步地控制,以达到灯光渐变的效果。
例如,当红灯渐渐亮起时,绿灯和蓝灯可以暂时关闭或保持低亮度。
然后,当红灯达到最高亮度时,它会逐渐减弱,同时绿灯和蓝灯逐渐增强,产生渐变的灯光效果。
总之,三色灯呼吸灯利用PWM技术控制LED灯的亮度,通过逐渐增强和减
弱不同颜色的LED灯的PWM信号,实现呼吸灯的效果。
这种灯光效果广泛应用
于多个领域,增添了环境的艺术感和吸引力。
基于STM8S103F3的简易Boost电路设计
基于STM8S103F3的简易Boost电路设计
由于不需要建立复杂的数学模型,大部分PID控制器靠良好的PID系数整定就能工作的很好。
而STM8S103F属于很小的8位单片机,它开发简单便捷、价格适宜,是一种非常好用的单片机。
本文中我们运用STM8S103F3来制作一个稳定简单的升压电路。
STM8S103F3是一种TSSOP20封装很小的8位单片机,具有价格低、外设多、开发方便、以及宽工作电压等优点,平均只要1块多就能买一片。
这里我们要用到3个定时器、一个UART串口、一个I2C串口、一个SPI串口、一个10位16通道的高速AD,还有看门Doge等。
几乎每一个IO口都有自己的外部中断,内部具有多个始终源。
这里暂时只用了两个定时器和ADC。
IM1这个高级16位定时器用于产生固定频率可变占空比的PWM波,通过一个引脚进行输出TIM4这个普通8位定时器用于隔一段时间进行PI运算,从而稳定输出电压ADC中的4通道(AIN4)用于检测输出电压,而3通道(AIN3)用于提供一个参考电压,约0.6-0.7V,这个电压利用二极管正向导通压降产生的。
使用参考电压是因为ADC出来的结果是一个整数,还需要乘以单片机电源电压再除以2的10次放才是真正的电压。
单片机的供电可能不稳定,如果没有这个参考,那可能会造成输出不稳定。
电路图
运行时配置好定时器TIM1 TIM4还有ADC即可。
然后在TIM4中定时运行PID算法。
初始化TIM1,由主时钟直接驱动不分频,把它弄成向上计数模式:。
呼吸灯方案
呼吸灯方案—小黑提供(请大家不要向网上散播)PWM原理及实现效果:通过产生占空比可变的方波实现输出平均值的改变,从而导致输出负载得到的功率变化。
信号的平均值为该信号一个周期内进行积分,并除以该周期值:Va=1T ∫V(t)dt T可见,对于一个方波信号,若占空比改变,则Va的值发生改变,从而负载得到的功率发生改变。
对应于这道题目,便是灯的亮度发生改变。
PWM波形:其中,Output Voltage便是PWM波形,可以看到,PWM就是一个方波,频率没有发生改变,但是占空比变化,结果就是上面所说的输出功率为时变,从而灯的亮度变化。
PWM产生方法:可以利用NE555来产生PWM波,电路图如下:其中,对应管脚波形为第一张图片中的波形。
需要注意的是,这里还需要两个输入:1.Clock Input;2.Modulation Input。
其中,Clock为上图中的时钟信号,为一方波,其频率确定最终输出的PWM频率,一般可为几k到几十kHz。
产生方法之后提及。
Modulation输入,为PWM 控制信号,即表示PWM占空比变化情况,此信号幅度发生变化,则最终PWM占空比变发生变化。
对于这道题目,可以此管脚的信号周期,便是灯的闪烁周期。
此管脚可用正弦波或三角波驱动。
驱动波形产生:多谐振荡器与文氏振荡器。
由上面论述可知,需要产生一个kHz级的方波和Hz级的正弦波或三角波。
先说方波。
一般来说,方波的产生大多使用多谐振荡器,可以利用NE555制作或者运算放大器制作。
下面列出两种方法的电路图:也可采用非门来进行多谐振荡。
具体信息,参加NE555芯片手册,和《基于运算放大器和模拟集成电路的电路设计》第十章第二节。
正弦波发生器一般使用文氏振荡器,但根据此题,需要Hz级别的正弦波,文氏振荡器实现难度较大,这里不深入讨论。
此处改用三角波激励。
此处三角波由于对波形完整度要求不高,可以直接使用多谐振荡器中的电容积分管脚,具体内容在此不详谈,可以参照多谐振荡器中的内容自行设计。
STM8 PWM呼吸灯
****************************************************************************** * @file Project/main.c* @author MCD Application Team* @version V2.1.0* @date 18-November-2011* @brief Main program body****************************************************************************** * @attention** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>© COPYRIGHT 2011 STMicroelectronics</center></h2>****************************************************************************** *//* Includes ------------------------------------------------------------------*/#include "iostm8s003f3.h"#define uint unsigned int#ifndef BIT#define BIT(x) (1 << (x))#endifvoid delayms(unsigned int x);void CLOCK_set(uint SYS_CLK){switch(SYS_CLK){case 2: CLK_CKDIVR |=((1<<4)|(1<<3)); break;//时钟配置为内部RC,2Mcase 4: CLK_CKDIVR |=(1<<4); break;//时钟配置为内部RC,4Mcase 8: CLK_CKDIVR |=(1<<3); break;//时钟配置为内部RC,8Mcase 16: CLK_CKDIVR &=~(BIT(4)|BIT(3));break;//时钟配置为内部RC,16M }}void delayms(uint x)uint m,n;for(m=x;m>0;m--)for(n=110;n>0;n--);}void PWM_Init2(uint pwm){uint pwmh2,pwml2;pwmh2=pwm/256;pwml2=pwm%256;TIM2_CCMR2 |= BIT(6)|BIT(5)|BIT(4)|BIT(3); //pwm模式1、预装载使能TIM2_PSCR |= 4;//预分频器TIM2_ARRH = 0x03;//装载计数值高位TIM2_ARRL = 0xE7;////装载计数值低位TIM2_CCR2H =pwmh2;//比较值高位,通道2的设置,TIM2_CCR2L = pwml2;//比较值低位,通道2的设置,TIM2_CCER1 |= BIT(4); //输出使能,通道2的设置,不产生中断,直接从PD3引脚输出TIM2_CR1 |= BIT(0); //计数器使能}int main( void ){CLOCK_set(16);while(1){int j,i;for(i=20;i<=998;i=i+22){PWM_Init2(i);delayms(600);}for(i=998;i>0;i=i-20){PWM_Init2(i);delayms(600);}}}#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval : None*/void assert_failed(u8* file, u32 line){/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}}#endif/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/。
单片机PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果
单片机PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果程序是在51hei单片机开发板上面做的,电路很简单,最小系统+P0的八个led即可.ADDR0和ENLED那是开发板上的led使能电路控制端,如果是你自己做的电路可以删掉这几个语句.或者不用管他,不会影响程序的运行./*************************************************** ************************************************* *********** @file:main.c* @author :xr* @date:2014年4月15日20:34:05 - 2014年4月15日22:28:08* @version: V1.2.3* @brief :PWM技术实现呼吸灯和KTV等娱乐场所的灯光闪烁效果单片机STC89C52RC MCU 晶振 11.0592MHZ************************************************* ************************************************* ***********/#include ;//74HC138sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;//sbit PWMOUT = P0^0;//PWM输出#define PWMOUT P0//8个LED小灯同时呼吸//灯光控制编码(调整PWM的占空比)unsigned char code PWM_Table[] = {1, 3, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47, 50,53, 56, 59, 62, 65, 68, 71, 74, 77, 80, 83, 86, 89, 92, 95, 98, 99}; //34个占空比unsigned char heighHR0, heighLR0;//PWM高电平计数初值的高字节和低字节unsigned char lowHR0, lowLR0;//PWM低电平计数初值的高字节和低字节unsigned char thr1, tlr1;//T1计数初值高字节和低字节unsigned long PWMCounter = 0;//PWM设定频率后的对应的所需计数值 UL型void Initial();void ConfigPWM(unsigned int fr, unsigned char dc); void ConfigTimer1(unsigned int xms);void main(void){Initial();/**********呼吸灯效果***************/ ConfigPWM(100, 5);//设定PWM的脉冲宽度为100hz,即10ms,占空比为5%,当PWM的脉冲宽度小于100HZ时,形成的是闪烁的灯光效果ConfigTimer1(50); //定时50ms调整PWM占空比/*PWM技术实现KTV等娱乐场所的灯光闪烁效果*/ /***************灯光闪烁****************//*ConfigPWM(10, 5); //PWM脉冲宽度为10HZ,即1ms, 占空比5%ConfigTimer1(50); //定时20ms调整PWM占空比*/while (1);}/*初始化*/void Initial(){ADDR3 = 1;ENLED = 0;//选择LEDADDR2 = 1;ADDR1 = 1;ADDR0 = 0;//选择LEDS6,即流水灯}/*使用定时器T0配置PWM*/void ConfigPWM(unsigned int fr, unsigned char dc) //参数:fr PWM配置的频率,当是100时,即是100HZ,周期是10ms,dc为占空比{unsigned long tmp;unsigned int heigh, low;//分别存放高电平计数值和低电平计数值tmp = 11059200/12;//一个机器周期的计数频率PWMCounter = tmp / fr;//一个机器周期计数频率是多少个fr计数频率,即fr频率需要的计数值heigh = (PWMCounter * dc) / 100;//高电平所需计数值1/fr周期内高电平计数值low= PWMCounter - heigh;//低电平所需计数值 1/fr 周期内低电平计数值heigh = 65536-heigh;//高电平时定时器需要装入的初值low= 65536-low;//低电平时定时器需要装入的初值heighHR0 = (unsigned char)(heigh >;>; 8); heighLR0 = (unsigned char)heigh;lowHR0= (unsigned char)(low >;>; 8);lowLR0= (unsigned char)low;TMOD &= 0xF0;//清零T0控制位TMOD |= 0x01;//Timer0方式1,16位可设定定时模式TH0 = heighHR0;TL0 = heighLR0;//装入高电平时的初值PWMOUT = 0xFF;//开始PWM输出高电平TR0 = 1;//启动定时器T0ET0 = 1;//开启T0中断EA = 1;//开总中断}/*配置定时器Timer1,用于定时xms调整PWM的占空比*/void ConfigTimer1(unsigned int xms){unsigned long tmp;tmp = 11059200/12;//一个机器周期的计数频率tmp = (tmp * xms) /1000;//定时xms需要的计数频率(即计数次数)tmp = 65536-tmp;//定时xms需要装入的计数初值thr1 = (unsigned char)(tmp >;>; 8);//取高八位tlr1 = (unsigned char)tmp;TMOD &= 0x0F;//清零T1控制位TMOD |= 0x10;//定时器T1方式1,16位可设定时器TH1 = thr1;TL1 = tlr1;TR1 = 1;//启动timer1ET1 = 1;//开启定时器T1中断EA = 1;//开启总中断}/*调整PWM占空比*/void AdjustPWMdc(unsigned char dc){unsigned int heigh, low;heigh = (PWMCounter * dc) / 100; //PWM脉冲中高脉冲所需计数值low= PWMCounter - heigh;//PWM脉冲中低脉冲所需的计数值heigh = 65536-heigh;//高脉冲装入计数的初值low= 65536-low; //低脉冲装入计数的初值/*调整PWM高低脉冲计数初值,来调整PWM的占空比*/heighHR0 = (unsigned char)(heigh >;>; 8); heighLR0 = (unsigned char)heigh;lowHR0= (unsigned char)(low >;>; 8);lowLR0= (unsigned char)low;}/*定时器Timer0中断服务*/void Timer0_ISP() interrupt 1{//在中断中对PWM的输出电平进行判断,若当前输出是高电平,则开始装入低电平的计数初值,PWM输出低电平if (PWMOUT){//Timer0装入PWM一个周期中低脉冲的计数初值TH0 = lowHR0;TL0 = lowLR0;PWMOUT = 0x00;//PWM输出低电平}else //否则装入高电平的计数初值,输出高电平{//Timer0装入PWM一个周期中高脉冲的计数初值TH0 = heighHR0;TL0 = heighLR0;PWMOUT = 0xFF;//PWM输出高脉冲}}/*定时器Timer1中断服务*/void Timer1_ISP() interrupt 3{//注意:index和dir在每次进入中断后都要使用上一次的值,因此必须定义为静态类型static unsigned char index = 0;//占空比索引static bit dir = 0;//方向位,0灯光由亮->;暗 1灯光由暗->;亮TH1 = thr1;TL1 = tlr1;AdjustPWMdc(PWM_Table[index]);//调用调整PWM占空比函数,调整PWM占空比 if (dir == 0){index++;//索引++if (index >;= 33)//34个占空比{index = 33;dir = 1;//改变方向}}else{index--; //索引--if (index == 0){index = 0;dir = 0;//改变方向}}}。
PWM原理及应用 呼吸灯
PWM原理及应用呼吸灯1. 引言PWM(脉宽调制)是一种常用的信号调制技术,常应用于数字信号和模拟信号的转换。
PWM信号的特点是通过改变信号的脉冲宽度来控制电路的输出,具有高效、简单、精度高的特点。
其中,呼吸灯是一种典型的PWM信号应用场景。
本文将对PWM原理及其在呼吸灯中的应用进行介绍。
2. PWM原理2.1 初步认识PWMPWM通过改变周期内脉冲的宽度来调整电路的输出电平,常用于数字信号的模拟输出、电机调速、灯光调节等应用中。
PWM信号由一个固定周期的信号和一个可变的高电平脉冲宽度组成,高电平脉冲宽度的时间比例决定了输出信号的占空比。
2.2 PWM的工作原理PWM是通过改变信号的占空比来控制电路的输出。
占空比是指信号高电平的时间与一个周期的比值。
假设信号周期为T,高电平脉冲宽度为t,那么占空比D=t/T。
占空比越大,输出电平越高,反之则越低。
2.3 PWM的优势相比于其他调制技术,PWM具有以下优势:•简单:PWM的实现相对简单,通常可以通过控制IO口的高低电平实现。
•高效:PWM输出的电平变化是通过快速开关来实现的,能够有效减小功耗。
•精度高:PWM的占空比可以非常细精度地调整,可以满足对精度较高的应用需求。
3. 呼吸灯的实现呼吸灯是一种通过逐渐改变亮度,模拟人类呼吸的灯光效果。
在呼吸灯的实现中,PWM技术起到了关键的作用。
3.1 呼吸灯的原理呼吸灯的亮度变化通常是通过改变LED灯的驱动电流来实现的。
而改变驱动电流的一种常见方法就是利用PWM技术。
通过控制PWM信号的占空比,可以实现呼吸灯的渐变亮度效果。
3.2 实现呼吸灯的代码示例下面是一个使用Arduino平台实现呼吸灯效果的代码示例:int ledPin = 9; // 连接LED的引脚int brightness = 0; // 当前亮度int fadeAmount = 5; // 亮度变化步长void setup() {pinMode(ledPin, OUTPUT); // 将LED引脚设置为输出}void loop() {analogWrite(ledPin, brightness); // 使用PWM输出当前亮度brightness += fadeAmount; // 改变亮度if (brightness <= 0 || brightness >= 255) {fadeAmount = -fadeAmount; // 亮度到达边界时反向变化}delay(30); // 延迟一段时间}上述代码中,使用了analogWrite函数实现PWM输出,通过改变brightness变量来控制呼吸灯的亮度。
STM8S003F3通过PWM波实现三基色呼吸灯
STM8S003F3通过PWM波实现三基色呼吸灯前段时间使用STM8S003F3实现了一个三基色灯的各种效果,故写一篇文章作为一个记录.1 综述我们知道,要是的LED灯亮直接通电即可。
而要改变灯的亮度,我们有两种方法:改变电流和PWM调光。
我们首先想到的就是改变它的驱动电流,因为LED的亮度是几乎和它的电流直接成正比关系。
然而用调正向电流的方法来调节亮度会产生一个问题:在调亮度的同时也会改变它的光谱和色温,这样就会会产生色偏.因为目前白光LED都是用蓝光LED加黄色荧光粉而产生,当正向电流减小时,蓝光LED亮度增加而黄色荧光粉的厚度并没有按比例减薄,从而使其光谱的主波长增长。
这个问题对于一般的照明是没有问题的,因为色温的变化量毕竟不是很大。
但是对电源来说当电流过小时会产生闪烁,除非电源的恒流范围很宽,完全可以从0到最大。
这样才没有问题。
简而言之,电流调光有色温变化和电源电流过小产生闪烁的问题。
曾经做过一个项目,用于某设备上需要非常非常平稳的调光,显然电流调光是无法实现.同时像本文介绍的三基色调光有颜色要求的显然也不行。
因此我们使用PWM调光。
既然PWM调光可以避免上面的两个问题,为什么不直接都用PWM调光呢?因为我们毕竟是做产品,要考虑成本问题。
使用PWM调光至少需要一颗能支持PWM的芯片(当然还有外围电路,但是电流调光也是有电路的。
我们也应该知道PWM信号也可以由脉冲发生器提供),另外它需要编写程序。
所以只有在需要的场合才使用PWM调光(使用PWM调光需要注意的问题是频率不能太低或者太高,推荐150-400Hz之间。
).PWM的优点如下:● PWM调光就不会产生色偏,因为它总是工作在0或者最大两种状态.● PWM的占空比很好控制,而且精度高●对电源没有影响,因为不会改变电源的工作条件,只是给电源开或者关。
2 PWM波调光的原理脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的的技术,广泛应用在从测量、通信到功率控制与变换及LED照明等许多领域中。
[FPGA]Verilog利用PWM调制完成RGB三色彩虹呼吸灯
[FPGA]Verilog利⽤PWM调制完成RGB三⾊彩虹呼吸灯概述实现彩虹呼吸灯题⽬就是这么简短,但这是⽬前我碰到的最有意思的⼀道题⽬,因为他有⽆数种解决⽅法,并且每⼀种都是那么⾼级或者巧妙,⽐如可以利⽤3路不同初相的PWM调制信号驱动三颗RGB灯重叠呼吸利⽤1路PWM信号以及状态机,将⼀个周期分为3个状态,分别是[R降G升B灭],[R灭,G降,B升]和[R升,G灭,B降],依次往复实现重叠呼吸将PWM拆分为3段,分别为升,降,灭,在不同时间周期性的输送给RGB实现重叠呼吸当然,不只这⼏种,还有更⾼级的⽅法或者⽣成语句也可以更加简练的完成题⽬,在这⾥,我将采取上⾯罗列的⼏种⽅法的⼀种折中⽅案,采取"拆分PWM","三元运算符实现单⾏条件信号分配","监视模块内运⾏情况并以监视信号作为状态转换的触发条件"来实现彩虹呼吸灯.题⽬分析题⽬只有七个字:"实现彩虹呼吸灯",其中"呼吸两个字",已经确定了这个实验和脉宽调制扯不开⼲系,另外"彩虹"也说明这个实验需要很多的⾊彩,单单靠单⾊LED是完成不了的,⼀定需要三⾊RGB完成,并且只是让R,G,B三个LED交替呼吸,也达不到"彩虹"的效果,所以需要让三⾊灯按照⼀定的规律重叠呼吸,这⾥为了⽅便,我按照下图⽰意的样式进⾏编程(抱歉画⼯实在⽋缺,咳咳)意思就是在R灯最亮时,G灯开始升,R灯开始降,在G灯最亮时,R灯已灭,B灯开始升,G灯开始降,以此类推.通过这个图也可以容易的分成三个情况,⽤以实现状态机.PWMPWM是个啥?PWM( Pulse width modulation )就是脉冲宽度调制,是⼀种通过数字信号对模拟信号控制的有效技术.简单来说,规律的进⾏脉宽调制,⽐如将⼀束⽅波的占空⽐不断减⼩,那么这束⽅波的有效值也相应的减⼩,占空⽐增⼤,有效值也增⼤,借此来对LED的亮度进⾏控制,加以周期性的增减,即可实现呼吸灯.呼吸灯只是PWM的⼀个具体应⽤.PWM咋实现?在之前的学习早已接触过PWM调制的实现⽅法,在这⾥直接给出代码,可以通过注释回忆PWM实现过程module PWM(input CLK,input FLAG//标志位,控制输出的PWM是升还是降(1升0降),output STT//监视信号(脉冲),output PWM);reg[24:0]cnt1;reg[24:0]cnt2;parameter freq=2400;//通过这个freq来控制PWM的周期reg stt;//监视状态always@(posedge CLK)if(cnt2==freq-1)//cnt2满,则状态为1(只持续⼀个时钟周期)stt<=1'b1;elsestt<=1'b0;assign STT=stt;always@(posedge CLK)if(cnt1>=freq-1)//满则清零cnt1<=1'b0;elsecnt1<=cnt1+1'b1;always@(posedge CLK)if(cnt1==freq-1)//cnt1满,以cnt1从空到满为⼀个周期执⾏操作if(FLAG)//升的情况if(cnt2>=freq-1)cnt2<=1'b0;elsecnt2<=cnt2+1'b1;//升else//降的情况if(cnt2<=0)cnt2<=freq-1;elsecnt2<=cnt2-1'b1;//降elsecnt2<=cnt2;assign PWM=(cnt1<cnt2)?1'b0:1'b1;//PWM的核⼼,输出调制好的PWM信号endmodule代码中的stt和STT是监视脉冲,不影响PWM输出;输⼊信号FLAG控制PWM输出信号是升还是降.⼆者作⽤在顶层代码处详细解释.顶层模块PWM很容易实现,需要动脑⼦的就是如何通过例化模块来实现交替呼吸.下⾯给出我的算法.例化模块先看代码wire UP;wire DW;wire STT0;wire STT1;PWM up(CLK,1,STT0,UP);PWM dw(CLK,0,STT1,DW);其中up例化模块中的1代表FLAG,在此表⽰这个up例化模块是⼀个"升"模块,即为可以产⽣控制LED亮度从灭到亮的PWM信号,dw例化模块则代表可以产⽣⼀个可以控制从亮到暗的PWM信号.通过这个设计可以将PWM模块的功能拆分,提供两种模式供主模块灵活调⽤.代码中的UP和DW分别为代表亮度升和亮度降的PWM信号.状态分析这⾥不按照⽂⾸的那种状态机思路来写,⽽是将RGB三⾊灯分成3路对待,这⾥先以R为例.对R来说,他的亮灭规律为:升(⼀单位时间),降(⼀单位时间),灭(⼀单位时间).然后可以以此来写条件语句进⾏信号分配,可能第⼀时间想到的就是直接定义⼀个分频,不同时间显⽰不同状态即可,但是这种写法不利于后期拓展,易读性和可维护性也稍差,在这⾥采⽤很⽅便的"三元运算符"解决.先来看这段代码reg[1:0]flag0=2'b00;always@(posedge STT0)if(flag0==2'b10)flag0<=1'b0;elseflag0<=flag0+1'b1;这⾥定义了⼀个标志为flag0,它是以上⽂提到过的监视脉冲STT为触发进⾏递增计数的,STT是⼀个在PWM模块内每⼀个⼯作周期完成后就输出⼀单位时间⾼电平的监视脉冲,通过这个脉冲可以知道PWM已经⼯作完⼀个周期,可以进⾏下⼀周期的⼯作,在顶层代码⾥则充当了状态转移的触发条件.再来看这⼀⾏代码assign LED[0]=(flag0==2'b00)?UP:((flag0==2'b01)?DW:1'b1);这⼀⾏是实现RGB灯⼯作状态的核⼼代码,通过(两层)三元运算符在⼀条表达式内就完成了条件赋值.这条代码的意思就是,如果标志位flag0是2'b00,则R亮度升,若不是,则检测标志为是否为2'b01,若是,则R亮度降,如不是,则灭.然后通过上⼀个代码块中的代码可以知道,每⼀个PWM周期完成后(表现为R已到达最亮或者最暗),状态发⽣转移,标志为变为下⼀个状态,R也就在完成了亮度升之后⽴刻开始亮度降,宏观表现为"呼吸"的状态.代码整合上⽂⾥两个代码块就⾜以让⼀个灯完成⼀个状态的⼯作,这部分代码如下reg[1:0]flag0=2'b00;always@(posedge STT0)if(flag0==2'b10)flag0<=1'b0;elseflag0<=flag0+1'b1;assign LED[0]=(flag0==2'b00)?UP:((flag0==2'b01)?DW:1'b1);reg[1:0]flag1=2'b01;always@(posedge STT0)if(flag1==2'b10)flag1<=1'b0;elseflag1<=flag1+1'b1;assign LED[1]=(flag1==2'b00)?UP:((flag1==2'b01)?DW:1'b1);reg[1:0]flag2=2'b10;always@(posedge STT0)if(flag2==2'b10)flag2<=1'b0;elseflag2<=flag2+1'b1;assign LED[2]=(flag2==2'b00)?UP:((flag2==2'b01)?DW:1'b1);三个灯就相当于将这⼀段代码例化三次,就可以让三⾊灯分别进⾏互相不影响的状态转移(呼吸变化),但是我们的⽬的是让他们按照⽂⾸图中的规律重叠呼吸,该怎么实现呢?这很简单,很容易想到,三段⼀样的代码⾥都分别有⼀个独⽴的标志为flag,他是reg类型数据,所以可以在定义时给他分配⼀个初始状态,这样就相当于给三个灯设置了不同的初相,在后⾯⼯作的时候由于⼯作周期相同,就会⼀直保持最开始的相位差,周期性的进⾏⽂⾸图中的交替呼吸.⾄此,彩虹呼吸灯已经完成.效果最后的效果图,图⽚较⼤,加载可能⽐较慢.(因为灯实在是太亮了,就蒙了⼀层纸来观察颜⾊变化)后话这篇⽂章是⽬前写过的第⼆费⼒的了,其中的代码更新了很多很多次,在琢磨更精简更巧妙的算法上和修Bug上花了很多的时间和精⼒,前前后后烧录上板测试不下50次(不夸张T_T),在本地commit了⽆数个版本,回滚了⽆数次,⼀遍⼀遍修改,最后才得到了你看到的这些代码.我的⽔平有限,所以就算如此⽂中的代码和讲解⼀定有所缺漏,还请希望⼤家多多包涵,并指出不⾜之处,改进这篇⽂章,来帮助更多的⼈.。
基于PWM的三基色LED智能语音控制调光调色系统设计
基于PWM的三基色LED智能语音控制调光调色系统设计作者:汤丽华王志泉来源:《信息记录材料》2019年第01期【摘要】本文根据节能、商用照明对灯光要求多样化的要求,充分利用LED的节能和可控性,选用红绿蓝三基色LED作为照明光源,针对当下流行的语音控制和PWM斩波控制,选用凌阳单片机SPCE061A,设计相应的LED PWM恒流驱动电路,组成智能语音控制商用照明系统。
【关键词】LED;PWM;语音控制;绿色照明【中图分类号】T13 【文献标识码】A 【文章编号】1009-5624(2019)01-0106-031 引言当前商用照明系的可调性主要体现在亮度可调,很少做到色度的可调,照明系统设计成型后,整个空间的格调业基本定下来。
而卖场在不同季节、不同商品需要不同的灯效来提升产品的质感以吸引消费者的眼球、刺激消费者购买的欲望。
灯效很重要体现在色温与亮度的搭配所营造的气氛,可调色温、亮度的LED照明系统迎合了商用照明对灯光效果的多样化需求的、节能的要求和语音控制流行趋势的要求,在目前的商用照明系统具有新颖性、实用性、可行性。
本文设计一套基于PWM的三基色LED智能语音控制调光调色模拟系统,该模拟系统设计详见下文。
2 系统总体设计框图本系统在满足灯光效果的多样化需求的、节能的要求和语音控制流行趋势的需求的前提下,采用采用PWM来实现调光、调色。
控制方式采用语音控制。
照明系统框图如图1所示。
在该控制方案基础上,可扩展许多功能:如增加按键可实现按键、语音双重控制,增加相应的传感模块(如光电传感器、热释电)可实现自动调光、有顾客进出营业区发出相应的欢迎、欢送语音等。
3 硬件设计3.1 LED灯选择LED光源分为小功率LED和大功率LED两种。
小功率LED大多数用来做LED日光灯和装饰灯等,其正向电流在15到20毫安之间;大功率LED多用来做洗墙灯、汽车工作灯、家庭照明灯和路灯等,其正向电流一般大于200毫安。
STM8 PWM模式
STM8 PWM模式STM8的脉冲宽度调制(PWM)模式可以产生一个由TIM1_ARR寄存器确定频率、由TIM1_CCRi寄存器确定占空比的信号。
在TIM1_CCMRi寄存器中的OCiM位写入'110'(PWM模式1)或'111'(PWM模式2),能够独立地设置每个OCi输出通道产生一路PWM。
必须设置TIM1_CCMRi寄存器的OCiPE位使能相应的预装载寄存器,也可以设置TIM1_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数模式或中央对称模式中)。
由于仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIM1_EGR寄存器的UG位来初始化所有的寄存器。
OCi的极性可以通过软件在TIM1_CCERi寄存器中的CCiP位设置,它可以设置为高电平有效或低电平有效。
OCi的输出使能通过(TIM1_CCERi和TIM1_BKR寄存器中)CCiE、MOE、OISi和OSSR位和OSSI 位的组合来控制。
详见TIM1_CCERi寄存器的描述。
在PWM模式(模式1或模式2)下,TIM1_CNT和TIM1_CCRi始终在进行比较,(依据计数器的计数方向)以确定是否符合TIM1_CCRi≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRi。
根据TIM1_CR1寄存器中CMS位域的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM 信号。
PWM边沿对齐模式向上计数配置当TIM1_CR1寄存器中的DIR位为低的时候执行向上计数。
下面是一个PWM模式1的例子。
当TIM1_CNT<TIM1_CCRi时,PWM参考信号OCiREF为高,否则为低。
如果TIM1_CCRi中的比较值大于自动重装载值(TIM1_ARR),则OCiREF保持为'1'。
如果比较值为0,则OCiREF保持为'0'。
STMSF通过PWM波实现三基色呼吸灯
STMSF通过PWM波实现三基色呼吸灯PWM(Pulse Width Modulation)是一种调制信号的技术,用于对模拟信号进行数字化处理。
通过改变信号的占空比,可以控制信号的平均功率,达到模拟信号的效果。
三基色呼吸灯是一种常见的LED灯效,通过控制红、绿、蓝三种颜色的灯珠的亮度变化,实现颜色的渐变效果。
下面将介绍如何使用STMSF通过PWM波实现三基色呼吸灯。
步骤一:硬件准备首先,准备一个STMSF开发板和三种不同颜色的LED灯珠(红色、绿色和蓝色)。
连接红色LED灯珠到STMSF的一个PWM输出引脚,绿色LED 灯珠到另一个PWM输出引脚,蓝色LED灯珠到第三个PWM输出引脚。
步骤二:软件编程接下来,需要编写软件程序来控制PWM输出引脚的亮度变化。
使用STMSF的开发环境,打开一个新的工程。
首先,需要初始化PWM输出引脚。
根据具体开发环境的API接口,调用相应的函数来初始化PWM输出引脚。
然后,编写一个循环程序,用于实现呼吸灯效果。
在循环中,需要调整PWM输出引脚的占空比,从而改变LED灯珠的亮度。
首先,将占空比从0逐渐增加,从而让LED灯珠逐渐亮起。
当占空比达到最大值时,再逐渐减小占空比,让LED灯珠逐渐变暗。
为了实现呼吸灯效果,可以通过设定一个时间间隔,在每次循环中逐渐增加或减小占空比的值。
这样在较短的时间内,LED灯珠的亮度就可以呈现出呼吸灯效果。
步骤三:调试与测试可以通过调整程序中的时间间隔,和占空比的最大值、最小值来改变呼吸灯效果的速度和幅度。
最后,进行测试和调试,确保呼吸灯效果正常工作。
总结:通过PWM波实现三基色呼吸灯的原理很简单,即改变PWM信号的占空比,从而改变LED灯珠的亮度。
具体实现的步骤包括硬件的连接和软件的编程,通过调试和测试来确保呼吸灯效果的正常工作。
这种技术可以应用于各种LED灯效的设计中,给人们带来更多的视觉享受。
利用PWM脉宽调制实现呼吸灯
利⽤PWM脉宽调制实现呼吸灯1.设计⽬标完成⼀个呼吸灯,从亮到灭的时间为2秒,从灭到亮的时间为2秒,以此不断往复。
2.设计步骤2.1设计分析利⽤PWM(脉冲宽度调制)实现led灯亮度的变化,只需要改变占空⽐就可以实现,具体操作是将2秒分为1000份,每份即2/1000(2ms),也就是说⼀个pwm周期为2ms。
在这样⼀个2ms周期内,改变占空⽐,且随着周期数变化,占空⽐也在变化,就可以显⽰出亮度变化的过程。
⽐如在第⼀个2s内,这个2秒内led灯的亮度是越来越暗的,所以具体操作为:把每个周期(2ms)再分成1000份,即⼀份为2us(这个2us称之为pwm的最⼩分辨率),在第⼀个2ms内⾼电平为1000个2us;在第⼆个2ms内低电平的个数为1个2us,⾼电平的个数为999个2us;第三个2ms内低电平的个数为2个2us,⾼电平的个数为998个2us;以此类推,最后⼀个2ms,低电平的个数为1000个2us。
从⽽实现,每2ms亮度变化⼀次,⼀个2s内亮度变化了⼀千次,在⾁眼看来,这个亮度的变化过程是⾮常平滑的。
反过来,亮度增加过程也是⼀样的,只要按2ms增⼤占空⽐即可实现。
2.2设计波形图由图可知,⼀共需要三个计数器:T20us_count、T2us_count、T2ms_count。
分别⽤于计算20ns,2us,2ms的个数。
当T20us_count等于99时,代表计时2us(20ns*100)已到;当T2us_count等于999、T20us_count等于99时,代表2ms(2us*1000)已到;同理,当T2ms_count等于999、T2us_count等于999、T20us_count等于99时,代表2s(2ms*1000)已到。
观察波形图,在第⼀个2ms内,led_pwm都为⾼电平。
在第⼆个2ms内,led_pwm在T2us_count为0时为低电平,⼤于等于0时为⾼电平。
在第三个2ms,T2ms_count等于2,则在T2us_count等于0、1时,led_pwm为低电平,⼤于1时为⾼电平。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM8S003F3通过PWM波实现三基色呼吸灯前段时间使用STM8S003F3实现了一个三基色灯的各种效果,故写一篇文章作为一个记录。
1 综述我们知道,要是的LED灯亮直接通电即可。
而要改变灯的亮度,我们有两种方法:改变电流和PWM调光。
我们首先想到的就是改变它的驱动电流,因为LED的亮度是几乎和它的电流直接成正比关系。
然而用调正向电流的方法来调节亮度会产生一个问题:在调亮度的同时也会改变它的光谱和色温,这样就会会产生色偏。
因为目前白光LED都是用蓝光LED加黄色荧光粉而产生,当正向电流减小时,蓝光LED亮度增加而黄色荧光粉的厚度并没有按比例减薄,从而使其光谱的主波长增长。
这个问题对于一般的照明是没有问题的,因为色温的变化量毕竟不是很大。
但是对电源来说当电流过小时会产生闪烁,除非电源的恒流范围很宽,完全可以从0到最大。
这样才没有问题。
简而言之,电流调光有色温变化和电源电流过小产生闪烁的问题。
曾经做过一个项目,用于某设备上需要非常非常平稳的调光,显然电流调光是无法实现。
同时像本文介绍的三基色调光有颜色要求的显然也不行。
因此我们使用PWM调光。
既然PWM调光可以避免上面的两个问题,为什么不直接都用PWM调光呢?因为我们毕竟是做产品,要考虑成本问题。
使用PWM调光至少需要一颗能支持PWM的芯片(当然还有外围电路,但是电流调光也是有电路的。
我们也应该知道PWM信号也可以由脉冲发生器提供),另外它需要编写程序。
所以只有在需要的场合才使用PWM调光(使用PWM调光需要注意的问题是频率不能太低或者太高,推荐150-400Hz之间。
)。
PWM的优点如下:● PWM调光就不会产生色偏,因为它总是工作在0或者最大两种状态。
● PWM的占空比很好控制,而且精度高●对电源没有影响,因为不会改变电源的工作条件,只是给电源开或者关。
2 PWM波调光的原理脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的的技术,广泛应用在从测量、通信到功率控制与变换及LED照明等许多领域中。
通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。
此外,许多微控制器和DSP已经在芯片上包含了PWM控制器,这使数字控制的实现变得更加容易了。
简言之,PWM是一种对模拟信号电平进行数字编码的方法。
通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。
电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。
通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。
只要带宽足够,任何模拟值都可以使用PWM进行编码。
2.1 占空比(Duty Cycle or Duty Ratio)首先我们需要了解占空比,占空比的解释可以归纳为如下几种:●在一串理想的脉冲序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。
例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。
●在一段连续工作时间内脉冲占用的时间与总时间的比值。
●在周期型的现象中,现象发生的时间与总时间的比。
通俗一点讲就是电路释放能量的有效时间与总释放时间的比。
2.2 调光比然后我们需要了解调光比,调光比则是按下面的方法计算(Foper:工作频率;Fpwm:调光频率;):调光比率= Foper / Fpwm,(其实也就是调光的最低有效占空比)比如Foper=100KHZ;Fpwm=200Hz,则调光比为:100K/200=500;这个指标在很多驱动芯片的规格书里会说明的。
2.3 PWM调光2.3.1 PWM调光原理● 若一个占空比为10%的PWM输出,即10%的时间通,90%的时间断;● 若一个占空比为50%的PWM输出,即50%的时间通,50%的时间断;● 若一个占空比为90%的PWM输出,即90%的时间通,10%的时间断;我们知道,人眼是有视觉暂留的,打个比方,人眼只能识别1us((这个比方没有任何科学依据,仅仅为了便于理解)内光子的数量从而判断亮暗,如果1us接收了1000个光子,那么我们就会认为是一个亮度,至于这1000个光子是在1us什么时候收到,是没有任何影响的,也就是说,在0.1us的时候收到和0.2us的时候收到是没有区别的,我们需要关心的只是数量。
这就是为什么我们进行PWM调光的时候不能太慢(视觉暂留可以分辨)也不能太快(太快就没有区别了,就一直是最亮的)。
这样就好理解了,占空比是10%,就相当于给它加了一个0.9V的电压(因为10%通电时间里电流产生的效果和0.9V加在周内的时候是一样的)。
所以我们就可以通过占空比来条件亮度。
如果在50ms中,LED在这段时间中得到9V供电。
如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。
如果在1秒钟内将此过程重复10次,灯泡将会点亮并象连接到了一个4.5V电池(9V的50%)上一样。
这种情况下,占空比为50%,调制频率为10Hz(T=1/f = 1/10 = 0.1S )。
大多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz。
设想一下如果灯泡先接通5秒再断开5秒,然后再接通、再断开……。
占空比仍然是50%,但灯泡在头5秒钟内将点亮,在下一个5秒钟内将熄灭。
要让灯泡取得4.5V电压的供电效果,通断循环周期与负载对开关状态变化的响应时间相比必须足够短。
要想取得调光灯(但保持点亮)的效果,必须提高调制频率。
在其他PWM应用场合也有同样的要求。
通常调制频率为1kHz到200kHz之间。
通过上面的介绍,我们就知道了PWM调光的原理,那么我们来看看我们这个项目的原理。
2.3.2 三基色呼吸灯原理需求说明:我们需要设置一个灯,它具有常亮、长暗、快闪、慢闪、呼吸5钟效果,并且要求这几种状态是可以变化的。
灯的颜色可以变化。
需求分析:灯的颜色可以变化——确定使用三基色灯。
状态可以切换,我们使用串口调节灯的状态和灯的颜色(通过串口给单片机发送数据,然后将参数传给灯控制函数)。
我们使用PWM调节灯的亮度,通过改变捕获/比较寄存器的值来改变占空比从而改变亮度。
数学建模:三个灯和一个灯的控制是一样的,由于我们使用的是PWM波调光所以灯只有两种状态:断和通。
我们分析5种状态可以抽象成数学模型:暗、上升、亮、下降4钟状态(长暗就是一直暗,常亮就是一直亮,快闪就是100%占空比而且频率比较快,慢闪就是100%占空比而且频率比较慢、呼吸就是占空比最低为10%然后以10%逐渐上升)。
然后我们确定需要输入的变量:Value_LED_Red (红色灯的亮度)、Value_LED_Green(绿色灯的亮度)、Value_LED_Blue(蓝灯的亮度)、Value_ChangeOnce(上升或下降的速度)、HoldTime_Min(在低电平状态的持续时间)、HoldTime_Max(在高电平状态的持续时间)。
3 实现过程下面是TSSOP20封装的管脚图。
首先,我们要确定硬件管脚,但是事实上,因为我用的最多的就是TIM2和TIM4,因此我选用的TIM2_1(PC5,Red)、TIM2_2(PD3,Green)、TIM2_3(PD2,Blue),但是发现除了绿色以外都无法用PWM波控制,但是能用IO控制亮暗,后来查资料发现TIM2_1和TIM2_3早使用的时候必须给存储器地址分布重映射,也就是我们需要使用管脚的复用功能!我们通过看《数据手册》发现,使用TIM2只有一个管脚是复用功能,因此选择TIM2。
但是我因为电路限制,所以还是用的上面所说的管脚(注意,TIM2_3有复用和不复用两种,我用的是复用)。
这也没有什么影响,我们可以学习一下管脚的复用功能。
3.1 使用复用功能我们首先看《数据手册》中关于管脚的描述(第一行是TSSOP20封装的管脚编号,第二行是UFQFPN20封装的管脚b)从上面的图中我们可以看到,需要使用15、19管脚复用功能就需要设置AFR0和AFR1——使用复用功能就是设置AFR(Alternate function remapping bits,候补功能映射位)——我们继续看芯片资料其中OPT2【选项字节(Option byte)编程】和NOPT2需要是相反的(可能是出于校验考虑),我们从《数据手册》中可以知道:应用程序可直接向目标地址进行写操作。
所以我们直接对这两个地址进行写操作,那么数值是多少呢?我们继续看《数据手册》,如下图所示从上图中我们可以看到,我们将AFR1设置为1,将AFR0设置成1。
代码如下:1./***************************************************************2.*Function: FLASH_Init3.*Calls: void4.*Called By: All_Config.c5.*Input: void6.*OUTPUT: void7.*Return: void8.*DESCRIPTION: 1.设置管脚复用功能(AFR0要设置为1 AFR1 要设置为1)9. 2.eeprom 每一次只能操作一个字节10.*Others: nothing11.***************************************************************/12.volatile unsigned char flash_OPT2 @0x4803;13.volatile unsigned char flash_NOPT2 @0x4804;14.#define FLASH_EOP 0X04 //FLASH_IAPSR 中位,编程是否结束15.#define FLASH_DUL 0X08 //flash data eeprom 是否解锁标志位16.void FLASH_Init()17.{18.//第一步初始化EEPROM19.while( (FLASH->IAPSR & FLASH_DUL) == 0X00 )20. {21. FLASH->DUKR = 0XAE; //中文资料上说的和实际是相反的22. FLASH->DUKR = 0X56;23. _asm("NOP");24. }25.26.//第二步对OPT进行编程,首先需要如下操作:开启opt编程27. FLASH->CR2 |= 0X80; //OPT = 128. FLASH->NCR2 &= 0X7F; //NOPT = 029.30.//第三步修改内存31./***************************32. 1.修改参数,启用复用功能33. 2.OPT2 和 NOPT2要相反34. ****************************/35.//修改OPT236. flash_OPT2 = 0X03; // 0000 001137. _asm("NOP");38.while( (FLASH->IAPSR & FLASH_EOP) == 0 ); //等待操作完成39.//修改NOPT240. flash_NOPT2 = ~flash_OPT2;41. _asm("NOP");42.while( (FLASH->IAPSR & FLASH_EOP) == 0 ); //等待操作完成43.44.//第四步对OPT进行编程,最后需要如下操作:禁用opt编程45. FLASH->CR2 &= ~0X80; //OPT = 146. FLASH->NCR2 |= 0X80; //NOPT = 047.}这样,我们就完成了复用功能的“存储器地址分布重映射”。