智涅 发表于 2020-12-25 22:56:39

请问关于STC8G掉电唤醒定时器问题

目前需要比较低的功耗,所以选择掉电模式(PD)然后通过掉电唤醒定时器进行唤醒
1、关于精度
文档只提到“时钟频率约为32KHz,误差较大”,也只有提及内部IRC的精度,好像没找到这个掉电唤醒定时器时钟的误差

2、关于读取
试过从RAM中能正常读取(35.7k),但是从Flash中却读取失败? (STC——ISP烧录的时候也能读取到35.7k)
F32K = (int idata *)0xf8;//从ram读取,能读到35700
F32K=(int code*)0x1ff5;//从flash读取,0xffff(stc8g1k08a)
另外,从RAM读取的例程的标题是被划横线的,是不是被划线的方法都不可取了?


3、使用时,利用串口0烧录好之后,txd rxd的线不拔掉和拔掉是分别2个不同的定时时长(重新上电各自的一致性也都比较好),两个时长差异有10%以上,我没有使用串口功能,目前怕还会有其他因素影响这个定时时间。

wye11083 发表于 2020-12-26 08:50:46

不要指望rc振荡器的稳定性,这玩意是让片子能跑一些起码的功能,当时钟用必须得晶振。rc时钟环境漂移一般都在30%左右。

国学芯用 发表于 2020-12-26 09:29:25

1.休眠模式,需要读取内部32K的频率实际值,然后计算
F32K = (int idata *)0xf8; //获取32K频率实际值
F32K_real = *F32K;
Sleep_avg = 1000000.0/F32K_real*16;


WKTCH = 0xff;
WKTCL = 0xfe;
PCON = PD;       //MCU进入掉电模式
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  Sleep_cnt = WKTCH &0x7f;
  Sleep_cnt = (Sleep_cnt << 8) + WKTCL;
  Speed_time = Speed_time + (Sleep_cnt*Sleep_avg/1000);

2. 所有的数据 从flash读取是最准确的。

智涅 发表于 2020-12-26 23:10:35

国学芯用 发表于 2020-12-26 09:29
1.休眠模式,需要读取内部32K的频率实际值,然后计算
F32K = (int idata *)0xf8; //获取32K频率实际值 ...

为什么我读Flash的读不出来?代码都是完全按照例程的,地址看了下也是对的

su33691 发表于 2020-12-26 23:54:37

要进行设置

小李非刀 发表于 2020-12-28 21:42:11

唤醒定时器的时钟振荡器是一个简单的振荡器(要电流很小所以没有电压、温度补偿,而主频率是有温度、电压补偿所以能做到常温0.3%、全温1%精度),在5V 25度时是32K左右,但是温度变化、电压变化,都会导致频率变化,比如在3V时,可能只有20多K,所以唤醒定时器只能用于一般的唤醒,不能用于精确时间的唤醒。

ax6808 发表于 2022-3-6 02:17:35

哦!拜读了!
近日研究掉电唤醒省电代码时,想固化平均电流指标范围,就实测了几次掉电微功耗的占空比:
实测VDD3.3V时都是35K左右,代码设计是应该约4S唤醒的,结果是总时间5.5S(唤醒工作时间暂时未实测,先估计200mS左右吧),那么误差约32.5%。
温漂主要跟VDD及温度有关,只要有一定线性关系,应该可以自己适当修正,也有关足够用了!前提:除可靠性第一外,省电是第二主要指标!

ax6808 发表于 2022-3-28 00:06:10

今天又测试了一下我的实际模块STC8+硬件I2C电路板。VCC3.7V锂电池供电,VDD LDO3.3V,TSSOP20封装,3个脚为ADC高阻输入,6个脚接I2C或控制脚及2个脚串口准双向,其余空脚设准双向写1,4秒掉电唤醒一次...最终掉电后的电流也只做到29μA就再也下不来了(掉电前已关闭ADC、串口中断,I/O口设为全高阻等等电流都不会更小了).理论上还可以降低掉电后的电流的???LDO有几μA,I2C传感器2脚本身极省电模式最多几μ安有10K上拉电阻查询模式。。。。
也不知道掉电期间还有什么内部功能可以关闭进一步省电。

另外我实测了一下STC8好裸板(只有电容)最后实际3.3V时2μA左右就对了:掉电模式本身0.4μA,掉电唤醒定时器1.5μA,总共约2μA就对了!!!
VDD为5V时大很多!
我用的USB转串口的3.7V电源脚(本来有3.3V脚的,我把它跟VCC脚焊在一起了没分开,而VCC脚只是5V串了2个二极管后约3.7V出来的)。

