ADC124S021
4 Channel, 50 ksps to 200 ksps, 12-Bit A/D Converter
在接触ADC124S021这个芯片以前,我一直以为AD芯片都是串行输出的,好多个引脚(起码一位数字输出一个管脚吧)。这个我用手拿起来都费劲的10管脚小芯片居然是12位AD,还是4通道的。
我第一次写单片机程序就要控制这个小东西,结果开始的时候时序还搞错了。偏偏用的单片机还是贴片的AT89S52,不能仿真(反正我公司只有直插的那种仿真器),我弄了好长时间才发现是AD时序的错误。后来严格按照芯片手册上的时序来写,终于成功采集到数了。
该AD芯片的时序图如图所示。按照图示的时序具体操作步骤如下。(1)CS=0;(2)SCLK=1写入Bn(7-0分别在第1到8个时钟周期写入)SCLK=0;(3)读取DBn(DB11-DB0分别在第5到16个时钟周期读取),SCLK=1;(4)重复进行(1)、(2)、(3)1次(这个输出的数据应该是前一次写入的通道号或默认的通道号的采集值,所以按照时序操作两次确保采集到的数是我们想要的通道号的采集值)。
下面是具体的代码(代码中的CS SCLK DIN DOUT都是单片机的IO口)
…………
volatile unsigned char bdata ad_channel;
sbit ad_channel7 = ad_channel^7;
volatile unsigned char bdata ValH, ValL;
sbit ValH0 = ValH^0;
sbit ValL0 = ValL^0;
………………
unsigned int ad124s021 (unsigned char Chanel)
{
unsigned char i,j;
unsigned int return_val;
for (j=0;j<2;j++)
{
ad_channel = Chanel;
ValH = 0;
ValL = 0;
SCLK = 1;
CS = 0;
for (i = 0; i < 16; i++)
{
if (i < 8)
{
DIN = ad_channel7;
ad_channel = ad_channel << 1;
}
SCLK = 0;
if (i >=4 && i < 8)
{
ValH0 = DOUT;
if (i != 7)
ValH = ValH << 1;
}
if (i >=8)
{
ValL0 = DOUT;
if (i != 15)
ValL = ValL << 1;
}
SCLK = 1;
}
CS = 1;
}
return_val = (int)ValH * 256 + ValL;
return return_val;
}
大概就这些内容了,希望能够给比我还新的新手帮助。本人水平有限如果有什么错误的地方,还请各位前辈批评指正。
后记:单片机的在线仿真功能真的很重要,即使是对非常简单的程序调试来说也是很必要的。可以仿真的话可以很快的找出程序错误的地方,大大节约程序的调试时间。
当时电路的设计者估计考虑到电路板上其他芯片的供电都是5v,就选用了5v供电的AT89S52,可是因为没有仿真器给单片机程序的调试带来了很大的麻烦(明明可以用C8051FXXX单片机的,有这个的仿真器,气死人了,哎)。
我觉得实际上没有什么单片机程序是真正的“简单的”,在调试过程中总有一定几率遇到这样或那样的问题,包括程序本身跟电路设计缺陷。又一次因为电路设计的缺陷,我花2个小时就写完的简单程序,调了两天,板子才勉强可以用。
第一次写点东西,不知不觉已经写到快1点了,睡觉了。明天是难得的休息日,哈哈。
用户377235 2013-7-1 21:15
用户418108 2012-8-7 14:03
用户418108 2012-8-7 11:14