[开源硬件] 【21ic DIY秀】热电偶终端机

[复制链接]
4177|13
 楼主| xcvista 发表于 2019-3-20 00:41 | 显示全部楼层 |阅读模式
本帖最后由 xcvista 于 2019-3-20 00:41 编辑

这是我今年年初做的一个项目。之前老妈说想要买一个食品内部温度计烤牛排用。去了趟宜家,他们家的食品内部温度计居然要将近两百块一个。记得说某板厂样板五片 30 包邮?食品用 304 不锈钢铠装 K 型热电偶淘宝价 12 一支?看来自己 DIY 一个恐怕比买一个要便宜得多,赶紧动手。



一:选型

铂金热电偶虽然说性能稳定,但太贵了。K 型热电偶价格便宜,又能满足我的需求,下单。热电偶需要一个放大器,不过找了一圈参考设计好像对电路匹配要求都比较高,而且冷端补偿和校准我不会做。转向去找集成式热电偶 ADC,找到 MAX31855。这个芯片 20 元左右,有点小贵,但是内部集成了高精度仪表放大器、冷端温度补偿和 ADC,用起来很省事。

这个项目显示输出用 1602 似乎大材小用,LED 的话我有点担心电池续航。正好手里有两片上海正金 YE004 STN 公模四位半段码液晶屏样品,当年 5 元一片买的,可以拿来尝试一下。这个液晶屏是 1/3 占空比的,略奇葩……本来想用 HT16C21 来驱动液晶面板梦碎。那个时候我还不熟悉国内厂家的 LCD 单片机,顶着 25 一片的价格选了 STM32L433CBT6。这颗 STM32 有内置段码液晶控制器、内置液晶对比度控制,也支持 1/3 占空比,可以直接驱动 YE004。

下一步就是供电。液晶屏和低功耗单片机的选用保证了电池消耗不会很高。这里的的选项是内置小体积锂离子充电电池 vs 七号电池。我没有单节七号电池电池盒,但是我有一些项目剩余的小锂离子聚合物电池,体积比 CR2032 都要小。电池管理我用了一颗 TP4057 锂离子充电芯片和 TPS63000 升降压芯片。这片升降压芯片可以在电池电压范围在 2.4V(保护电路自动切断)~4.2V(充满电)的任何时刻输出稳定的 3.3V。这个设计比锂电池接 LP2980 LDO 可以更充分的给电池放电,电池续航几乎翻倍。STM32 单片机对于电源其实没那么大所谓,但是热电偶 ADC 对电源电压要求就很高了。既然用了充电电池需要充电口,STM32L433 单片机又有 USB 支持,充电口索性就把数据线也接上,几乎免费增加了一个 USB 通信功能。

整个 BOM 下来,这个设备成本都没有破百。相比于宜家的食品温度计,我自己做一个省了一半的钱,还多了一个 USB 支持。

二:电路设计

这个电路的设计基本可以说是中规中矩。充电芯片、升降压芯片、热电偶 ADC 直接照着数据手册里面的参考电路画。STM32L4 的 USB 有自带上拉电阻,不用外接。液晶面板的管脚对应到单片机执行的是就近原则,具体管脚和段码之间的对应关系,到驱动层去解决。另外,对于支持四线 JTAG 的 ARM 单片机,我一般尽量不用 SWD。SWD 虽然节约管脚,但不支持多芯片共用调试接口。这一点在这块板上虽然体现不出来,但在我曾设计过的另几款板上是实现了 ARM、FPGA、外设芯片等共用一个调试接口,相比于每一块芯片一个调试接口来说节省了不少空间。


电路中对电源开关的处理值得一提。按照 USB 充电的规范,受电设备需要完成 USB 枚举才能全负荷充电,也是为了偷懒,我在这里设计了强制开机充电。这个设计靠的是升降压芯片的 EN 管脚来实现的:如果开关打开,或者如果 USB 连接,EN 管脚的电压会高于 2V,电路会自动开机。


三:电路板设计

这个电路板的设计其实是有缺陷的:电源部分非常拥挤。







四:软件设计

我也算是延续一贯风格,不用 Keil,不用 STM32CubeMX 或固件库,用开源的原装 Eclipse IDE 和 GCC 编译环境来开发。不用固件库,一方面来说所有外设都需要自己编码操作寄存器,开发比较累;另一方面,又因为没有了库的负荷,程序的体积和执行时间可以大幅缩短。

