Cortex-M3 (NXP LPC1788)之ADC数模转换器的应用

发布者:沭阳小黄同志最新更新时间:2016-05-26 来源: eefocus关键字:Cortex-M3  NXP  LPC1788  ADC  数模转换器 手机看文章 扫描二维码
随时随地手机看文章
        A/D转换器的功能是将模拟输入信号采样得到可以提供计算机进行处理的数字信号。LPC1788的ADC是一个12位的逐次逼近型模数转换器,有8个复用的输入管脚,它的时钟使用PCLK分频得到。开发板的A/D输入模块电路图如下

      

          要使用ADC转换,也要配置PCONP寄存器,配置ADC的时钟以及管脚和中断等。A/D转换控制寄存器AD0CR用来设置ADC的通道,时钟分频,工作模式和启动A/D转换的方式。开发板使用的是AIN2即A/D转换通道2,管脚为P0[25]。根据之前的文章,配置了系统的PCLK位60M,所以设置时钟分频5分频,将ADC的时钟设置成12M,而ADC完成一次转换需要31个时钟,所以ADC的转换频率约为400KHZ。AD0CR的START和EDGE用来控制ADC转换的触发方式,我们可以配置成通过定时器和外部中断来触发AD转换以及触发的边沿的方式。

        ADC转换完成后,转换的结果保存在A/D数据寄存器,有两个数据寄存器,他们分别是全局数据寄存器AD0GDR和每个通道的数据寄存器AD0DR0~AD0DR7,他们包含了数据转换结果和一些转换的状态标志。

        ADC中断使能寄存器AD0INTEN,控制每个通道转换完成后是否产生中断,以及全局数据寄存器AD0GDR中的DONE标志是否产生中断。

        下面的程序中,我将ADC配置成P2[10]外部中断触发AD转换,AD转换完成后会触发AD中断,在中断中进行数据的处理。

 

  1. #include "LPC1788_REG.h"  
  2. #include "uart.h"  
  3.   
  4. #define rIOCON_P0_25    (*(volatile unsigned*)(0x4002C064))  
  5. #define rIOCON_P2_10    (*(volatile unsigned *)0x4002C128)  
  6.   
  7. #define rEXTINT         (*(volatile unsigned *)0x400FC140)  
  8. #define rEXTMODE        (*(volatile unsigned *)0x400FC148)  
  9. #define rEXTPOLAR       (*(volatile unsigned *)0x400FC14C)  
  10.   
  11. #define rAD0CR      (*(volatile unsigned*)(0x40034000))  
  12. #define rAD0INTEN   (*(volatile unsigned*)(0x4003400C))  
  13. #define rADGDR      (*(volatile unsigned*)(0x40034004))  
  14. #define rAD0DR2     (*(volatile unsigned*)(0x40034018))  
  15. #define rAD0STAT    (*(volatile unsigned*)(0x40034030))  
  16. #define rAD0TRM     (*(volatile unsigned*)(0x40034034))  
  17.   
  18. unsigned int adc_value;  
  19.   
  20. void EINT0_IRQHandler()  
  21. {  
  22.     rEXTINT |= (0x1<<0);//中断产生之后必须清除改位  
  23.   
  24.     Uart2SendS("SW6 ON!\r\n");  
  25. }  
  26.   
  27. void ADC_IRQHandler()  
  28. {  
  29.     if(rAD0DR2&(1UL<<31))  
  30.     {  
  31.         adc_value = ((rAD0DR2)>>4) & 0xFFF;  
  32.         Uart2SendD(adc_value);  
  33.         Uart2SendS("\r\n");  
  34.     }  
  35.     else  
  36.     {  
  37.         Uart2SendC('x');  
  38.     }  
  39. }  
  40.   
  41. void EINT_INIT()  
  42. {  
  43.     rEXTMODE |= 0x1<<0;     //配置成边沿触发  
  44.     rEXTPOLAR &= ~(0x1<<0); //下降沿触发  
  45.       
  46.     rISER0 = (0x1<<18);//打开EINT0中断使能  
  47. }  
  48.   
  49. int main()  
  50. {  
  51.     char menu[]={"Press SW6 to get a ADC_Value.\r\n"};  
  52.     Init_Uart2();  
  53.     EINT_INIT();  
  54.   
  55.     rPCONP |= 0x1<<12;  //使能PCADC功率控制   
  56.       
  57.     rIOCON_P2_10 = (rIOCON_P2_10&(~0x7))|(0x1<<0);  //配置FUNC字段为EINT0模式  
  58.       
  59.     rIOCON_P0_25 &= ~(0x1<<7);  //P0[25]做模拟管脚  
  60.     rIOCON_P0_25 &= ~(0x3<<3);  //无效上下拉电阻  
  61.     rIOCON_P0_25 &= ~0x7;       //P0[25]作为ADC[2]功能  
  62.     rIOCON_P0_25 |= 0x1;  
  63.       
  64.       
  65.     rAD0CR |= 0x1<<2;       //使用通道2  
  66.     rAD0CR |= 0x4<<8;       //A/D转换时钟设置成12M  
  67.     rAD0CR |= 0x1<<21;      //A/D工作在正常模式  
  68.     rAD0INTEN |= 0x1<<2;    //使能A/D通道2转换完中断  
  69.   
  70.     rAD0INTEN &= ~(0x1<<8);    //无视全局数据寄存器的DONE标志  
  71.   
  72.     rAD0CR |= 0x1<<27;        
  73.     rAD0CR &= ~(0x7<<24);  
  74.     rAD0CR |= 0x2<<24;      //P2[10]下降沿出现时启动转换   
  75.     rISER0 |= 0x1<<22;      //使能A/D中断     
  76.       
  77.     Uart2SendS(menu);  
  78.     while(1);  
  79. }  

        程序运行的效果是,按下控制P2[10]的按键,每按一次得到一个AD采样的结果,改变R94的输入,可以得到不同的结构,最大最小分别是0和4095。

        程序中需要注意的有如下几点:

 

        1,P2[10]必须配置成EINT0模式,才能用于在边沿上触发ADC转换。

        2,必须关闭ADC输入管脚的上拉或下拉电阻,否则AD采样会有偏差。

        3,ADC转换完成的中断使能,最好把AD0INTEN的最高位无效,否则需要在ADC转换完成后同时清除通道数据寄存器AD0DRn和全局数据寄存器AD0GDR中的DONE标志(该标志通过读取数据寄存器清除)。可以尝试把程序中的rAD0INTEN &= ~(0x1<<8)屏蔽,可以看到串口一直在输出'x',即AD数据没转换完成,也有中断一直产生。原因就是AD0GDR中的DONE标志引起。

