微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 测试测量 > Labview > Max1148AD采样C程序

Max1148AD采样C程序

时间:10-02 整理:3721RD 点击:
最近在做一个精密温度控制器,要求控制精度在0.01摄氏度,可以说是一个很高的指标。由上位机发送温度控制曲线至控制器中进行控制。由于对AD采样速率要求不高故选取了串行的AD芯片——MAx1148.这一款芯片是14位的高精度AD转换芯片,对于精度要求基本满足。为了方便以后程序移植,这里采用C语言编写,在头文件中定义相关引脚和操作。



这个是初级方案,选取STC高端芯片,可以优化程序开发难度。最终决定用LM3S1138来做微控制器,这样才能从根本上决绝问题,相关的项目进展会在后期文章中予以介绍,这里只是透露一下。
    下面讲一讲MAx1148的AD采样过程,相关芯片的特点与结构请参考美信官方数据手册
MAXll48在时钟脉冲的作用下进行逐次逼近式A/D转换,一般每24个时钟周期完成一次转换和读出操作。内部时钟模式与外部时钟模式的时序图请参考数据手册!这里不便上传
  A/D转换速度要求不是很高时,常选用内部时钟模式。现以内部时钟模式为例说明MAXll48的工作过程:
  首先根据系统要求确定MAXll48的控制字,例如,需转换0通道的单端单极性模拟量,控制字为8EH。然后向MAXll48输入控制字并读取转换结果,其步骤为:
  (1)使片选端CS变为低电平并保持不变,此时DOUT处于低电平,SSTRB处于高电平;
  (2)在DIN输入端由高到低依次输入控制字各位的值。
  具体做法是:首先使DIN端为高电平(输入“l”),在第一个SCLK的上升沿将DIN的第一位数据“l”移入内部移位寄存器中。即移入START开始位:以此类推,在后面7个SCIJK的上升沿分别将输入DIN端的控制字其他位移入内部移位寄存器中;
  (3)当控制字的最后一位数据被移入之后(第8个SCLK的下降沿),转换开始,SSTRB由高变低;
  (4)经tcoNv之后,A/D转换结束,SSTRB由低变高。
  (5)在转换结束后的任何时刻,通过SCLK时钟将移位寄存器中的转换结果(14位二进制数)由DOUT端同步移出。具体做法是:从SSTRB置高后的第二个SCLK时钟的下降沿开始,利用SCLK时钟逐一将转换后的结果从DOUT端移出,最高有效位在前。

   汇编程序如下:
   (假设CS、DIN、DOUT、SCLK、SSTRB分别连接至P00、P01、P02、P03和P04)
         START:
      CLR P1.3 :SCLK为低电平
  CLR P1.0 :片选有效
  MOV A,#lXXXXXl0B :控制字送A
  MOV R1,#08H :输入控制字位数
  LPl:MOV C,ACC.7 :取控制字并送至DIN端口
  MOV P1.1,C
  SETB P1.3 ;DIN端口数据移入内部移位寄存器
  CLR P1.3
  RL A :控制字移位
  DJNZ R1,LPl
  LP2:JNB P1.4,LP2 ;检测SSTRB,等待转换结束
  SETB P1.3
  CLR P1.3
  CLR A
  MOV R1,#06H ;读入高6位数据
  LP3:RL A
  SETB P1.3
  CLR P1.3
  MOV C,P1.2
  MOV ACC.0,C
  DJNZ R1,LP3
  MOV 30H,A
  MOV R1,#08H ;读入低8位数据
  LP4:RL A
  SETB P1.3
  CLR P1.3
  MOV C,P1.2
  MOV ACC.0,C
  DJNZ R1,LP4
  MOV 31H,A
  STAY:SJMP STAY
  END
很明显这个是51核的汇编,为了移植方便故开发了C语言的程序如下:
/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
MAX1148AD.h file
作者:Lyzhangxiang
建立日期: 2010.03.27
版本:V1.0
Copyright(C)   安徽师范大学 Lyzhangxiang
         
*******************************************************************/

#ifndef __MAX1148AD_H__
#define __MAX1148AD_H__
#include "STC12C5A60AD.h"
//MAX148芯片连接引脚
#define    CS       P1_0              
#define    DIN      p1_1           
#define    DOUT     p1_2              
#define    SCLK     p1_3            
#define    SSTRB    p1_4               
#define   ADProcess    SSTRB=0
#define   ADWait       SSTRB=1  
#endif
/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
有问题请联系:lyzhangxiang.love@一六三.com
     
Max1148AD.C file
作者:Lyzhangxiang
建立日期: 2010.03.22
版本:V1.0
Copyright(C)   安徽师范大学 Lyzhangxiang
         
*******************************************************************/
#include "STC12C5A60AD.H"
#include "Max1148AD.H"
//向MAX1148写入一个字节*************************************************
Viod MAX1148InputByte(unsigned char d) //向MAX1148写入一字节(内部函数)
{
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DIN = ACC7;            
        SCLK=1;
SCLK=0;
        ACC = ACC 0; i--)
    {
        ACC = ACC 0; i--)
    {
        ACC = ACC <<1;
SCLK=1;
SCLK=0;         
        ACC0 = DOUT;
    }
   return(ACC);
}
//MAX1148ADC转换函数*************************************************
Void MAX1148AD_Sample(unsigned char ControlData)
{
unsigned char ADValue1=0;
unsigned char ADValue2=0;
int ADValue;
SCLK=0;
CS=0;
MAX1148InputByte(ControlData);
When(ADProcess)
SCLK=1;
SCLK=0;
ACC=0;
ADValue1=MAX1148Output6Byte();
ACC=0;
ADValue2=MAX1148Output8Byte();
ACC=0;
ADValue=ADValue1;
ADValue<<=8;
ADValue=ADValue|ADValue2;
return(ADValue);
}
/******************************EDN**************************************/
分别保存以上两个文件为.C和.H文件即可!

谢谢小编的分享

好资料,学习了。

非常感谢小编共享

非常好 受用了 非常感谢  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top