完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在做一个精密温度控制器,要求控制精度在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文件即可! |
|
相关推荐
5 个讨论
|
|
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 13:14 , Processed in 0.740697 second(s), Total 55, Slave 43 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号