led小灯瓶——《无线电》第11期-凯发k8官方首页

《无线电》

开博时间:2016-07-01 14:43:00

1955年创刊,是国内电子科普领域创刊最早、发行量最大的知名杂志,累计发行量超过3亿册,倡导科普、兴趣、实作、分享的办刊理念。

文章数
分享到:

led小灯瓶——《无线电》第11期

2012-11-22 15:34:00

起源
    有一天在网上看到一个制作——led电子萤火虫,我感觉电路很有特点,于是就想仿制一个。那个led电子萤火虫用的是attiny13单片机来控制,我也正好有。
而且硬件制作比较简单,成本也不高,10元钱都不到,就能diy一个。虽然简单,但是制作却需要耐心和细心,毕竟需要连接12个led,焊接的工作量不少,我自己用了一个下午才完成,而程序更是陆陆续续地写了几个小时。
    估计你会很好奇地问,一共才6个可用i/o引脚的 attiny13,怎么能驱动12个led呢?其实,我要告诉你,它不仅可以点亮每个led灯,而且还能控制每个led的亮度呢!这才是本次制作的精华。在制作的过程中,发生了一点小小的意外。由于我购买的jst充电线和原来的充电器引脚相反,致使我原本打算使用的小型锂电池损坏,不能充电。在万般无奈的情况下,我只好更换体积更大的锂电池了。

19632

功能及特点
■ 你可以送给朋友作为生日礼物。
■ 它发出的淡黄色的光很温馨,可以在吃饭、聚会时烘托气氛。
■ 虽然led灯瓶有12个led,由于程序使用的是逐点动态扫描的驱动方式,整体功耗仅仅相
当于点亮一个led灯。因此,电池充电一次,连续工作一个星期不成问题。
■ 用6个i/o引脚的单片机驱动12个led。
■ 可控制led的亮/灭及渐变。


    这次制作的主要元件就是attiny13和12个led灯。当然还有双绞线、洞洞板、电池、空瓶子、电阻等其他辅助材料。
本制作使用的是8个引脚的attiny13单片机,这款单片机现在的价格很便宜,4元左右就能买到。 attiny13是avr单片机,它有1kb的 flash、64b的eeprom、64b的sram、6个通用i/o口线、 32个通
用工作寄存器、1个具有比较模式的8位定时器/计数器、片内/外中断、4路10位adc、具有片内振荡器的可编程看门狗定时器,以及3种可以通过软件进行选择的省电模式。12个led为普通的3mm发黄色光的led。

 

制作过程

 

1.焊接单片机插座。

19633

2.焊接两个电阻。


19634

3.双绞线套入热缩管后,焊接led。焊接好后,用打火机加热热缩管,使其收缩固定。最后,别忘了再扭下热缩管。


19635

4.焊接好的12个led。

 

5.双绞线焊接到洞洞板上。


19636

6.洞洞板和双绞线焊接好的效果。

7.焊接jst插头、锂电池和开关。


19637

8.在瓶子上开口。


9.用热熔胶固定。


10.装入瓶子中。

19638

