原创 串行AD芯片ADC12S021的时序问题

2012-4-21 00:55 3139 7 10 分类: MCU/ 嵌入式

 

ADC124S021

4 Channel, 50 ksps to 200 ksps, 12-Bit A/D Converter

 

在接触ADC124S021这个芯片以前,我一直以为AD芯片都是串行输出的,好多个引脚(起码一位数字输出一个管脚吧)。这个我用手拿起来都费劲的10管脚小芯片居然是12位AD,还是4通道的。

我第一次写单片机程序就要控制这个小东西,结果开始的时候时序还搞错了。偏偏用的单片机还是贴片的AT89S52,不能仿真(反正我公司只有直插的那种仿真器),我弄了好长时间才发现是AD时序的错误。后来严格按照芯片手册上的时序来写,终于成功采集到数了。

 

捕获.jpg

该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点了,睡觉了。明天是难得的休息日,哈哈。

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户377235 2013-7-1 21:15

请问你的QQ能告诉我吗、。还有些不明白的问题想问问你或者我的也可以651412317

用户418108 2012-8-7 14:03

二炮了,问题解决了。 Chanel=0为第1通道,Chanel=08为第2通道,Chanel=016为第3通道,Chanel=024为第4通道。 谢楼主的分享咯!

用户418108 2012-8-7 11:14

求教:用的你的程序,ad数据读出来了,但是通道选择怎么没有起作用?
相关推荐阅读
用户421976 2012-11-18 20:09
AT91SAM7X256学习笔记(1)
         好久没有写点什么了,前段时间工作比较忙,就犯懒了。写点有关atmel 的arm7芯片的东西吧,很简单很基础的。       开发环境用的是keil mdk 4.23  H...
用户421976 2012-08-30 23:09
搞定单片机多字节串口接收
             工作了一年多,写了不少单片机串口程序。感觉串口多字节接收部分的逻辑相对于配置寄存器跟串口回复来说,是有点难度的——寄存器配置基本上都是死的,串口回复多字节跟回...
用户421976 2012-08-03 23:51
让低端FPGA也能跑nios
      第一次接触嵌入软核是公司一个项目中通信用422串口通信。其他的电路板的控制都是单片机,都好办。可是有一块板的控制虽然不太复杂,但必须用FPGA(并行处理能力单片机没法比啊),在通信...
用户421976 2012-07-18 00:15
用labwindows做过的一个串口上位机程序
      这是一个FPGA的串口通信上位机软件,要求不高,顶多算是个测试用面板。我觉得这就是个小case。可是实际上这不到1千行的代码,却把我折腾了好长时间。     这个软件的大概内容...
用户421976 2012-06-30 03:35
工作了满一年了
这是我在电子行业从业的第一年。这一年里做的东西真的挺多,挺杂的。 我工作的单位规模并不是很大。研发人员不是很多,这导致我很多方面的技术都接触过。 刚开始做51单片机程序。做电路,之后做过c...
我要评论
3
7
关闭 站长推荐上一条 /3 下一条