关键字:Cortex-M3  NXP  LPC1788  ADC  数模转换器 引用地址:Cortex-M3 (NXP LPC1788)之ADC数模转换器的应用

上一篇:Cortex-M3 (NXP LPC1788)之EEPROM存储器
下一篇:Cortex-M3 (NXP LPC1788)之WDT窗口看门狗定时器

推荐阅读最新更新时间:2024-03-16 14:55

恩智浦推出业界领先的LPC微控制器系列,实现突破性创新
电子网消息,全球领先的微控制器供应商恩智浦半导体( NXP )今日推出LPC84x系列。据悉,LPC84x系列是快速扩展的32位微控制器LPC800系列(基于ARM 30MHz Cortex-M0+)的最新产品,旨在平衡功率、性能和价格,满足市场对于简化和加快开发的需求,从而助力下一代设计变得更加智能、低成本和高功效。 恩智浦资深副总裁兼微控制器业务线总经理Geoff Lees表示:“我们与广大客户群合作,将LPC84x系列投入量产,为此我们感到非常兴奋。相比老化的专有8位MCU,新系列进一步延伸了LPC800独特的创新特性。” LPC84x系列的创新基于一种独特的方式,无需CPU干预即可配置器件,进一步提升了集成的节能特
[半导体设计/制造]
Linear推出超低功率14 位150Msps模数转换器
凌力尔特公司 (Linear Technology Corporation) 推出超低功率 14 位、150Msps 模数转换器 (ADC) LTC2262,该器件仅消耗 149mW 功率,这低于同类解决方案功耗的 1/3。这种新的基准使得那些受限于严格功率预算的便携式应用能够扩展其性能,并为 3G/4G LTE 和 WiMAX 基站设备提供较高的工作效率和减低经常性运作成本。除了消耗低得多的功率,LTC2262 还集成了两种独特的功能,以在甚至良好的布局做法也可能失效的情况下减少数字反馈。这些特点加之低功率可减轻在多种应用中采用高速 ADC 完成设计任务的负担,这些应用包括便携式医疗成像和超声、便携式测试和仪表、非破坏性测
[模拟电子]
Linear推出超低功率14 位150Msps<font color='red'>模数转换器</font>
1.9.3_ADC和触摸屏_电阻触摸屏硬件原理_P
如上图示,假设有一个长度为L的电阻,一端接地,另一端接3.3v,如果这个电阻的阻值是均匀分布的,那么根据欧姆定律,电阻某一位置x的电压值就与电阻的长度就会有一个关系式,我们就可以根据这一点的电压推导出这一点在L的位置分布。 这就是电阻触摸屏的硬件原理。 在LCD屏幕上覆盖了一层触摸屏,这层触摸屏由两层贴的很近的膜组成。 在上面这层膜的两边引出Xp和Xm,在下面这层膜的两边引出Yp和Ym,当触摸屏被按下时,两层膜就会贴到一起,根据这一特点我们可以测出触点的X,Y坐标。 测量触点的X坐标: 将Xp接3.3v,Xm接地,Ym和Yp不接电源; 测Yp电压,就可以得到X坐标的AD值; 同理,测量触点的Y坐标: Xp
[单片机]
1.9.3_<font color='red'>ADC</font>和触摸屏_电阻触摸屏硬件原理_P
用STM32内置的高速ADC实现简易示波器
做一个数字采样示波器一直是我长久以来的愿望,不过毕竟这个目标难度比较大,涉及的方面实在太多,模拟前端电路、高速ADC、单片机、CPLD/FPGA、通讯、上位机程序、数据处理等等,不是一下子就能成的,慢慢一步步来呗,呵呵,好歹有个目标,一直在学习各方面的知识,也有动力:)由于高速ADC涉及到采样后的数据存储问题,大量的数据涌入使得单片机无法承受,因此通常需要用外部高速RAM加CPLD配合,或者干脆用大容量的 FPGA做数据存储处理等,然后通知单片机将数据发送出去。这部分实在是难度比较大,电路非常复杂,自己是有心无力啊,还得慢慢地技术积累。。。 正好ST新推出市场的以CORTEX-M3为核心的STM32,内部集成了2个1Msps 12
[单片机]
ARM架构—— Cortex-M3与Cortex-M4特点概述
一、处理器和微控制器差别 微控制器包含处理器,处理器只是其中一小部分,具体包含存储器、时钟生成、分配逻辑、系统总线以及外设(I/O接口单元、通信接口、定时器、ADC、DAC等等),如图1-1所示: 图 1一1微控制架构 即使处理器相同,但是不同芯片厂商根据不同的应用场景选择不同的特性模块就能设计出不同特性的微控制器。 二、Cortex-M3与Cortex-M4特点 Cortex-M3与Cortex-M4处理器均使用32位架构,寄存器组中的内部寄存器、数据通路以及总线接口都是32位。Cortex-M处理器使用的指令集架构(ISA)为Thumb ISA,基于Thumb-2技术并同时支持16位和32位指令。 异同点:
[单片机]
ARM架构—— <font color='red'>Cortex-M3</font>与Cortex-M4特点概述
Proteus8.8版本+ STM32F103驱动LCD1602显示程序+按键+ADC+串口
STM32F103仿真驱动点亮LCD1602 一、开发环境介绍 proteus 8.8 版本+ STM32CubeMX 4.18.0 程序基于keil集成开发环境编写,基于ST官方的HAL库。 STM32CubeMX pack版本 STM32CubeMX的版本 二、项目功能介绍 该项目程序中实现了 1、程序实现了LCD1602的点亮显示 2、程序中实现了STM32的AD采样 3、程序中实现了串口通信 4、程序中实现了按键控制操作 通过滑动变阻器加放大器改变输入值。后边加上lcd1602,初始化显示“光节点检测系统” 然后加个按键按下开始 显示“光功率值:(多少)dbm 这里的范围就0-100 通过调节前边电位器每次只变化一
[单片机]
Proteus8.8版本+ STM32F103驱动LCD1602显示程序+按键+<font color='red'>ADC</font>+串口
ADI新推出JESD204系列数据转换器产品
- ADI 公司的 JESD204 数据转换器产品阵容进一步扩大 , 14 位模数转换器能够提高无线基础设施和数据采集系统的信号保真度并简化电路板布局 北京2010年8月3日电 /美通社亚洲/ -- Analog Devices, Inc. (NYSE: ADI),全球领先的高性能信号处理解决方案供应商,最近宣布推出一对支持 JESD204A 数据转换器串行接口标准的低功耗、高速14位 ADC( 模数转换器 )AD9644 和 AD9641。JESD204A 标准允许高速通信和数据采集系统的设计人员在延长传输长度的同时,提高信号保真度并简化印刷电路板布局。 AD9644 (双通道)和 AD9641 14位80MS
[模拟电子]
ADI新推出JESD204系列数据转换器产品
德州仪器推出性能最高、体积最小的 12 位 500 MSPS ADC
2006 年 12 月5 日,北京讯 日前,德州仪器 (TI) 宣布推出一款单通道 12 位 500 MSPS 模数转换器 (ADC),实现了尺寸与性能优势的完美结合。全新管线式 ADC 在采样速率为 500 MSPS、输入频率高达 500Hz 时可提供 64.5 dBFS 的信噪比 (SNR),从而为原来只能选择 8 位与 10 位精度的客户提供了全新的高性能解决方案。新型 ADC 采用节省空间的 14 毫米 x 14 毫米封装,能够满足多种应用的精度与速度要求,其中包括通信、放大器线性化、测量测试仪表、软件定义无线电以及雷达与影像系统等。(更多详情,敬请访问: www.ti.com/sc06210 )    A
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved