找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3061|回复: 1
收起左侧

旋转LED POV转速自适应实现方法

[复制链接]
ID:397957 发表于 2018-9-14 15:03 | 显示全部楼层 |阅读模式
先来一张自行车车轮上的POV效果图(图案是自己画的,哈哈,献丑了)

自行车车轮上的POV效果图
1.jpg

        在制作自行车上的POV LED显示时,最让人头疼的是车轮的转速不匀问题,如何在随时改变转速的情况下保证能正常显示是POV制作中的难题。
        经我若干时间的试验,采用自适应调节的方法,很好解决了这个问题,实际运行效果很好。并同时应用在我的新版“硬盘时钟”的程序中。
        根据POV显示原理,我们需要让LED的闪亮频率与旋转的频率同步。
        自适应调节的算法的思想就是在外部中断处理程序里,先给定时器T0一个合适的初始值,通过定时器T0处理程序给T0的中断的次数计数,当旋转一周完成后,根据实际中断次数与预设的N比较,根据比较结果,在外部中断处理程序中对T0的初设值进行修正,直到定时器T0的中断次数达到N为止。
       整个调节过程是动态的,程序中并不需要知道旋转一周的具体时间值。
        一般在中断处里程序里应尽量简化运算,减少程序代码量。我这里巧妙的使用了这样一个修正值:
       D=D+(S-N)*2;
        其中N为预设的固定值。
       当S>N时,修正值D增大,使定时器T0的时间值增大,随之N值减小。
       当S<N时,修正值D减小,使定时器T0的时间值减小,随之N值增大。
       当S=N时,修正值不产生变化。

      程序程序片段如下:

     /*外部中断0处理函数*/
     void intersvr0(void) interrupt 0 using 1
         {
           D=D+(S-N)*2;    //修正值
           Pt=600+D;         //得到定时器T0的初设值
           S=0;                  //计数器清零,将重新计数
         }

        /*定时中断0处理函数*/
       void timer0(void) interrupt 1 using 1
       {
          TH0=-Pt/256;TL0=-Pt%256;   //设置定时器T0的初设值
          S++;                                        //计数
         }
回复

使用道具 举报

ID:295290 发表于 2021-3-19 09:46 | 显示全部楼层
Pt=600+D;    这里的加600是什么作用, 还有N值要取多少呢,有没有经验值,或取值的方法?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表