MAX31855 有采样频率限制,因此我不能高频率访问之。同时这个芯片是只读 SPI,我只要给它时钟他就会自己传送数据,我就想到了一种办法:设置一个定时器,定时器中断频率决定访问 31855 的频率。同时设置一个 DMA,减少读取数据时 CPU 的干预程度。


  1. static void spitemp_begin_capture(void)
  2. {
  3.         GPIOA->BRR = 1UL << 4;

  4.         RCC->APB2RSTR &= ~RCC_APB2RSTR_SPI1RST;
  5.         RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;

  6.         SPI1->CR1 =
  7.                         SPI_CR1_CPHA |
  8.                         SPI_CR1_MSTR |
  9.                         (5 << SPI_CR1_BR_Pos) |
  10.                         SPI_CR1_RXONLY;
  11.         SPI1->CR2 =
  12.                         SPI_CR2_SSOE |
  13.                         (7 << SPI_CR2_DS_Pos) |
  14.                         SPI_CR2_FRXTH;

  15.         SPI1->CR2 |= SPI_CR2_RXDMAEN;
  16.         DMA1_Channel2->CMAR = (uint32_t)(&temp_buffer);
  17.         DMA1_Channel2->CNDTR = sizeof(temp_buffer);
  18.         DMA1_Channel2->CCR |= DMA_CCR_EN;
  19.         SPI1->CR1 |= SPI_CR1_SPE;
  20. }

  21. static void spitemp_end_capture(void)
  22. {
  23.         DMA1_Channel2->CCR &= ~DMA_CCR_EN;
  24.         SPI1->CR1 &= ~SPI_CR1_SPE;
  25.         SPI1->CR2 &= ~SPI_CR2_RXDMAEN;
  26.         while (SPI1->SR & SPI_SR_FRLVL_Msk)
  27.                         discard = SPI1->DR;
  28.         GPIOA->BSRR = 1UL << 4;

  29.         temp_reading =
  30.                         (temp_buffer[0] << 24) |
  31.                         (temp_buffer[1] << 16) |
  32.                         (temp_buffer[2] << 8) |
  33.                         (temp_buffer[3] << 0);

  34.         RCC->APB2RSTR |= RCC_APB2RSTR_SPI1RST;
  35. }


spitemp_begin_capture 函数在时钟中断中执行。这个函数配置好 SPI 硬件和 DMA,启动一笔 4 字节的 DMA 读访问。31855 芯片的报文长 4 字节,因此这一笔 DMA 可以将 31855 的报文完全读回来。spitemp_end_capture 函数则是在 DMA 中断中执行,将读入的数据整理,并清理 SPI 和 DMA 硬件。我这里偷懒了,直接复位 SPI 控制器了事。理想情况下,应该是不用涉及到 RCC->APB2RSTR 的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
零三翟邢止胃 发表于 2019-3-20 09:25 | 显示全部楼层
多谢分享啊! 感谢啊!
lvface123654 发表于 2019-3-20 09:34 | 显示全部楼层
不错,除了PCB以外其他还是可以接受的
wenzi2851 发表于 2019-3-20 14:51 | 显示全部楼层
点赞 学习
 楼主| xcvista 发表于 2019-3-20 19:16 | 显示全部楼层
lvface123654 发表于 2019-3-20 09:34
不错,除了PCB以外其他还是可以接受的

PCB 不妥请指出。
lvface123654 发表于 2019-3-21 08:45 | 显示全部楼层
xcvista 发表于 2019-3-20 19:16
PCB 不妥请指出。

因为低速板,1.处理布局你自己说过以外,2.我觉得走线可以更美观,3.器件离边框起码大于2mm,4.还有敷铜区域我觉得有很多地方是禁止覆铜比如电阻,两个管脚间等等,只是随便看到这几点。可能每个人设计有自己的考虑
 楼主| xcvista 发表于 2019-3-21 10:42 | 显示全部楼层
lvface123654 发表于 2019-3-21 08:45
因为低速板,1.处理布局你自己说过以外,2.我觉得走线可以更美观,3.器件离边框起码大于2mm,4.还有敷铜 ...

多谢指出。布局我也是事后诸葛发现了这个电源拥挤的缺陷。器件边框距离我不知道关键点在哪里?我一直是只要满足机械设计的要求便无所谓的。至于敷铜区域,反正我都习惯了信号线从电阻管脚之间通过,敷铜不过就是信号过胯下的延伸罢了。
如风机器 发表于 2019-3-22 23:58 | 显示全部楼层
有意思,包装一下更好
 楼主| xcvista 发表于 2019-3-23 08:42 | 显示全部楼层
如风机器 发表于 2019-3-22 23:58
有意思,包装一下更好

找不到合适的壳体,这就凑合着用了。
小小电子爱好者 发表于 2019-3-24 07:40 | 显示全部楼层
好看!!!强
simonliu009 发表于 2019-3-31 18:27 | 显示全部楼层
STM高手,我只会用cubemx。
话说,那个线耐多少温度?
 楼主| xcvista 发表于 2019-3-31 20:18 | 显示全部楼层
simonliu009 发表于 2019-3-31 18:27
STM高手,我只会用cubemx。
话说,那个线耐多少温度?

那个线可以耐多少度我到没有问过。

我非常憎恨 STM32CubeMX 输出的代码,臃肿庞大,暗 bug 又多。开发的时候只用 Cube 当一个 pin planner 和 clock planner 用。
maximQ820270087 发表于 2020-7-6 16:21 | 显示全部楼层
simonliu009 发表于 2019-3-31 18:27
STM高手,我只会用cubemx。
话说,那个线耐多少温度?

MAX31855K热电偶可读 -200度~+1400度
talkativefox 发表于 2020-8-19 09:55 | 显示全部楼层
本帖最后由 talkativefox 于 2020-8-19 09:57 编辑

刚开始看错了,我还以为楼主用的工业热电偶,原来食品级热电偶也这么便宜~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

631

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部