sfes 发表于 2022-3-28 07:06:50

ax6808 发表于 2022-3-28 00:06
今天又测试了一下我的实际模块STC8+硬件I2C电路板。VCC3.7V锂电池供电,VDD LDO3.3V,TSSOP20封装,3个脚为A ...
(引用自8楼)

I O 不要高阻。要确定的电平

ax6808 发表于 2022-11-30 22:55:40

sfes 发表于 2022-3-28 07:06
I O 不要高阻。要确定的电平
(引用自9楼)

嗯!谢谢!后来哪些都全部搞清楚了.

结果,过了好久,现在再仔细看手册关于"掉电唤醒定时器定时时间计算公式:   (10^6× 16× 计数次数)/Fwt (微妙)   
里面的16是啥玩意?本人射频专业天天算频率也百思不得其解. 最后只能睁一只眼闭一只眼当是没说明固定16分频, 所以公式才要× 16........

ax6808 发表于 2022-12-1 00:49:45

小李非刀 发表于 2020-12-28 21:42
唤醒定时器的时钟振荡器是一个简单的振荡器(要电流很小所以没有电压、温度补偿,而主频率是有温度、电压补 ...
(引用自6楼)

原来:
RTC的晶振频率为什么是32768Hz?
1. RTC时间是以振荡频率来计算的。故它不是一个时间器而是一个计数器。而一般的计数器都是16位的。又因为时间的准确性很重要,故震荡次数越低,时间的准确性越低。所以必定是个高次数。2^15= 32768。
2. 32768 Hz = 2^15即分频15次后为1Hz,周期 = 1s。
3.经过工程师的经验总结32768 Hz,时钟最准确。
4.规范和统一。
————————————————
版权声明:本文为CSDN博主「Mbwide」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ssssadw/article/details/111304092


原来:按手册设置16位为:   4095: 10^6÷32K×16×(1+4095) ≈ 2 秒   手册没说×16什么意思,就当分频了(接近规范的15);
实际:我常温使劲调试设置为3367(0D27,已+B7=1启用掉电唤醒专用定时器;):才实测1.968s(多片才很接近2s);    ISP检测多片,显示均约为35KHz;
那么:按我实测值推导:      (3367÷1.968)×16分频 ≈实际27.4KHz;   误差:(27.4-35)/取32.8 ≈ -23%, 已就是说常温普遍频率偏低些;
后来:刚好我想用这个定时器累计一下超低功耗长时工作时间, 经多次冰箱-20℃等对比环境温度(约30℃,低50℃)试验,得出某个结果,就用小设备自带传感器BMP280的温度数据进行了适当修正, 效果很好;                                          
结论:就是年内玩了一把,近日又温习了一遍,呵呵!

小李非刀 发表于 2022-12-9 17:15:25

可以使用STC带RTC的型号,外接32768KHz的晶振,睡眠电流一般3uA左右。型号为STC8H8K64U、STC8H4K64TL、STC32K12K128等等均带RTC。

小李非刀 发表于 2023-2-25 22:50:53

ax6808 发表于 2022-3-28 00:06
今天又测试了一下我的实际模块STC8+硬件I2C电路板。VCC3.7V锂电池供电,VDD LDO3.3V,TSSOP20封装,3个脚为A ...
(引用自8楼)

睡眠时IO不耗电的处理方法:

1、对于设置为准双向口、推挽输出、开漏输出低电平的IO,IO本身不耗电,输出电平与外部电路配合成外部电路不耗电的方式即可。

2、设置为高阻或开漏输出高电平的IO,如果悬空,则会因为输入状态不确定导致有电流,以下两种方式任选一种:
    A、IO口接一个确定的高电平(电压高于VDD-0.3)或低电平(电压低于0.3V),否则耗电。
    B、将IO口对应的数字输入功能关闭(对于STC8系列、STC32系列)。
       比如关闭P1.0、P1.1的数字输入:
         P_SW2 |= 0x80;   //允许操作扩展寄存器
         P1IE   = ~0x03;//将P1.0 P1.1的数字输入功能关闭

3、睡眠前,禁止ADC(如果已经允许的话),禁止模拟比较器(如果已经允许的话)。
页: [1]
查看完整版本: 请问关于STC8G掉电唤醒定时器问题