新乡家电维修 发表于 2023-1-21 13:19 定时器0软件重装控制电机调速,定时器1软件重装控制液体体积倒数,定时器3自动重装扫描ec11,按键和产生500ms和1秒时基信号。3个定时器全用完了。 |
使用定时器,自动重装模式不会引入误差,时间精度跟晶振一致,你用一个0.01ppm的恒温晶振,年误差不超过0.3秒,我就做有这么一个。 |
新乡家电维修 发表于 2023-1-21 13:19 确定了,定时器最后用的是2ms时长。中断里3个标志位,1个2ms扫描EC11,1个500ms闪动数码管,1个1s给倒计时。 |
定时器中断定1秒必须设为自动重装初值模式,手动重装误差大,有多个中断应设为高优先级。 |
你要是会点单片机知识就不会问了,延时是最基层的入门程序。你不会告诉你也不会用 |
单从对别的函数的影响来考虑的话,当然是中断的次数越少越好。 |
通常都是有误差的,可以在循环里放一个IO口的Toggle 语句,然后用示波器看端口输出方波波长,然后调整语句就能准确了 |
188610329 发表于 2022-12-20 14:14 谢谢前辈指导!我试一下。 |
ningsy 发表于 2022-12-20 10:59 STC8G 的 定时器2 有 8位预分频(TM2PS) 寄存器,你可以直接 64分频后,直接得到1秒的 定时时间。以你现有的例子为例: void Timer2Init(void) //1秒@11.0592MHz { AUXR &= 0xFB; //定时器时钟12T模式 P_SW2 |= 0x80; TM2PS = 63; //64分频 T2L = 0xC0; //设置定时初始值 65536-1440 T2H = 0xC7; //设置定时初始值 AUXR |= 0x10; //定时器2开始计时 } |
看你对准的要求怎样 |
跟你循环多少次其实没多大关系,准不准看晶振,一般外部晶振可以达到0.001的误差,内部晶振1%-3%的误差。想要看看精确度,最好看看芯片手册 |
定时器工作于自动重装方式,1ms或50ms,精度一样,取决于晶振的精度。 |
188610329 发表于 2022-12-20 10:22 现在用的是STC8G1K08(兼容STC8H1K08),定时器2,50ms 12T自动重载,STC-ISP定时器计算器的代码。用山寨逻辑分析仪测试1S方波脉宽,每次测还不一样,有时候准的很,多数时候要慢零点几毫秒。可能IRC频率自动调整误差也有影响。 您说的“分频计数器”是什么呢?我这个项目代码空间快不够了,还想用USB来升级,未来准备改成STC8H8K64U,能直接产生1秒时基吗? void Timer2Init(void) //50毫秒@11.0592MHz { AUXR &= 0xFB; //定时器时钟12T模式 T2L = 0x00; //设置定时初始值 T2H = 0x4C; //设置定时初始值 AUXR |= 0x10; //定时器2开始计时 } |
如果,一上来就是奔着1秒去的,如果用的是没有重载功能89c51这种片子,则两种都不好。 应该按,第一次跑余,后面都跑满65536来设计。 如是带自动重载的定时器,则50ms较好。如果是带分频计数器这种,应直接定1秒。总之应根据使用的单片机来做合理设置。 |
其它功能尽量不要写到中断程序里,不然会有误差 |
准确与否,看给定时器的值准不准,比如65536-11059200/12*50/1000=19456,这样定时50ms,结果是个整数。如果定时1ms,那么在计算11059200/12*1/1000=921.6,会有小数,这样就会有精度损失。 |
设一个单片机工作于12M晶体震荡器,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(1/12)也就是1微秒。所以设置1s定时,无论怎么设置定时器、怎么循环,理论上运行的机器周期是一样的,即总循环次数是一样的。 |
定时器误差受程序其他部分影响不小,合理的程序才能保证秒钟的准确. |