硬件编程-----根据时序图写C语言驱动

本文介绍了如何根据时序图使用C语言编写驱动,以读取52单片机上的AD芯片ADS7822和MAX6675芯片的数据。通过详细解析时序图,展示了如何初始化、读取数据、结束工作,并处理读取到的温度数据。最终实现精确读取PT100温度探头和K型热电偶的温度,误差小于1℃。
摘要由CSDN通过智能技术生成

最近要用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 = 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值