在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1970|回复: 0

Max1148AD采样C程序

[复制链接]
发表于 2012-6-20 18:32:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 cjsb37 于 2013-4-29 08:55 编辑

最近在做一个精密温度控制器,要求控制精度在0.01摄氏度,可以说是一个很高的指标。由上位机发送温度控制曲线至控制器中进行控制。由于对AD采样速率要求不高故选取了串行的AD芯片——MAx1148.这一款芯片是14位的高精度AD转换芯片,对于精度要求基本满足。为了方便以后程序移植,这里采用C语言编写,在头文件中定义相关引脚和操作。
未命名.bmp
这个是初级方案,选取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 << 1;
    }
}

//向MAX1148读出低6位字节*************************************************

unsigned char MAX1148Output6Byte(void) //实时时钟读取高6位字节(内部函数)
{
    unsigned char i;
    for(i=6; i>0; i--)
    {
        ACC = ACC <<1;
SCLK=1;
SCLK=0;         
        ACC0 = DOUT;
    }
   return(ACC);
}

//向MAX1148读出高8位字节*************************************************

unsigned char MAX1148Output8Byte(void) //实时时钟读取低8位字节(内部函数)
{
    unsigned char i;
    for(i=8; i>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文件即可!






您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-3 07:34 , Processed in 0.058924 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表