找回密码
 立即注册
查看: 1053|回复: 10

【整个小活】基于STC8H内部RC时钟温飘的温度计,0外设测量温度

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

5

主题

14

回帖

28

积分

新手上路

积分
28
发表于 2024-4-1 20:29:38 | 显示全部楼层 |阅读模式
众所周知,STC8H系列内部32K时钟温飘特别大,频率温飘基本相当于一个NTC电阻的阻值。


2024-04-01_20-19.png

把系统时钟调低,比如11.0592MHz,这样内部16位计时器就能充分的测量一个1/32的RTC中断,即可从计时器值估测内部RTC频率;
再根据温飘映射到文档数值,就知道此时单片机的温度了。

  1. void init_rtc() {
  2.     // 选择内部 32K
  3.     IRC32KCR = 0x80; // 启动内部 32K 振荡器
  4.     while (!(IRC32KCR & 0x01))
  5.         ;           // 等待时钟稳定
  6.     RTCCFG |= 0x02; // 选择内部 32K 作为 RTC 时钟源
  7.     // 设置 RTC 时间
  8.     INIYEAR = 00;
  9.     INIMONTH = 1;
  10.     INIDAY = 15;
  11.     INIHOUR = 15;
  12.     INIMIN = 30;
  13.     INISEC = 0;
  14.     INISSEC = 0;
  15.     RTCCFG |= 0x01; // 触发 RTC 寄存器初始化
  16.     RTCIF = 0;     // 清中断标志
  17.     RTCIEN = 0x01; // 使能 RTC 1/32秒中断
  18.     RTCCR = 0x01;  // RTC 使能
  19. }
  20. // @11.0592MHz
  21. void init_tm0(void) {
  22.     AUXR &= 0x7F; // 定时器时钟12T模式
  23.     TMOD &= 0xF0; // 设置定时器模式
  24.     TMOD |= 0x01; // 设置定时器模式
  25. }
  26. uint8_t data temp_tl = 0;
  27. uint8_t data temp_th = 0;
  28. void isr_rtc() interrupt(RTC_VECTOR) using(1) {
  29.     RTCIF = 0; // 清中断标志
  30.     TR0 = 0;
  31.     temp_tl = TL0;
  32.     temp_th = TH0;
  33.     TL0 = 0xff;
  34.     TH0 = 0xff;
  35.     TF0 = 0;
  36.     TR0 = 1;
  37. }
  38. void main() {
  39.     init_sys();
  40.     init_uart();
  41.     init_tm0();
  42.     init_rtc();
  43.     while (1) {
  44.         uint16_t c = 0xffff - (temp_th << 8 | temp_tl);
  45.         int16_t t = (650 * ((int32_t)33563 - c)) / 7900;
  46.         printf("t: %d\r\n", t);
  47.         delay_ms(1000);
  48.     }
  49. }
复制代码


量程0 ~ 65度,上面的简单线性映射是我用冰块和热水校准的。
其中映射关系因为每个芯片的体制不一样,必须校准。
为了避免计算浮点数,温度t的数值单位是10摄氏度,既24.3C => 243。
假定电压和主时钟是稳定的。

测量精度在室温还说的过去

  1. // 室温输出
  2. t: 242
  3. // 手按上去加热
  4. t: 271
  5. // 冰块贴到芯片上
  6. t: 18
复制代码



各位愚人节快乐

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-08-08 21:16:41

5

主题

14

回帖

28

积分

新手上路

积分
28
发表于 2024-4-1 20:31:39 | 显示全部楼层
测试用的芯片是stc8h8k64u,实测。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:403
  • 最近打卡:2025-05-02 11:18:12

0

主题

170

回帖

959

积分

高级会员

积分
959
发表于 2024-4-1 22:13:35 | 显示全部楼层
未曾设想的逆向思维
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 2024-4-1 22:46:09 | 显示全部楼层
很有趣的想法
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:515
  • 最近打卡:2025-05-03 05:51:43

24

主题

515

回帖

994

积分

荣誉版主

积分
994
发表于 2024-4-2 05:50:10 | 显示全部楼层
楼主的想象力很丰富。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:395
  • 最近打卡:2025-05-02 05:31:55

16

主题

702

回帖

2474

积分

金牌会员

积分
2474
发表于 2024-4-2 07:44:45 | 显示全部楼层
奇思妙想
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 2024-4-2 07:49:13 | 显示全部楼层
还能这么搞啊
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:504
  • 最近打卡:2025-05-03 07:29:10
已绑定手机

1

主题

834

回帖

1451

积分

金牌会员

积分
1451
发表于 2024-4-2 08:05:43 | 显示全部楼层
佩服楼主的思维
靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-02 07:32:37

21

主题

564

回帖

2678

积分

金牌会员

积分
2678
发表于 2024-4-2 08:14:32 | 显示全部楼层
可以,用MATLAB拟合一下可以比较准确的获取当前温度
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-4-2 08:51:19 | 显示全部楼层
是不是还可以将ADC参考电压和MCU电源接起来,根据ADC15通道 测量单片机的供电电压再根据电压图修正一下。。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 08:05 , Processed in 0.196511 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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