• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > Cortex-M3 (NXP LPC1788)之ADC數模轉換器的應用

    Cortex-M3 (NXP LPC1788)之ADC數模轉換器的應用

    作者: 時間:2016-11-19 來源:網絡 收藏
    A/D轉換器的功能是將模擬輸入信號采樣得到可以提供計算機進行處理的數字信號。LPC1788ADC是一個12位的逐次逼近型模數轉換器,有8個復用的輸入管腳,它的時鐘使用PCLK分頻得到。開發板的A/D輸入模塊電路圖如下

    本文引用地址:http://www.czjhyjcfj.com/article/201611/318453.htm

    要使用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!rn");
    19. }
    20. voidADC_IRQHandler()
    21. {
    22. if(rAD0DR2&(1UL<<31))
    23. {
    24. adc_value=((rAD0DR2)>>4)&0xFFF;
    25. Uart2SendD(adc_value);
    26. Uart2SendS("rn");
    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.rn"};
    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標志引起。



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 龙州县| 峨眉山市| 白水县| 德庆县| 达拉特旗| 泰来县| 潜江市| 灌云县| 莆田市| 建宁县| 神农架林区| 襄城县| 安义县| 新建县| 宁河县| 明星| 老河口市| 婺源县| 瑞丽市| 浦县| 马山县| 务川| 新竹市| 大名县| 涿鹿县| 和平区| 芜湖市| 安仁县| 南安市| 沙洋县| 武汉市| 凉城县| 绥阳县| 柘荣县| 汽车| 长泰县| 雷波县| 张家口市| 德阳市| 大竹县| 江北区|