一. 前言:
在FastBond第一阶段中设计了适用于十二指神探的数字温度传感器,并在Scheme-it中绘制了框图和原理图。现在参加FastBond第二阶段,进行PCB的设计以及程序的编写。不熟悉本项目第一阶段的同学可以跳转到第一阶段进行了解:
FastBond2阶段1-适用于十二指神探的数字温度传感器拓展 - 电子森林 (eetree.cn)
二. 原理图设计:
在第一阶段中使用了Scheme-it绘制原理图,但Scheme-it并不具备绘制PCB的功能因此在第二阶段使用KiCad重新绘制原理图。
本次设计使用的是MicroShip的TCN75AVUA数字传感器芯片,该芯片使用I2C进行通信,因此在原理图设计时主要考虑I2C的通信接口设计以及地址线设计。
在I2C协议中SDA,SCL在空闲时默认为高,因此将芯片的SDA和SCL引脚引出并设置跳线帽接上拉电阻。
在I2C通信时需要指定通信设备的地址,TCN75AVUA的地址为7位其中高4位固定为1001低三位A0,A1,A2为用户设置,因此在原理图设计时将A0,A1,A2引出通过跳线帽控制地址位
由于需要与十二指神探相连因此需要将接口设置位2x6的母座插排
CH0和CH1别与SDA,SCL相连并通过十二指神探给数字温度传感器供电
三. PCB设计:
选择合适的封装然后进行布局布线,这里元器件较少布局布线相对容易
四. RP2040介绍:
RP2040是树莓派基金会推出的一款微控制器芯片RP2040芯片旨在为嵌入式系统和物联网(IoT)项目提供低成本、高性能的解决方案。
RP2040 芯片的主要特性包括:
1.双核ARM Cortex-M0+处理器:该芯片配备两个核心,可实现高效的多任务处理和同时处理多个任务。
2.内存:具有264KB的片上SRAM,为大多数嵌入式应用提供足够的内存。 还可以连接外部闪存来存储附加数据和程序代码。
3.GPIO(通用输入/输出)引脚:RP2040 提供大量 GPIO 引脚,使其适合需要与各种传感器、显示器和外设连接的各种项目。
4.可编程I/O:RP2040的突出特点之一是其灵活而强大的可编程I/O (PIO)子系统,它使开发人员能够在硬件中实现自定义数字接口和协议,从而减轻主处理器的任务。
5.USB 2.0:RP2040 本身支持 USB 2.0,这使得它可以作为 USB 设备与计算机或其他 USB 主机进行通信。
6.低功耗功能:该芯片设计为高能效,使其适合电池供电的应用。
十二指神探是一款基于微控制器RP2040制作的多功能硬件调试助手 - 取名为“12指神探”,意为它有12根引脚、功能灵活、搭配不同的程序,可以做成各种调试器。
五. TCN75AVUA介绍及控制寄存器介绍
TCN75AVUA是MicroShip的一款温度传感器芯片,其测温物理原理基于热敏电阻的工作原理。
芯片特性:
感应温度范围:-40°C~125°C
精度:±1°C(典型)
电压-电源:2.7V~5.5V
工作温度:-40°C~125°C
转换时间:30ms 至 240ms 典型转换时间
传输协议:I2C
封装:8-MSOP
TCN75AVUA共有4个寄存器
每个寄存器有不同的地址位
一个8位的地址选择寄存器,只有低两位被用到高6位为0
00:温度寄存器
01:配置寄存器
10:温度滞后寄存器用于配置报警温度下限
11:温度限制寄存器用于配置报警温度上限
Configuration Register:配置寄存器用于配置芯片的工作状态
该寄存器共有8位
Bit 0:关闭模式选择
Bit 1:报警输出模式选择
Bit 2:报警输出极性选择
Bit 3-4:故障队列周期选择
Bit 5-6:温度测量分辨率
Bit 7:一次性模式选择
温度寄存器是一个16位的寄存器,用于存放环境温度,为只读寄存器,读出该寄存器的数值即为当前温度值,可通过配置寄存器的5-6位控制转换精度。
转换公式T=高8位+低8位*2^-8
温度限制寄存器和温度滞后寄存器都为16位寄存器,只有高9位被用到,用于配置报警温度的上下限,当温度超过这两个寄存器设定的范围时TCN75AVUA的ALERT引脚会发出报警信号,可通过配置寄存器的1和2位配置其输出状态
六. 控制代码编写
本次通过十二指神探读取数字温度传感器的温度,使用MicroPython编程,使用轻量化编译器Thonny。
MicroPython是Python3的精简版,包含了Python的一部分标准库,可以运行在有限的微控制器上。语法简单,功能强大,开发便捷。
I2C读写流程如下:
由十二指神探作为主机,数字温度传感器作为从机。
总线上数据的传输必须有个起始信号作为开始条件,以一个结束信号作为传输的停止条件,起始和结束信号均是由主设备产生,这也意味着从设备不可以主动发起通信,所以的设备都是主设备发起的。
主设备可以发起询问的指令,然后等待从设备的通信当总线在空闲状态时,SCL和SDA都保持着高电平。
- 由主机开始信号
- 主机向总线发出8位信号,bit1-7为地址,bit0为读/写表示接下来的操作时读还是写寄存器
- 与主机对应地址的从机确定是自己的地址后产生应答信号
- 主机发送要读或写的寄存器地址,从机应答
- 读:从机发送对应寄存器的数据,主机应答。写:主机发送数据,从机接收并写入从机应答
- 操作完毕,主机发出结束信号
from machine import I2C,Pin
import math
import time
# TCN75A的I2C 地址
TCN75A = 0x48
#I2C设备内部寄存器
TA = 0x00#温度寄存器地址
CONFIG = 0x01#配置寄存器地址
THYST = 0x02#温度报警下限地址
TSET = 0x03#温度报警上限地址
#常用参数
Temp_9bit = 0x00#设置温度精度为0.5 C
Temp_10bit = 0x20#设置温度精度为0.25 C
Temp_11bit = 0x40#设置温度精度为0.125 C
Temp_12bit = 0x60#设置温度精度为0.0625 C
Comparator = 0x00#设置报警输出为比较器模式
Interrupt = 0x02#设置报警输出为中断模式
Alert_high = 0x04#设置报警输出为高
Alert_low = 0x00#设置报警输出为低
code=0
temp=0
#初始化I2C
i2c = I2C(id=0,scl=Pin(21),sda=Pin(20),freq=50_000)
#向指定寄存器写入数据
def reg_write(i2c, addr, reg, data):
# Construct message
msg = bytearray()
msg.append(data)
i2c.writeto_mem(addr, reg, msg)
#从指定寄存器中读取指定字节的数据
def reg_read(i2c, addr, reg, nbytes):
data = i2c.readfrom_mem(addr, reg, nbytes)
return data
#读取总线上挂载的I2C设备并返回其地址
addr_list = i2c.scan()
print(addr_list)
reg_write(i2c,TCN75A,TA,Temp_12bit)#设置温度精度
while True:
code=reg_read(i2c,TCN75A,TA, 2)
temp=code[0]+code[1]*0.00390625#将接收到的数据转换为温度
print("Temperature = "+str(temp)+" C")
time.sleep(1)