也谈POV旋转LED制作,经验及技术点。

      最近玩上了单片机,看到网上的大牛们制作的旋转LED,心痒不已,决定自己也做一个。由于白天需要上班,很忙,只能晚上捣鼓捣鼓,所以经过近1个月的折腾,才终于大功告成,将历程和经验写下来,一是做个记录以备自己日后回味,二是分享一下,希望有缘的朋友看到,能够帮到你。

      先上个成品图:

    

    支持最多15个汉字滚动显示。。。支持钟表显示,两种状态轮流。

    支持上位机一键修改文字和时间,专门用VC写了一个小软件:

    

     好了,下面是设计思路和制作过程:

    采用STC15FK60S2,24M内部振荡,外围芯片一个DS1302时钟芯片,一个MBI5026 LED驱动,DS1302这个芯片就不多说了,网上资料很多,MBI5026这个东东好,支持16路LED横流输出,通信和Enable/Disable总共只需要4个IO口,正适合旋转LED的制作。转动用的旧硬盘拆下来的硬盘电机,这玩意儿液态轴承,无刷直流,转速够高,关键是静音。

    整个项目难点有以下几个:

    一、硬盘电机驱动。我用的是DRV11873,这个芯片也是好东东,几个简单的外围元件,就能驱动BLDC(三项无霍尔直流无刷电机),支持PWM输入调速,如果不给定PWM信号,默认以最高速转,本来我就是以最高速驱动的,但是发现转速太高的话,很难控制单片机中断,因为转一圈耗费的时间太短了,还要把每一圈分成几百个个点用来驱动LED,这样中断处理就必须更短,难。只好再加一个NE555做PWM信号输出,用电位器调整占空比,让电机转速降下来。

    二、无线供电。因为电路板一直在转,所以供电就比较麻烦了。网上搜了很多资料,都不太尽人意,后来把搜索关键字从“无线供电”改成“无线充电”,靠,居然有现成的芯片可用——XKT-510!看看中文资料,里面居然带10几套典型应用电路,哈哈,就是它了。就是线圈自己绕起来比较麻烦,后来某宝定制了2个,加运费画了20大洋。

    三、转速自适应。先说一下转速的检测,我用的是一对分体式红外线对射开关,加上拉电阻后直接接到单片机的外部中断0口,用来判断是否转了一圈,主要起到定位的作用。硬件搭建好之后,写的第一个版本的软件,是不带转速自适应的,完全靠延时,这样很不好,呵呵。转速一变,字的宽度就会变,搞不好还会乱,钟表显示起来就更不好了,没法准确的画60个刻度。网上搜了n久,只看到有个大神用自行车做的旋转LED,他把定时器弄的比较小,然后判断一圈中断了几次,然后除以要显示的位置个数,来定位,本来想借鉴他的方法,但不行,因为我虽然降低了硬盘的转速,但比他的自行车转速还是要高n多倍的,太小的定时器会增加CPU负荷,CPU拿出更多的时间处理中断,就有更少的时间做正事,会降低效率。后来灵光一现,用的自创的方法:用两个定时器(我用的定时器0和定时器3,因为定时1用到串口了,定时器2也用了,一会儿再讲),定时器3只是用来计时,不用来来产生中断,设置定时器3的初值为0,12T模式,这样24M下大概32毫秒左右才会中断吧,关键是,在红外开关检测到转了一圈的中断处理中,将他再次置0,事实上,转一圈根本不需要32毫秒那么久,也就是说,这个定时器的中断原则上永远不会被触发。为什么这么做??嘻嘻,其实这里用了一个比较巧妙的办法,看不懂的话,需要复习一下定时器初值的计算:在INT0处理中(红外开关),先暂停定时器3,然后看看它的TH和TL的值是多少,也就是转一整圈跑过的计数,用0xffff减去这个数,就是跑一圈需要的时间计数,再除以你要显示的列数,得到数再用0xffff减,就是你定时0应该设定的初值,这样,转一圈,定时器0刚好会中断n次,n就是你要的次数。

     四、钟表显示。其实这个显示是没有难度的,用上面的方法,让定时器0转一圈刚好中断60次,然后画出刻度、时针、秒针、分针,难点在于DS1302速度很慢,每次中断都去读时间的话,会来不及。采取了这样的方法,由于文字显示和钟表显示交替进行,所以只在交替时读取一次当前时间,然后用定时2,每隔20毫秒中断一下,这样中断50次后去增加秒针计数,判断秒是否大于59,随即根据情况增加分针和时针计时,这样既保证了时间的准确性(每次状态切换都会重新从DS1302读数,相当于校正时间),又确保了高转速下的时钟的显示。

     五、上位机改字及文字保存。上位机软件用VC写的,将HZK16汉字库作为资源链接到程序中,解析文字时,先将文字转换为ANSI编码(程序用UNICODE编译),然后根据区吗和位码计算字模在汉字库的偏移(每个汉字16*16点阵,就是32字节),lock一下HZK16资源,指针+偏移量,就是字模了。由于选择LED按列显示,所以要稍微做一些处理,就是按列扫描,最后形成字模数据,发送给单片机(关于HZK16字模的计算方法,请自行百度)。单片机上,使用STC内置的EEPROM,有两个扇区,一个扇区512字节。由于扇区的写入前必须要擦除,但擦除只能按扇区进行,所以,干脆只使用其中的一个扇区。其中,前两个字节固定用来存储文字的长度,其实是字模的列数,便于显示时计算,之后就是字模数据了。这样,总共可以支持(512-2)/32=15个汉字。

     六、动态平衡。就是确保让整个电路板转起来后平衡,一边重一边轻的话,震动会很厉害。其实我觉得这个才是最难的,因为它不像软件上的困难,可以通过一些技术技巧来解决,这个解决起来很麻烦。我采用了下面的办法:用细绳将电路板吊起来,两次后可以大概确定重心,然后自己估摸着增加配重,不是很准确,但也没有别的好办法。最后整个电路板转起来还是有点震动,嫌麻烦懒得再去细调了。哪位大神如果有这方面的技巧或者好办法,请一定告诉我。谢谢。


    接下来,就开始说说原理和制作过程了:

   原理图:

    这个是转动部分的原理图:

    底座的原理图:

  

   所有的元件封装都是自己弄的。PCB图:

  

需要说明一下:

   原来设计时,无线供电接收部分采用7805稳压,结果发现效果不太好,当16个LED一起全亮时,电压就不够了,后来参考XKT510的资料,用了他推荐的接收电路,但PCB那时候已经让打样的给做好了,也没有修改,直接将做好的电路板用502粘上了。。

   电路板成品图:

  

装配好的图:

猜你喜欢

转载自blog.csdn.net/sdhexu/article/details/68942503
今日推荐