|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 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文件即可!
|
|