首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用定时器C++使LED闪烁

使用定时器C++使LED闪烁
EN

Stack Overflow用户
提问于 2014-08-29 19:28:38
回答 1查看 596关注 0票数 1

为了我的考试,我需要一盏灯,我可以用它闪烁几分钟。40毫秒。我还是可以控制灯光的。该灯有20个不同LED的通道。我可以控制通道(1-20,整数)、强度(0-1000,整数)和LEDS闪烁一次的时间(40-...毫秒)。

实际上我用睡眠功能解决了这个问题:

代码语言:javascript
复制
channelID = 5;
intens    = 1000;
time      = 50  //milliseconds

led->setChannelIntensity(channelID, intens);
Sleep(time);
led->setChannelIntensity(channelID, 0);

这是可行的,但它太模糊了。与+/- 5%存在偏差。在闪存时间始终相同的情况下,如何实现解决方案?我听说过计时器事件,但我不知道怎么做。我的编程知识很差。也许你可以帮助我,你有一个代码示例给我吗?

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2014-08-30 00:27:28

如果是windows,则默认滴答率为64 hz或15.625 ms。50毫秒的睡眠将交替到最近的64 hz边界,因此它们的范围从46.875到62.5ms。您可以使用timeBeginPeriod()加快自动收报机的速度。完成后别忘了使用timeEndPeriod()

如果你想要一个以非常精确的频率运行的循环,通常是在它自己的线程中,下面是示例C代码。这是与Windows XP兼容的,睡眠(1)最多需要2毫秒,因此最大频率约为400。对于Windows7和更高版本,睡眠(1)将是1ms,因此用正确计算的u1ms替换u2ms将允许最大频率约为800。

代码语言:javascript
复制
typedef unsigned long long UI64;        /* unsigned 64 bit int */
#define FREQ    20                      /* frequency */
LARGE_INTEGER liPerfTemp;               /* used for query */
UI64 uFreq = FREQ;                      /* process frequency */
UI64 uOrig;                             /* original tick */
UI64 uWait;                             /* tick rate / freq */
UI64 uRem = 0;                          /* tick rate % freq */
UI64 uPrev;                             /* previous tick based on original tick */
UI64 uDelta;                            /* current tick - previous */
UI64 u2ms;                              /* 2ms of ticks */
UI64 i;

    /* ... */ /* wait for some event to start thread */
    timeBeginPeriod(1);                 /* set period to 1ms */
    Sleep(128);                         /* wait for it to stabilize */

    u2ms = ((UI64)(liPerfFreq.QuadPart)+499) / ((UI64)500);

    QueryPerformanceCounter((PLARGE_INTEGER)&liPerfTemp);
    uOrig = uPrev = liPerfTemp.QuadPart;

    for(i = 0; i < (uFreq*30); i++){
        /* update uWait and uRem based on uRem */
        uWait = ((UI64)(liPerfFreq.QuadPart) + uRem) / uFreq;
        uRem  = ((UI64)(liPerfFreq.QuadPart) + uRem) % uFreq;
        /* wait for uWait ticks */
        while(1){
            QueryPerformanceCounter((PLARGE_INTEGER)&liPerfTemp);
            uDelta = (UI64)(liPerfTemp.QuadPart - uPrev);
            if(uDelta >= uWait)
                break;
            if((uWait - uDelta) > u2ms)
                Sleep(1);
        }
        if(uDelta >= (uWait*2))
            dwLateStep += 1;
        uPrev += uWait;
        /* fixed frequency code goes here */
        /*  along with some type of break when done */
    }

    timeEndPeriod(1);                   /* restore period */
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25567367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档