| 
 | 
 
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  
 
×
 
 本帖最后由 cjsb37 于 2013-4-29 08:55 编辑  
 
最近在做一个精密温度控制器,要求控制精度在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 << 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文件即可! 
 
 
 
 
 
 
 |   
 
 
 
 |