[技术问答]

N76E003 用内部晶振 定时器定时时间不准的问题

[复制链接]
6587|32
手机看帖
扫描二维码
随时随地手机跟帖
meng_1226|  楼主 | 2018-6-27 16:30 | 显示全部楼层 |阅读模式
用N76E003来替换stm8s003 , 一个简单的定时逻辑,比如延时1分钟,采用timer3定时, 发现定时不准,
1分钟总会相差1~2s, 而且两个产品都用的n76E003的芯片,同时启动延时1分钟,两个产品有明显的时间差,
请问哪位能帮忙解决一下, 是不是芯片本身的晶振误差还是我的寄存器设置的问题, 我用的内部16M
评论
meng_1226 2018-6-29 14:00 回复TA
@123987 :官方手册是2% 
123987 2018-6-29 12:00 回复TA
内部晶振大部分都是RC晶振吧?5%的误差精度很正常。 
稳稳の幸福| | 2018-6-27 20:38 | 显示全部楼层
你说的这也太夸张了,你这是盗版芯片?

使用特权

评论回复
meng_1226|  楼主 | 2018-6-28 08:12 | 显示全部楼层
本帖最后由 meng_1226 于 2018-6-28 14:06 编辑
稳稳の幸福 发表于 2018-6-27 20:38
你说的这也太夸张了,你这是盗版芯片?

1. 我实际测试就是这个结果,夸不夸张不清楚!
2. 官方淘宝店买的芯片, 盗不盗版不清楚!


使用特权

评论回复
稳稳の幸福| | 2018-6-28 08:34 | 显示全部楼层
你这种满口脏话的,人家其他朋友看到都懒得搭理你。另外你延时的问题肯定是你没有配置正确。你想你说的这个误差太大了 ,要知道设置波特率115200都稳的很。怎么可能1分钟差2秒。这个需要分频的,是不是你全部用软件自己编程实现的类似分频的功能,这个需要设置寄存器分频,如果你想实现1S的稳定定时,你用16M的分频后可以达到吗,你算了没,你用过传统的51没有?传统的51一般用12M左右的晶振,但是你知道通常用哪个数额的晶振吗?
11.0592MHZ

使用特权

评论回复
稳稳の幸福| | 2018-6-28 08:35 | 显示全部楼层
为什么51单片机爱用11.0592MHZ晶振?

    其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。

    其二:用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式 算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率 偏差在4%左右都是可以的,所以也还能用STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。 这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。 用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大影响。
看完这个再不懂怎么回事,你再敢骂人,我就举报你。

使用特权

评论回复
gx_huang| | 2018-6-28 08:37 | 显示全部楼层
本帖最后由 gx_huang 于 2018-6-28 09:08 编辑

一个会骂人,一个也是不懂装懂(应该是没有仔细看贴)。一个说时钟误差,一个说串口波特率的误差,哎!

使用特权

评论回复
小S咯| | 2018-6-28 09:36 | 显示全部楼层
兄弟,火气不要那么大。
我用timer2定时过3小时,差20S左右,你想要的话拿去参考一下
//100ms中断一次
void Timer2_Init(void)
{

        TIMER2_DIV_128;
  TIMER2_Auto_Reload_Delay_Mode;

  RCMP2L = 65536-12500;
  RCMP2H = (65536-12500)>>8;
  TL2 = 0;
  TH2 = 0;

  set_ET2;                                    // Enable Timer2 interrupt
  set_EA;
  set_TR2;                                    // Timer2 run                               //Timer0 run

}

