最近要用52单片机读取PT100温度探头和K型热电偶的温度,在设计并焊接完硬件电路之后,发现用C语言读取具体的温度是个麻烦事。具体来说就是不知道怎么用C语言根据芯片的时序图编写驱动,所以也就不知道怎么读取AD芯片和Max6675芯片的数据。要完成这个工作,实际上要做一件横跨硬件电路设计、制作、驱动编写、纯C软件编写的工程,更进一步的话还需要涉及到PCB板的设计,对于我这个硬件新手来说有不小的难度。在完成这些工作之后 (没有设计PCB板),我特意写这篇文章,用来描述根据时序图写C语言驱动的流程,作为对这份工作的纪念,也希望能为后来者提供一点帮助。
对于PT100温度探头,我采用桥式电路检测探头的电阻,电阻信息被转化成电压信号,并用OP07运算放大器对电压信号进行放大。OP07的输出电压用ADS7822芯片进行模数转换。由于本文只涉及C语言驱动的编写,所以这里不贴具体的电路图了。下面是ADS7822工作的时序图:
其中CS是片选,当CS从1跳变为0时,ADS7822开始工作。
DCLOCK是时钟,默认有可能是0或1。
Dout是ADS7822的输出结果。
初始化:
由于在CS=0之后,DCLOCK从0跳变到1就意味着开始计数了。所以一定要在CS设置为0之前先把DCLOCK设置为0。这一点从下表中Tcsd的描述:CS falling to DCLOCK low也可以看出来。
下面三行是ADS7822的初始化
//ad_cs = 1; //驱动代码最后就是ad_cs = 1,所以这里可以省略这个语句
ad_dclock = 0;
//时序图上ad_dout=1,但实际上ad_dout是硬件自己决定变化的,而不是用C语言决定的
//ad_dout = 1;
开始工作:
CS = 0表示ADS7822开始工作。
之后DCLOCK经历2次脉冲 (从低电平跳转到高电平,并保持到高电平结束),这期间Dout保持高电平。
DCLOCK经历1次脉冲,Dout输出一个无效位。
用代码表示:
ad_cs = 0;//启动AD转换
ad_dclock = 1;
ad_dclock = 0;
ad_dclock = 1;
ad_dclock = 0;
ad_dclock = 1;
DCLOCK从高电平变成低电平,完成这个语句后,Dout正处于一个稳定的有效数据位,单片机可以读取数据。DCLOCK从低电平变成高电平时,Dout的有效数据结束,即将输出下一个数据。用代码表示:
ad_dclock = 0;
j = (uint)(ad_dout); //读取数据
ad_dclock = 1;
这个过程一共要进行12个循环,输出12位有效数据。这里有一个问题:最先输出的一位数据是最高位还是最低位?关于这个问题,需要参考我的前一篇文章:查找算法:逐次逼近。根据这篇文章,我们可以知道,第一个输出的数据能表示2048,第二个输出数据表示1024,第三个输出数据表示512…,最后一个输出数据表示1。由此,我们可以知道最先输出的一位数据是最高位。因此,每循环一次,原有数据就要左移一位。所以这12轮的循环用C语言可以表示为:
result = 0;
for(i = 0; i <= 11; i++) //读取采样数据
{
//时钟低电平的时候,dout处于稳定的状态,这个时候可以读取dout
ad_dclock = 0;
j =