熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
|
發(fā)布時(shí)間: 2024-5-14 21:50
正文摘要:請(qǐng)教一下大家,最近在用STC8G1K08A單片機(jī)做一個(gè)小東西,使用到了定時(shí)器0和定時(shí)器1,參照官方設(shè)定的1毫秒,然后中斷里重復(fù)1000次,作為1秒的精確延時(shí),但是實(shí)際發(fā)現(xiàn)誤差很大,不知道是我設(shè)置的問(wèn)題還是?之前用STC15W ... |
| 如果誤差超過(guò)0.5%就是你的程序有問(wèn)題,把你的程序貼出來(lái),包括定時(shí)器設(shè)置函數(shù),定時(shí)器中斷函數(shù),單片機(jī)主頻。 |
T0m 發(fā)表于 2024-5-15 22:17 邏輯分析儀里面通常有個(gè)晶振,準(zhǔn)確度與該晶振有關(guān)。 |
|
直接做軟件定時(shí)器吧,用邏輯分析儀抓一抓時(shí)間,或者改改值. |
|
void Timer0_Isr(void) interrupt 1 { } void Timer0_Init(void) //50毫秒@11.0592MHz { AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式 TMOD &= 0xF0; //設(shè)置定時(shí)器模式 TL0 = 0x00; //設(shè)置定時(shí)初始值 TH0 = 0x4C; //設(shè)置定時(shí)初始值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí) ET0 = 1; //使能定時(shí)器0中斷 } 建議用12T模式,50毫秒@11.0592MHz,每秒只進(jìn)中斷20次,頻率要設(shè)置成11.0592MHz |
|
自動(dòng)重載初值,不要用手動(dòng)重載,溢出了會(huì)自己裝進(jìn)去,中斷里不要賦值TH0,TL0寄存器。 加誤差補(bǔ)償處理且使用外部晶振,1個(gè)月誤差不到1分鐘的都有。 |
這一生只為你 發(fā)表于 2024-5-15 08:50 這么大的誤差會(huì)不會(huì)是初始化配置就有問(wèn)題?可以用示波器看下定時(shí)1MS實(shí)際測(cè)試是多少? |
這一生只為你 發(fā)表于 2024-5-15 08:50 單靠程序片段看不出毛病在哪 |
rayin 發(fā)表于 2024-5-15 07:28 我不需要特別高的精度,電路很簡(jiǎn)單,我只需要延時(shí)十分鐘,可接受誤差在一分鐘以?xún)?nèi)就好。 |
hhh402 發(fā)表于 2024-5-15 00:19 可不止,十秒的誤差都有兩三秒了,你說(shuō)的那些誤差都在可接受范圍內(nèi),我這里的誤差根本沒(méi)法用啊。。。 |
| 而且每次刷機(jī)設(shè)置的都不太一樣,要精確定時(shí)還是得外部晶振 |
| 單片機(jī)的晶振是相對(duì)精確而已, 要提高精度就要用realtime IC: DS12C887 等 ; 要求更高就用天線(xiàn)接GPS的授時(shí)信號(hào). |
誤差很大,具體是多大?STC單片機(jī)主頻誤差0.5%,所以誤差0.5%以?xún)?nèi)是正常的,1小時(shí)誤差0.5%=18S,24小時(shí)誤差=18*24=432秒。只要在這個(gè)范圍內(nèi)是正常的。![]() |
Powered by 單片機(jī)教程網(wǎng)