找回密码
 立即注册
×

00:00:00

您有一张0.1元限时体验卡,马上领取获得VIP尊享特权。

简简单单做个USB温度传感器

2024-3-28 14:57 来自 晓飛飛 发布 @ 综合讨论

本帖最后由 晓飛飛 于 2024-3-28 15:05 编辑

温度传感器是非常常用的设备,但是低成本的USB温度传感器似乎没什么人搞,正好项目集成需要,随手搞了一个,主打一个尺寸迷你结构简单。
MCU选型原则,成本低,尺寸小,支持USB,目前STC8H2K08U只有TSSOP20封装的,希望将来能出QFN20封装的,那估计会是STC尺寸最小成本最低的USB单片机了。目前只能选择STC8H8K64U-QFN32了。
非常感谢STC提供的芯愿兑换活动,正好兑换了5片,坚决不能浪费!用起来!
原理图很简单,除了USB接口的P3.0和P3.1只用了两个IO,那就是支持Timer0外部时钟输入的P3.4和触发USB-ISP下载模式的P3.2。
传感器选了国产纳芯微的脉冲数字传感器NST1001,温度数据由脉冲数量来计算,一个脉冲表示0.0625℃,一次采集发1k多个脉冲,用T0的计数模式妥妥的靠谱。
麻雀虽小五脏俱全,该有的防护不能少,自恢复保险、33欧电阻和ESD二极管通通搞上去,毕竟不能因为细节掉了档次。
本次采用立创EDA设计输出打板,手工焊接,不得不说QFN32还是挺好焊的,只要烙铁头给力,没有什么困难的事情。
壳子还没加工回来,套个王八绿的热缩管凑合用,测个腋下体温,曲线还是蛮好的。

[attach]39934[/attach]
[attach]39931[/attach]
[attach]39936[/attach]
[attach]39935[/attach]
[attach]39933[/attach]

传感器采集时间由Timer1周期性中断触发,及驱动代码如下:
  1. void Timer1_Isr(void) interrupt 3
  2. {
  3.         static bit state;
  4.         static u8 loop;
  5.         if(++loop > 5)     //软定时器 产生50ms周期
  6.         {
  7.                 loop = 0;
  8.                 if(state)
  9.                 {
  10.                         state = 0;
  11.                         NST_PORT = 1;     //端口置高电平为传感器供电
  12.                         NOP10();                        
  13.                         TH0 = 0;          //清空计数器
  14.                         TL0 = 0;          //清空计数器                        
  15.                         TR0 = 1;          //启动计数
  16.                 }
  17.                 else
  18.                 {
  19.                         state = 1;
  20.                         NST_PORT = 0;      //端口置低电平 传感器断电
  21.                         TR0 = 0;
  22.                         temp_cont = (TH0 << 8) | TL0;
  23.                         temp_sum = (float)(temp_cont) *  0.0625 - 50.0625;           //10次采集值累加               
  24.                         temp_value =  (int)(((temp_sum-30) * 0.005 + temp_sum)* 100);
  25.                         updata_flag = 1;               
  26.                 }
  27.         }                        
  28. }
复制代码
数据帧结构为帧头、数据、 校验、帧尾的自定义格式
数据帧包含了解算好的温度值,这里乘了100,可以用整型表示到小数点后2位,同时包含了传感器脉冲数,便于调试。

  1.             out_buf[0] = 0xAA;
  2.             out_buf[1] = 0x20;
  3.             out_buf[2] = (u8)(temp_value >> 8);
  4.             out_buf[3] = (u8)(temp_value & 0xff);
  5.             out_buf[4] = (u8)(temp_cont >> 8);
  6.             out_buf[5] = (u8)(temp_cont & 0xff);
  7.             out_buf[6] = out_buf[0] ^ out_buf[1]  ^ out_buf[2] ^ out_buf[3] ^ out_buf[4] ^ out_buf[5];
  8.             out_buf[7] = 0xFF;
  9.             USB_SendData(&out_buf[0],8);
复制代码
  • 最近查阅:

免责声明:

本平台旨在开源共享精神,请勿发布敏感信息,任何违法信息我们将移交公安机关;

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

GMT+8, 2025-10-21 16:23 , Processed in 0.085123 second(s), 48 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部