amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 5103|回复: 29

STC15W404as定时器定时不准确,有遇到过吗?

[复制链接]
发表于 2014-10-25 10:41:16 | 显示全部楼层 |阅读模式
定时1ms,示波器测量大概在1.25ms  但是我这个对定时有一定要求,大家有遇到过吗,
发表于 2014-10-25 10:55:23 | 显示全部楼层
上程序         
发表于 2014-10-25 10:56:36 | 显示全部楼层
内部晶振?
 楼主| 发表于 2014-10-25 14:58:22 | 显示全部楼层

使用的是内部晶振
 楼主| 发表于 2014-10-25 14:59:34 | 显示全部楼层

#define  FOSC   12000000L
void Timer0Init(uint16_t time)          //time 微秒
{
        AUXR |= 0x80;                   //定时器0为1T模式
        TMOD = 0x00;                    //
        TL0 = (65536 - FOSC/10000000L * time);                 //initial timer0 low byte
        TH0 = (65536 - FOSC/10000000L * time) >> 8;            //initial timer0 high byte
        TR0 = 1;                        //timer0 start running
        ET0 = 1;                        //enable timer0 interrupt
        EA = 1;                         //open global interrupt switch
}
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
//TR0 = 0;//停止timer0
   Ptest = !Ptest;       
}
发表于 2014-10-25 16:09:58 | 显示全部楼层
12除10等于1,不等于1.2。
发表于 2014-10-25 16:15:05 | 显示全部楼层
FOSC/10000000L * time  => FOSC* time /10000000L
发表于 2014-10-25 16:24:23 | 显示全部楼层
LS可能是对的,你不用浮点的话应该先乘再除,否则误差会很大。
发表于 2014-10-25 16:29:55 来自手机 | 显示全部楼层
6L正解   
发表于 2014-10-25 16:39:17 | 显示全部楼层
本帖最后由 lcw_swust 于 2014-10-25 16:40 编辑
yxylxj 发表于 2014-10-25 14:59
#define  FOSC   12000000L
void Timer0Init(uint16_t time)          //time 微秒
{


6楼与7楼说得对,整数与整数的乘除法运算结果只取整数部分,应当先乘后除才能最大的保证精度。
此外,10000000L貌似多了个0
 楼主| 发表于 2014-10-25 16:39:39 | 显示全部楼层
snoopyzz 发表于 2014-10-25 16:15
FOSC/10000000L * time  => FOSC* time /10000000L

呵呵 这样不行啊,误差更大.
发表于 2014-10-25 16:41:12 | 显示全部楼层
嗯,赞同楼上诸位的说法
 楼主| 发表于 2014-10-25 16:41:31 | 显示全部楼层
登云钓月 发表于 2014-10-25 16:09
12除10等于1,不等于1.2。

应该是这个原因,本来想做带参数 进来,看来只有 计算好数据然后调整了。
 楼主| 发表于 2014-10-25 16:45:26 | 显示全部楼层
本来是想用定时器 实现精确延时来模拟一个433 载波PWM ,没想到 定时不准,最后 用指令延时,计算汇编指令时间,这样更准确
12M 内部晶振 下延时
void delay160us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=106;b>0;b--)
        for(a=3;a>0;a--);
}

void delay200us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=6;b>0;b--)
        for(a=98;a>0;a--);
}

void delay600us(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=3;c>0;c--)
        for(b=239;b>0;b--)
            for(a=1;a>0;a--);
}

示波器测量 误差几乎可以忽略
 楼主| 发表于 2014-10-25 16:50:29 | 显示全部楼层
lcw_swust 发表于 2014-10-25 16:39
6楼与7楼说得对,整数与整数的乘除法运算结果只取整数部分,应当先乘后除才能最大的保证精度。
此外,100 ...

是多了个0
 楼主| 发表于 2014-10-25 16:58:48 | 显示全部楼层
lcw_swust 发表于 2014-10-25 16:39
6楼与7楼说得对,整数与整数的乘除法运算结果只取整数部分,应当先乘后除才能最大的保证精度。
此外,100 ...

刚测试 先乘后除 误差更大,定时器根本不正常
发表于 2014-10-25 17:04:20 来自手机 | 显示全部楼层
先乘后除,数据类型要long'long
发表于 2014-10-25 17:05:24 来自手机 | 显示全部楼层
木有仿真器看计算结果,真是蛋疼
发表于 2014-10-25 17:29:20 | 显示全部楼层
yxylxj 发表于 2014-10-25 16:58
刚测试 先乘后除 误差更大,定时器根本不正常

把工程发上来
发表于 2014-10-25 23:59:01 | 显示全部楼层
yxylxj 发表于 2014-10-25 14:59
#define  FOSC   12000000L
void Timer0Init(uint16_t time)          //time 微秒
{



TL0 = (65536 - (FOSC/100)*time/10000);                 
TH0 = (65536 - (FOSC/100)*time/10000) >> 8;  
发表于 2014-10-26 00:48:43 | 显示全部楼层
直接把初始化函数改成1ms初始化吧,别用1us了
发表于 2014-12-23 23:15:58 | 显示全部楼层
可以用STC-ISP的下载工具里有计算啊
顺路问一下stc15w404AS 是不是好像只能用定时器0和定时器2. 没有定时器1吧
发表于 2014-12-24 08:45:52 | 显示全部楼层
22楼正解啊
 楼主| 发表于 2014-12-24 09:00:06 | 显示全部楼层

我这个是想带参数  有很多定时时间
发表于 2014-12-27 20:09:22 | 显示全部楼层
定时器是数字系统,不会有误差,出现误差是因为你的时钟或程序。
发表于 2014-12-28 01:30:56 | 显示全部楼层
建议你使用12M的系统时钟
定时器设置成12T,16位自动重载,方波产生工作方式。

12M/12 = 1M, 1个计数脉冲宽度为1us。
要产生1ms方波,初值设置为65536-500,根本不用开中断,自动有个引脚会输出周期1ms的方波。如果不准,那就是系统时钟不准了,换成外接12M晶振.
要产生1ms中断,初值设置为65536-1000。
初值设置为65536-1001,则中断的间隔为1.001ms.

如果定时精度要求在1us以下变动,建议使用10M晶体。 1个计数脉冲宽度为0.1us。
定时器设置成1T,16位自动重载

要产生1ms中断,初值设置为65536-10000。
初值设置为65536-10001,则中断的间隔为1.0001ms.


发表于 2014-12-28 15:16:54 | 显示全部楼层
楼主:你可以到WWW.STCMCU.COM官网下载一个下载软件,你可以看看里面的范例程序。
发表于 2014-12-28 15:23:10 | 显示全部楼层
楼主可以参考STC下载软件里的范例程序,还有其它跟好的资料。希望对你有所帮助。

stc-isp-15xx-v6.80.zip

2.05 MB, 下载次数: 1133

发表于 2014-12-29 11:57:54 | 显示全部楼层
QQ截图20141229115908.jpg stc-isp-15xx-v6.82D.zip (2.08 MB, 下载次数: 2263)
发表于 2015-1-6 14:47:34 | 显示全部楼层
machao 发表于 2014-12-28 01:30
建议你使用12M的系统时钟
定时器设置成12T,16位自动重载,方波产生工作方式。

太详细了~
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-8-20 10:24

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表