本文为在用龙芯1c做3D打印机过程中的笔记。龙芯1c做的3d打印机简称“龙印”,git地址“https://gitee.com/caogos/marlin_ls1c”
TM7705和热敏电阻一起实现3d打印机的温度测量。本文重点放在tm7705的linux驱动上,关于温度测量后面另外写一篇详细介绍。
硬件电路
测试用的硬件为“安富莱”推出的TM7705模块。这里着重强调一下TM7705是深圳天微电子的AD芯片,很多淘宝商家把名字都写错了。
为了使原理图更加清晰,把整个原理图分成了几块分别截图了。下面谈点个人对本模块的理解,仅供参考。
1,本模块的模拟输入端AIN1+,AIN1-和AIN2+,AIN2-分别通过两个10k电阻并联分压。这样的目的是为了把输入电压范围从0-2.5v扩大到0-5v,即满量程电压为5v。
因为使用的是2.5v的基准电源,所以实际上AIN引脚的输入范围为0-2.5v,通过两个10k电阻分压,而AIN1+和AIN2+则接到两个10k电阻中间,这样就实现了把测量范围从0-2.5v扩大到0-5v。凡事有两面性,正是由于引入了两个10k电阻,同时也引入了误差。
2,这个模块使用的参考电源是2.5v的,tm7705允许参考电源电压为0到vdd之间的任意值。
对于使用在3d打印机上来说,最后改为3.3v或者5v的参考电源(如果有的话)。marlin中有个脚本createTemperatureLookup.py可以生成一个AD值与温度对应的表格,用于程序中快速计算温度值。
假如待测试的电压很小,比如是毫伏级的,那么可以选择电源低一些的基准电源,这样有利于提高精度,同时如果需要,可以把增益设置大一点,tm7705最大可以支持128的增益。
3,tm7705是支持3.3v和5v供电的,具体选择哪个根据spi sclk的电平决定。如果SPI的SCLK线上的高电平为3.3v,那么推荐使用3.3v的电源给tm7705供电。比如龙芯1c的spi的SCLK是3.3v的,如果tm7705的vdd接5v,那么出现接口迷失的概率大大增加。
4,复位(reset)引脚。我在这里犯了低级错误,拿到电路图后,发现图上说已经上拉到vcc了,并且R13没贴。后面在接线时没接复位脚,悬空的;移植tm7705驱动时,没有操作复位脚。后来发现tm7705采集始终不是很稳定,每次上电后可以成功采集几次,过后就超时,或者一直采集到的值为0xfff,并且把龙芯1c热复位还不一定能解决。用示波器检查了,没发现问题,代码也检查了,没发现问题。经过两周的煎熬后,突然想起来把R13焊上,用软件复位tm7705试试。结果发现一切OK,并且后续如果出错,通过复位tm7705也都能解决,今天我从上午不断电连续测到现在都没问题。即使超时了,代码中也通过复位tm7705很快就解决了。
所以这里强烈建议:把tm7705复位脚接龙芯1c的一个gpio,每次上电后初始化时必须手动复位tm7705,如果出现超时或其它错误时,也可以通过复位tm7705来解决。
tm7705模块使用龙芯1c的SPI0_CS1
RESET -------- I2S_LRCK/GPIO89
VDD -------- 3.3V
源码
在文件arch\mips\loongson\ls1x\ls1c\platform.c中,
找到“static struct spi_board_info ls1x_spi0_devices[]”,在里面添加
#ifdef CONFIG_SPI_TM7705
{
.modalias = "TM7705",
.bus_num = 0,
.chip_select = SPI0_CS1,
// 当前cpu频率=252.00Mhz BUS=126.00Mhz
// SPI最大的分频系数为4096
// 所以spi最小频率=126Mhz/4096=30.7khz
// 这里只是设置最大频率,实际频率为最接近并且小于最大频率的BUS分频后的值
// 经过测试,最大频率设为为1mhz也能正常采集
.max_speed_hz = 500*1000,
// .platform_data =
.mode = SPI_MODE_3,
},
#endif