综合课程设计报告基于LPC2114 A/D数据采集程序设计目录1 需求分析 (2)2 技术基础 (2)2.1 A/D Control Register 介绍 (2)2.2 A/D Data Register 介绍 (2)3 系统设计 (3)3.1 总体设计 (3)3.2 详细设计 (3)4 系统实现 (6)4.1 功能简介 (6)4.2 初始化部分 (6)4.3 数据发送 (7)4.4 程序查询的A/D转换 (8)5系统测试 (9)5.1 调试运行 (9)5.2 结果分析 (10)6心得体会 (11)7参考文献 (11)1 需求分析利用LPC2114开发板的MAX504芯片设计一个程序查询方式的数据采集程序,具体功能为:1、当改变LPC2114上w1和w2的电压值时,应用此程序进行采集2、将采集的数据在程序内转换成十进制3、将转换结果从串口输出,上位机使用串口助手软件全仿真的DOS字符窗口观察2技术基础2.1 A/D Control Register 介绍ADCR 名称描述7:0 SEL 在LPC2114中选择0-3通道数据进行采集和转换.15:8 CLKDIV A/D 转换器的时钟应为CLKDIV = Fpclk / 1000000 -1, 并且小于或等于4.5 MHz.16 BURST 若此位为0,则需要11个时钟周期来控制转换软件19:17 CLKS 在BURST的范围内选择时钟周期的个数21 PDN 若此位为1,则表示ADC正常工作模式(非掉电转换模式)23:22 TEST 若为00,则为正常工作模式(非测试模式)26:24 START 000: 未开始001: 开始转换27 EDGE 当为0时,则CAP/MA T引脚下降沿触发ADC转换当为1时,则CAP/MA T引脚上跳沿触发ADC转换2.2 A/D Data Register 介绍ADDR 名字描述31 DONE 若此位为1,则代表转换结束30 OVERUN 在BURST模式下,若此位为1,则表示转换结果部分丢失或被覆盖。
.29:27 这些位作为0读入26:24 CH 这些位包含来自被转换的LS位的通道23:16 这些位总是作为0读入15:6 V/VddA 当DONE为1时,则该区域包含来自不同通道的用二进制表示的电压值5:0 这些位总是作为0读入3 系统设计3.1 总体设计功能:使用ADC模块的通道0、1进行电压的测量,然后将转换结果从串口输出,上位机使用串口软件全仿真的DOS字符窗口观察。
说明:将JP5、JP10短接,由W1、W2调节测量电压值;通讯格式为8位数据位,1位停止位,无奇偶校验,波特率为115200。
具体函数:1、主函数:功能(1):完成CPU的引脚配置,和通道选择,使w1和w2两电位器与CPU相连接功能(2):完成控制寄存器的初始化功能(3):完成数据的采集和转换功能(4):完成数据的上传2、初始化串口子函数功能:设置为8位数据位,1位停止位,无奇偶校验,波特率为1152003、数据发送至串口子函数功能:进行通道0、1电压ADC转换,并把结果转换成电压值,然后发送到串口4、数据发送至上位机子函数功能:向PC机发送字串,以便显示3.2 详细设计总体描述:本程序主要由四个函数构成,分别为主函数、初始化串口子函数、数据发送至串口子函数、数据发送至上位机子函数。
首先在主函数中配置CPU的引脚,使得w1和w2两个电位器与之相连接,并通过配置ADCR,选择通道,以便将采集到的信号送至CPU进行处理。
上述工作完成之后,需要对ADCR进行初始化,通过阅读LPC2114芯片文档,了解ADCR 各位的主要功能,并根据需要进行相关配置。
ADDR是数据寄存器,CPU将采集数据送至其中。
CPU采用程序查询方式获取数据,然后进行转换操作,完成后,将数据送至串口,并由串口发送至上位机,在串口助手的界面中进行显示。
通过观察电压值的变化,从而判断是否已获取数据。
配置引脚初始化ADC 输入通道选择启动AD转换数据转换完毕?读取数据数据处理数据输出结束开始是延迟等待否具体步骤:1、正确配置电路,将JP5、JP10短接,由W1、W2调节测量电压值,通过JTAG接口使LPC2114与上位机相连。
2、配置CPU引脚Pin Connect Block 允许选择微处理器的引脚来完成多项功能,其中两个寄存器分别为:PINSEL0、PINSEL1。
设置P0.0、P0.1连接到UART0的TXD、RXD,PINSEL0 = 0x00000005PINSEL0 Pin Name Function when 011:0 P0.0 TxD (UART0)3:2 P0.1 RxD (UART0)设置P0.27、P0.28连接到AIN0、AIN1,PINSEL1 = 0x01400000PINSEL1 Pin Name Function when 0123:22 P0.27 AIN0 (A/D Converter)25:24 P0.28 AIN1 (A/D Converter)3、初始化ADC设置SEL = 1 ,选择通道0,CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz,设置BURST = 0 ,软件控制转换操作,设置CLKS = 0 ,使用11clock转换(即10转换方式),设置PDN = 1 ,正常工作模式(非掉电转换模式),设置TEST1:0 = 00 ,正常工作模式(非测试模式),设置START = 1 ,直接启动ADC转换。
设置EDGE = 0,CAP/MAT引脚下降沿触发ADC转换。
4、输入通道选择ADCR通过和0xFFFFFF00进行“与”操作,将低两位设置为0,从而从新进行赋值。
ADCR第0到7位名字为SEL,通过ADCR=0x01,将通道设置为1通道。
ADCR第24到26位名字为START,通过ADCR=(1 << 24),启动ADC,即当这三位分别为001时,表示ADC开始。
ADCR = (ADCR&0xFFFFFF00)|0x01|(1 << 24); // 切换通道并进行01通道转换ADCR = (ADCR&0xFFFFFF00)|0x02|(1 << 24); // 切换通道并进行02通道转换5、CPU程序查询方式获取数据启动ADC否是否转换完毕?是采集数据ADDR第31位(名字为DONE)用于判断数据是否转换完毕,当此位为1时,说明已经转换完毕,然后再次启动ADC,否则继续转换。
while( (ADDR&0x80000000)==0 ); // 等待转换结束ADCR = ADCR | (1 << 24); // 再次启运转换while( (ADDR&0x80000000)==0 ); // 等待转换结束ADC_Data = ADDR; // 从寄存器中获取数据,并赋给一个变量6、数据转换ADC_Data = (ADC_Data>>6) & 0x3FF; //ADDR寄存器中第6到15位保存了采集的电压值,通过右移六位,和0x3FF相与获取出来ADC_Data = ADC_Data * 3300; //电位器电压变化范围0-3.3伏,将数据进行相对应转换ADC_Data = ADC_Data / 1024;sprintf(str, "%4dmV at VIN1", ADC_Data);6、初始化串口引脚名称类型DescriptionRxD0 输入获取数据TxD0 输出传送数据U0LCR(UART0 Line Control Register)决定了接收或发送的数据类型.U0LCR Function Description1:0 选择字长00:5个字符长度01:6位字符长度10:7位字符长度11:8位字符长度7 决定是否允许更改域频分值0:不允许1:允许U0DLL和U0DLM分别用来存放域频分值的低八位和高八位。
U0LCR = 0x83; // DLAB = 1,可设置波特率Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率U0DLM = Fdiv / 256;U0DLL = Fdiv % 256;U0LCR = 0x03;//关闭寄存器,不允许修改域频分值8、传送数据至串口寄存器U0THR用于临时存储发送至上位机的数据,将获取的电压值作为子函数的参数存入U0THRU0THR = data; // 发送数据U0LSR Description5 0: U0THR contains valid data.(U0THR装有有效数据)1: U0THR is empty.(U0THR为空)while( (U0LSR&0x40)==0 ); // 等待数据发送完毕9、传送数据至上位机void ISendStr(char *str){while(1){ if(*str=='\0') break; // 若为'\0',则退出PC_DispChar(*str++); // 发送显示数据}}4 系统实现4.1功能简介/***************************************************************************** 功能:使用ADC模块的通道0、1进行电压的测量,然后将转换结果从串口输出,上位机使用串口助手软件全仿真的DOS字符窗口观察。
* 说明:将JP5、JP10短接,由W1、W2调节测量电压值;* 通讯格式为8位数据位,1位停止位,无奇偶校验,波特率为115200。
****************************************************************************/ 4.2初始化部分int main(void){ uint32 ADC_Data;char str[20];PINSEL0 = 0x00000005; // 设置P0.0、P0.1连接到UART0的TXD、RXD PINSEL1 = 0x01400000; // 设置P0.27、P0.28连接到AIN0、AIN1UART0_Init(); // 初始化UART0/* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */ ADCR = (1 << 0) | // SEL = 1 ,选择通道0((Fpclk / 1000000 - 1) << 8) | // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz(0 << 16) | // BURST = 0 ,软件控制转换操作(0 << 17) | // CLKS = 0 ,使用11clock转换(即10转换方式)(1 << 21) | // PDN = 1 ,正常工作模式(非掉电转换模式)(0 << 22) | // TEST1:0 = 00 ,正常工作模式(非测试模式)(1 << 24) | // START = 1 ,直接启动ADC转换(0 << 27); // EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)DelayNS(10);return(0);}4.3 数据发送/***************************************************************************** 名称:UART0_Init()* 功能:初始化串口0。