熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2022-12-19 10:28
正文摘要:需要做一個(gè)一秒鐘的倒計(jì)時(shí)功能,可以設(shè)一個(gè)1ms定時(shí)器,循環(huán)1000次,也可以設(shè)一個(gè)50ms定時(shí)器,循環(huán)20次。請(qǐng)問(wèn)哪種時(shí)間比較準(zhǔn)確??jī)煞N方法系統(tǒng)開(kāi)銷有差別嗎?(因?yàn)檫有很多其他功能,循環(huán)次數(shù)多會(huì)影響其他功能運(yùn)行嗎 ... |
新鄉(xiāng)家電維修 發(fā)表于 2023-1-21 13:19 定時(shí)器0軟件重裝控制電機(jī)調(diào)速,定時(shí)器1軟件重裝控制液體體積倒數(shù),定時(shí)器3自動(dòng)重裝掃描ec11,按鍵和產(chǎn)生500ms和1秒時(shí)基信號(hào)。3個(gè)定時(shí)器全用完了。 |
| 使用定時(shí)器,自動(dòng)重裝模式不會(huì)引入誤差,時(shí)間精度跟晶振一致,你用一個(gè)0.01ppm的恒溫晶振,年誤差不超過(guò)0.3秒,我就做有這么一個(gè)。 |
新鄉(xiāng)家電維修 發(fā)表于 2023-1-21 13:19 確定了,定時(shí)器最后用的是2ms時(shí)長(zhǎng)。中斷里3個(gè)標(biāo)志位,1個(gè)2ms掃描EC11,1個(gè)500ms閃動(dòng)數(shù)碼管,1個(gè)1s給倒計(jì)時(shí)。 |
| 定時(shí)器中斷定1秒必須設(shè)為自動(dòng)重裝初值模式,手動(dòng)重裝誤差大,有多個(gè)中斷應(yīng)設(shè)為高優(yōu)先級(jí)。 |
| 你要是會(huì)點(diǎn)單片機(jī)知識(shí)就不會(huì)問(wèn)了,延時(shí)是最基層的入門程序。你不會(huì)告訴你也不會(huì)用 |
| 單從對(duì)別的函數(shù)的影響來(lái)考慮的話,當(dāng)然是中斷的次數(shù)越少越好。 |
| 通常都是有誤差的,可以在循環(huán)里放一個(gè)IO口的Toggle 語(yǔ)句,然后用示波器看端口輸出方波波長(zhǎng),然后調(diào)整語(yǔ)句就能準(zhǔn)確了 |
188610329 發(fā)表于 2022-12-20 14:14 謝謝前輩指導(dǎo)!我試一下。 |
ningsy 發(fā)表于 2022-12-20 10:59 STC8G 的 定時(shí)器2 有 8位預(yù)分頻(TM2PS) 寄存器,你可以直接 64分頻后,直接得到1秒的 定時(shí)時(shí)間。以你現(xiàn)有的例子為例: void Timer2Init(void) //1秒@11.0592MHz { AUXR &= 0xFB; //定時(shí)器時(shí)鐘12T模式 P_SW2 |= 0x80; TM2PS = 63; //64分頻 T2L = 0xC0; //設(shè)置定時(shí)初始值 65536-1440 T2H = 0xC7; //設(shè)置定時(shí)初始值 AUXR |= 0x10; //定時(shí)器2開(kāi)始計(jì)時(shí) } |
| 看你對(duì)準(zhǔn)的要求怎樣 |
| 跟你循環(huán)多少次其實(shí)沒(méi)多大關(guān)系,準(zhǔn)不準(zhǔn)看晶振,一般外部晶振可以達(dá)到0.001的誤差,內(nèi)部晶振1%-3%的誤差。想要看看精確度,最好看看芯片手冊(cè) |
| 定時(shí)器工作于自動(dòng)重裝方式,1ms或50ms,精度一樣,取決于晶振的精度。 |
188610329 發(fā)表于 2022-12-20 10:22 現(xiàn)在用的是STC8G1K08(兼容STC8H1K08),定時(shí)器2,50ms 12T自動(dòng)重載,STC-ISP定時(shí)器計(jì)算器的代碼。用山寨邏輯分析儀測(cè)試1S方波脈寬,每次測(cè)還不一樣,有時(shí)候準(zhǔn)的很,多數(shù)時(shí)候要慢零點(diǎn)幾毫秒。可能IRC頻率自動(dòng)調(diào)整誤差也有影響。 您說(shuō)的“分頻計(jì)數(shù)器”是什么呢?我這個(gè)項(xiàng)目代碼空間快不夠了,還想用USB來(lái)升級(jí),未來(lái)準(zhǔn)備改成STC8H8K64U,能直接產(chǎn)生1秒時(shí)基嗎? void Timer2Init(void) //50毫秒@11.0592MHz { AUXR &= 0xFB; //定時(shí)器時(shí)鐘12T模式 T2L = 0x00; //設(shè)置定時(shí)初始值 T2H = 0x4C; //設(shè)置定時(shí)初始值 AUXR |= 0x10; //定時(shí)器2開(kāi)始計(jì)時(shí) } |
| 如果,一上來(lái)就是奔著1秒去的,如果用的是沒(méi)有重載功能89c51這種片子,則兩種都不好。 應(yīng)該按,第一次跑余,后面都跑滿65536來(lái)設(shè)計(jì)。 如是帶自動(dòng)重載的定時(shí)器,則50ms較好。如果是帶分頻計(jì)數(shù)器這種,應(yīng)直接定1秒。總之應(yīng)根據(jù)使用的單片機(jī)來(lái)做合理設(shè)置。 |
| 其它功能盡量不要寫(xiě)到中斷程序里,不然會(huì)有誤差 |
| 準(zhǔn)確與否,看給定時(shí)器的值準(zhǔn)不準(zhǔn),比如65536-11059200/12*50/1000=19456,這樣定時(shí)50ms,結(jié)果是個(gè)整數(shù)。如果定時(shí)1ms,那么在計(jì)算11059200/12*1/1000=921.6,會(huì)有小數(shù),這樣就會(huì)有精度損失。 |
| 設(shè)一個(gè)單片機(jī)工作于12M晶體震蕩器,它的時(shí)鐘周期是1/12(微秒)。它的一個(gè)機(jī)器周期是12*(1/12)也就是1微秒。所以設(shè)置1s定時(shí),無(wú)論怎么設(shè)置定時(shí)器、怎么循環(huán),理論上運(yùn)行的機(jī)器周期是一樣的,即總循環(huán)次數(shù)是一樣的。 |
| 定時(shí)器誤差受程序其他部分影響不小,合理的程序才能保證秒鐘的準(zhǔn)確. |
Powered by 單片機(jī)教程網(wǎng)