控制原理
为什么6个i/o能控制12个led呢?它们之间会不会相互影响呢?其实,这样的连接方式不仅能控制每个led灯,还能控制其亮度呢!之所以能这样连接,是因为avr单片机的每个i/o都是3态输出。如果用普通51单片机,这样连接是不行的。
那么又是如何控制led灯的亮度呢?控制亮度的关键是attiny13的两路
pwm,它们可以分别设置连接到pb0和pb1引脚上。在attiny13使用内部振荡器的情况下,pwm的最高频率可设置为47.5khz。而且pwm的极性可以通过设置寄存器而改变,这使得12个led灯亮度的控制更加简单了。
先谈谈如何控制每个led灯单独的亮和灭。attiny13的每个i/o都有4种状态,即输出0状态、输出1状态、高阻态(悬空态)、带上拉电阻的高阻态。要使led亮必须要让led中流过正向的电流,如果要让最左边的led亮,pb1输出1、pb2输出0即可。但是,其他不相关的引脚需要设置成高阻态。否则,如果pb0此时也为1的话,第2个led灯也会亮。总之,为了保证其他led不受到影响,在设置某个灯亮时,必须先把所有i/o设置成不带上拉的高阻态。
能控制亮和灭有什么了不起?呵呵,其实还能控制每个led单独的渐变,就是渐渐变亮,渐渐变暗。我举个例子吧,果要最左边的led渐渐变亮,就先设置pb2引脚为0电平,pb1引脚设置为高电平驱动的pwm波。然后,程序逐渐控制pb1的pwm状态,通过调整pwm高电平的脉宽长度来实现亮度控制。当pwm高电平的时间长时,led就变亮了。反之,led
就变暗了。
那么电路原理图中第7个反过来接的led怎么实现亮度控制呢?原理还是一样,只是pb2将刚才的0电平设置成1电平,原来pb1为高电平脉冲驱动的pwm波设置成低电平脉冲驱动的pwm波即可。同样,要控制第7个led的亮度,就控制pwm低电平的脉宽长度,当低电平的脉宽长度长时,led就变亮了。反之,led就变暗了。
那么能实现所有的led同时发光吗?制作过程中,这个功能的实现倒是困扰了我一会儿。后来,我想到了动态扫描。什么是动态扫描?老式电视机不就是这个原理吗?电视机通过磁场让射线高速地扫描屏幕,从而产生一幅画面。那么,让每个灯分别亮1ms左右,然后像电视机一样不断地扫描,看上去就都亮了。在此基础上,再控制每个灯的亮度数值,就能实现
整体亮度控制了。如果led足够多,单片机引脚也足够多,还可能显示一副灰度画面呢!
3种效果的程序编写程序的pwm频率设置为最高的37.5khz。之所以选择这么高的频率是为了不影响动态扫描。试想,如果pwm频率为00hz,那么还怎么动态扫描呢?在程序中,动态扫描实际的频率为62hz。
这已经足够骗过人的眼睛,让我们看不到灯的闪烁。

在单片机的中断代码中,程序每过26μs就会产生溢出中断一次,通过变量count计数中断次数。当中断的次数达到50次时,就更换下一个led灯,显示它对应的亮度。led的亮度存储到led[ ]这个数组中,每个led灯通过载入对应的亮度值,即通过改变pwm产生寄存器的ocr0a与ocr0b,来实际控制高低电平脉宽长度,最终实现亮度的控制。当然,
每次通过pwm控制亮度,都要先根据led的驱动电平方式,重新设置pwm的控制模式。在此之前,还要记得设置不相关的引脚为高阻态。
led的3种效果控制程序能够实现led灯不断地变换,只要调用就能分别实现如下功能:所有led灯的呼吸效果;逐个点亮和熄灭led灯;led灯流水显示的效果。从编程的思路上讲,led[ ]数组存放了12个元素,每个元素所存内容,即对应每个led灯亮度值。要改变某个led灯亮度,都是通过设置led[ ]数组中对应元素的 pwm 缓冲数值来实现自动变换。要让所有的灯全亮只需设置数组中的每个元素的数值都为255即可。如果要
一半的亮度就设置为128。要让某个灯单独最亮,只要设置这个led灯元素数值为255,其他的元素为0。如果任意led要产生渐渐变亮的效果,那么只要对应数组元素中的数值从0逐渐变为255即可。同理,渐渐变暗,数值就从255变成0。要实现什么样的效果,大家可以通过改变led[ ]数组来实现。
■ 本制作的源代码可到《无线电》网站上下载,程序使用cvavr编译,点击工程文件
即可直接打开修改。当然你不想修改、完善的话,可以直接烧录编译好的hex文件。








©2011-2022 凯发k8国际首页登录的版权所有:中国数字科技馆
未经书面许可任何人不得复制或镜像
京icp备11000850号-1 京公网安备11010502039775号
信息网络传播视听节目许可证0111611号
国家科技基础条件平台
网站地图