您的位置 首页 IOT

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

A/D转换器的功能是将模拟输入信号采样得到可以提供计算机进行处理的数字信号。LPC1788的ADC是一个12位的逐次逼近型模数转换器,有8…

A/D转化器的功用是将模仿输入信号采样得到能够供给计算机进行处理的数字信号。LPC1788ADC是一个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. #definerIOCON_P0_25(*(volatileunsigned*)(0x4002C064))
  4. #definerIOCON_P2_10(*(volatileunsigned*)0x4002C128)
  5. #definerEXTINT(*(volatileunsigned*)0x400FC140)
  6. #definerEXTMODE(*(volatileunsigned*)0x400FC148)
  7. #definerEXTPOLAR(*(volatileunsigned*)0x400FC14C)
  8. #definerAD0CR(*(volatileunsigned*)(0x40034000))
  9. #definerAD0INTEN(*(volatileunsigned*)(0x4003400C))
  10. #definerADGDR(*(volatileunsigned*)(0x40034004))
  11. #definerAD0DR2(*(volatileunsigned*)(0x40034018))
  12. #definerAD0STAT(*(volatileunsigned*)(0x40034030))
  13. #definerAD0TRM(*(volatileunsigned*)(0x40034034))
  14. unsignedintadc_value;
  15. voidEINT0_IRQHandler()
  16. {
  17. rEXTINT|=(0x1<<0);//中止发生之后有必要铲除改位
  18. Uart2SendS(“SW6ON!\r\n”);
  19. }
  20. voidADC_IRQHandler()
  21. {
  22. if(rAD0DR2&(1UL<<31))
  23. {
  24. adc_value=((rAD0DR2)>>4)&0xFFF;
  25. Uart2SendD(adc_value);
  26. Uart2SendS(“\r\n”);
  27. }
  28. else
  29. {
  30. Uart2SendC(x);
  31. }
  32. }
  33. voidEINT_INIT()
  34. {
  35. rEXTMODE|=0x1<<0;//装备成边缘触发
  36. rEXTPOLAR&=~(0x1<<0);//下降沿触发
  37. rISER0=(0x1<<18);//翻开EINT0中止使能
  38. }
  39. intmain()
  40. {
  41. charmenu[]={“PressSW6togetaADC_Value.\r\n”};
  42. Init_Uart2();
  43. EINT_INIT();
  44. rPCONP|=0x1<<12;//使能PCADC功率操控
  45. rIOCON_P2_10=(rIOCON_P2_10&(~0x7))|(0x1<<0);//装备FUNC字段为EINT0形式
  46. rIOCON_P0_25&=~(0x1<<7);//P0[25]做模仿管脚
  47. rIOCON_P0_25&=~(0x3<<3);//无效上下拉电阻
  48. rIOCON_P0_25&=~0x7;//P0[25]作为ADC[2]功用
  49. rIOCON_P0_25|=0x1;
  50. rAD0CR|=0x1<<2;//运用通道2
  51. rAD0CR|=0x4<<8;//A/D转化时钟设置成12M
  52. rAD0CR|=0x1<<21;//A/D作业在正常形式
  53. rAD0INTEN|=0x1<<2;//使能A/D通道2转化完中止
  54. rAD0INTEN&=~(0x1<<8);//无视大局数据寄存器的DONE标志
  55. rAD0CR|=0x1<<27;
  56. rAD0CR&=~(0x7<<24);
  57. rAD0CR|=0x2<<24;//P2[10]下降沿出现时发动转化
  58. rISER0|=0x1<<22;//使能A/D中止
  59. Uart2SendS(menu);
  60. while(1);
  61. }

程序运转的作用是,按下操控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标志引起。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/265728.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部