摘 要:本文介绍了通过硬件和软件两种方式实现PIC18f45k22单片机与TI公司的模数转换器ADS8341的SPI接口通信,给出了具体的硬件电路和相关的软件流程,实现了数据交换.
关 键 词 : PIC18f45k22;SPI;ADS8341;共用体
中图分类号:TP368.12 文献标识码:A 文章编号:1674-7712 (2013) 12-0000-01
一、ADS8341简介
ADS8341是TI公司在2001年推出的具有串行接口的16位高速逐次逼近行的A/D转换器.它是拥有4通道独立输入端或2通道差动输入端,带有SPI接口的通信,转换速率大于100KHZ,转换精度高,芯片工作电压范围在2.7V~5V,SSOP-16封装,安装尺寸很小,正常温度为-400C~+850C.基准电压源的范围为500mV-Vcc之间变化,在低功耗模式下,芯片的功率小于15μW.
二、ADS8341与PIC18f45k22通信的硬件设计
在这里我们使用的是微星公司的PIC18f45k22单片机与ADS8341进行SPI通信,连接图如下:
ADS8341控制字的设定,参考表-1,s必须拉高,才能开始转换.A0-A2为转换的输入端口,具体设置参考表-2.SGL/DIF为单端模拟信号或是差动信号输入控制位,它必须结合A0―A2一起设置模拟信号的输入.PD0与PD1为电源模式的选取位.例如我们设置控制字为94H,开始AD转换的是CH0单通道,进入低功耗模式和工作方式为外部时钟模式.
在外部时钟模式下,ADS8341的时钟由MCU提供,当它接收到来自MCU的控制字随后的一个时钟周期BUSY脚被拉高,转换的结果会在后16个周期的下降沿通过DOUT脚输出,具体的数据时序图请参考它的datasheet.在外部时钟模式下,BUSY维持高电平到输出数据MSB的建立需要一个时钟周期,完成一次AD数据的采集至少需要25个时钟周期,若采用的是8位的MCU与ADS8341进行通信,需要对ADS8341的输出数据进行读三次.基于以上考虑,我们可以采用32个时钟周期来读一次转换的数据,前8个时钟周期用于MCU发送控制字,后面24个时钟周期,连续三次读DOUT引脚的数据.在具体C语言编程上面,我们可以借助一个联合体,和一个属部变量来达到最终目的,部分程序如下.相应的MCU寄存器的配置就不详述,该款单片机我们可以直接使用它的库函数对SPI接口进行读写,使用非常方便.
union u AD
{
unsigned int A;
unsigned char B[2];
}//定义的联合体
SPI_CS 等于 0; //片选拉低,启动AD芯片
SPI_Write(0); //选择 CH0 为AD的输出
uAD.B[1] 等于 ReadSPI1(); //第1次读DOUT数据
uAD.B[0] 等于 ReadSPI1(); //第2次读DOUT数据
ucAdlow0 等于 ReadSPI1(); //第3次读DOUT数据 . ucAdlow0为定义的临时变量,
uAD.A 等于 (uAD.A<<1) + (ucAdlow0>>7); //数据合并
三、软件程序实现
在MPLAB集成开发环境下,运用微星公司18系列单片机的函数库对PIC18f45k22进行相关操作设置非常方便.在这里以SPI口读取ADS8341转换结果,并把结果通过串口发送出来,方便用串口助手等工具进行观察,具体以主函数为例来说明整个流程.
void main(void)
{
union ad_r //定义一个共用体
{
unsigned char ad[2];
unsigned int y;
有关论文范文主题研究: | 关于时钟的文章 | 大学生适用: | 高校毕业论文、学年论文 |
---|---|---|---|
相关参考文献下载数量: | 71 | 写作解决问题: | 学术论文怎么写 |
毕业论文开题报告: | 论文任务书、论文题目 | 职称论文适用: | 职称评定、职称评初级 |
所属大学生专业类别: | 学术论文怎么写 | 论文题目推荐度: | 优质选题 |
}adr;
InitialMCU(); //单片机初始化,包含IO口设置、中断设置串口1初始化等.
while(1)
{
SPI_CS 等于 0; //SPI片选信号
Delay1KTCYx(50); //延时
putcSPI1(0x94); //单片机的SPI口发送ADS8341的控制字
while(SPI_BUSY); //判断AD转换是否完成
adr.ad[1] 等于 getcSPI1(); //读出AD转换结果的高8位
adr.ad[0] 等于 getcSPI1(); //读出AD转换结果的低8位
Delay1KTCYx(50); //延时
SendBytebyUART1('#'); //串口1发送标识符“#”
SendBytebyUART1( adr.ad[1]); //串口1发送AD转换结果的高8位
SendBytebyUART1( adr.ad[0]); //串口1发送AD转换结果的低8位 SendBytebyUART1('\r'); //回车
SendBytebyUART1('\n'); //换行
};
}
四、结束语
本文在硬件上运用PIC18f45k22单片机与ADS8341进行连接,在软件方面,在MPLAB集成开发环境下运用C语言编程,特别是定义一个共用体,成功实现对ADS8341的AD转换结果的读取,实现了数据交换.