2014-08-29 151 views
1

爲了我的檢查,我需要一個燈,我可以閃爍最小。 40毫秒。 我仍然可以控制燈光。燈具有20個不同的LED通道。 我可以控制通道(1-20,整數),強度(0-1000,整數)以及LEDS應該一次閃爍多長時間(40-。毫秒)的時間。通過使用定時器來閃爍LED C++

其實我睡眠功能解決了這個問題:

channelID = 5; 
intens = 1000; 
time  = 50 //milliseconds 

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

這樣的作品,但它太模糊。有+/- 5%的偏差。 如何實現一個解決方案,其中閃光時間始終相同? 我聽說過計時器事件,但我不知道該怎麼做。 我的編程知識非常糟糕。可能是你可以幫助我,你有我的代碼示例?

非常感謝你!

+0

我已經刪除了'Matlab'標籤,因爲它似乎不相關。請編輯問題,如果我錯了,並添加標籤 – 2014-08-29 11:31:40

+0

請參閱:http://stackoverflow.com/questions/14650885/how-to-create-timer-events-using-c-11 – Horius 2014-08-29 11:34:16

+0

或在這裏:http: //sackoverflow.com/questions/1487695/c-cross-platform-high-resolution-timer – user2079303 2014-08-29 11:35:54

回答

0

如果這是窗口,那麼默認的滴答速率是64赫茲或15.625毫秒。 50毫秒的睡眠時間將交替到最接近的64赫茲邊界,所以它們的範圍從46.875到62.5毫秒。您可以使用timeBeginPeriod()加快股票價格。完成後不要忘記使用timeEndPeriod()

如果你想要一個以非常精確的頻率運行的循環,通常在它自己的線程中,這裏就是C代碼示例。這與Windows XP兼容,使用Sleep(1)可能需要長達2ms,因此最大頻率約爲400.對於Windows 7及更高版本,Sleep(1)將爲1ms,因此用適當計算的u1ms替換u2ms將允許最大頻率約爲800.

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 */