void Timer2_ISR (void) interrupt 5
{

       static u16 timer_count1=0,timer_count2=0;
       clr_TF2;                                //Clear Timer2 Interrupt Flag
      timer_count1++;
      if(timer_count1>=1000)
      {
          timer_count1=0;
          timer_count2++;
         if(timer_count2>=108)
         {
              timer_count2=0;
              _3hour_flag=1;
          }
       }

使用特权

评论回复
gaoyang9992006| | 2018-6-28 10:37 | 显示全部楼层
gx_huang 发表于 2018-6-28 08:37
一个会骂人,一个也是不懂装懂(应该是没有仔细看贴)。一个说时钟误差,一个说串口波特率的误差,哎! ...

他的意思应该是通过串口波特率误差说明时钟配置的误差,他应该是想说那个内部的16M是可以配置为16.6那个问题。

使用特权

评论回复
gaoyang9992006| | 2018-6-28 10:39 | 显示全部楼层
当年我用1毛钱一个的垃圾110592晶振都可以做到1天误差2秒。这个003用的人也挺多的,大家的反应是内部振荡器RC稳定性还可以,你最好贴出你的代码,你只说误差大,大家也不知道是不是你的软件配置问题。另外你不该骂人啊,骂人影响其他人回复你。比如有人想说两句的看到后,就懒得理你了,怕你恶语相向。

使用特权

评论回复
gaoyang9992006| | 2018-6-28 10:58 | 显示全部楼层
如果你用定时器3那么你可以使用16M,然后分频为128,你可以计算出你只需要两次中断就可以获取1S,中断计数周期可以取62500,这样应该会更精确,你试试看。你也可以分频为16,这样就需要至少20次中断,每次0.05S,不过中断次数越多,误差越大的,所以按照最小的来。

使用特权

评论回复
gaoyang9992006| | 2018-6-28 10:58 | 显示全部楼层
如果你用定时器3那么你可以使用16M,然后分频为128,你可以计算出你只需要两次中断就可以获取1S,中断计数周期可以取62500,这样应该会更精确,你试试看。你也可以分频为16,这样就需要至少20次中断,每次0.05S,不过中断次数越多,误差越大的,所以按照最小的来。

使用特权

评论回复
评论
xiaokia 2018-9-13 11:38 回复TA
set_T3PS2; set_T3PS1; set_T3PS0;//设置定时器3分频比1:128(1/16MHZ*128=8us) RH3=(65536-3036)>>8; RL3=65536-3036;//定时器3装初值,定时500ms溢出 clr_TF3;//清零定时器3溢出标志位 set_ET3;//开定时器3中断 EA=1;// 开总中断 晶振频率16M 为什么定时时间远远小于500ms 大概只有50ms 
meng_1226|  楼主 | 2018-6-28 14:07 | 显示全部楼层
小S咯 发表于 2018-6-28 09:36
兄弟,火气不要那么大。
我用timer2定时过3小时,差20S左右,你想要的话拿去参考一下
//100ms中断一次

你的代码跟我的差不多, 应该就是芯片本身的内部晶振的精度问题了,谢谢!

使用特权

评论回复
meng_1226|  楼主 | 2018-6-28 14:11 | 显示全部楼层
gaoyang9992006 发表于 2018-6-28 10:58
如果你用定时器3那么你可以使用16M,然后分频为128,你可以计算出你只需要两次中断就可以获取1S,中断计数 ...

多谢,  我用timer3,  定时10ms  运行6000次和定时1S 运行60次, 结果是一样的,
比如定时时间1分钟到了控制一个led灯亮,  两个产品灯亮的时间有明显的先后, 相差1S左右
可以断定应该就是芯片本身的内部晶振的差异了

使用特权

评论回复
HKingS| | 2018-6-28 15:31 | 显示全部楼层
gx_huang 发表于 2018-6-28 08:37
一个会骂人,一个也是不懂装懂(应该是没有仔细看贴)。一个说时钟误差,一个说串口波特率的误差,哎! ...

哈哈,同意。

使用特权

评论回复
HKingS| | 2018-6-28 15:33 | 显示全部楼层
meng_1226 发表于 2018-6-28 14:11
多谢,  我用timer3,  定时10ms  运行6000次和定时1S 运行60次, 结果是一样的,
比如定时时间1分钟到了 ...

即使是内部晶振,1分钟差下1-2s是不可原谅的。

使用特权

评论回复
meng_1226|  楼主 | 2018-6-28 15:44 | 显示全部楼层
HKingS 发表于 2018-6-28 15:33
即使是内部晶振,1分钟差下1-2s是不可原谅的。

不可原识也没办法 ,  芯片差异!

使用特权

评论回复
643757107| | 2018-6-28 16:08 | 显示全部楼层
这种廉价芯片你还想非常精确怎么可能,这种定位的芯片肯定不是让你计时器用的,而你作为简单的应用根本是不需要实时时钟这种事情,因此是楼主你定位问题,你说这个误差确实可能存储,那些便宜单片机都这样。毕竟好多时钟芯片都比这个单片机还贵。。

使用特权

评论回复
meng_1226|  楼主 | 2018-6-28 16:22 | 显示全部楼层
643757107 发表于 2018-6-28 16:08
这种廉价芯片你还想非常精确怎么可能,这种定位的芯片肯定不是让你计时器用的,而你作为简单的应用根本是不 ...

这不是stm8S涨价搞出来了事嘛?   说与stm8s003完全兼容, 价格又有优势,所以才替换的呀,
产品也很简单,类似于定时器, 4个时间档(1分钟,2分钟,3分钟,4分钟), 处理一些简单逻辑,
stm8s也是用内部晶振,两个产品对比测试没有这么大的差异

使用特权

评论回复
lilinfei520| | 2018-6-28 17:27 | 显示全部楼层
我怎么没有看到楼主骂人的话

使用特权

评论回复
jcdzxh| | 2018-6-28 18:55 | 显示全部楼层
60秒误差1秒,假如代码没问题,再假如没超nu手册的极限值,可以索赔吧
温度,电压,1.6666%

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

67

帖子

2

粉丝