新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Arm學習筆記--ADC編程

        Arm學習筆記--ADC編程

        作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
        A/D轉(zhuǎn)換器的功能是將模擬輸入信號采樣得到可以提供計算機進行處理的數(shù)字信號。開發(fā)板的A/D輸入模塊電路圖如下
        這是一個測量電壓值的電路。


        LPC1788的ADC是一個12位的逐次逼近型模數(shù)轉(zhuǎn)換器,有8個復用的輸入管腳,它的時鐘使用PCLK分頻得到。從這段描述中我們可以分析出一下的內(nèi)容:
        1、編程的時候需要首先打開這個功能,所以需要配置寄存器PCONP
        2、既然ADC有8個引腳,所以就有一個選擇的寄存器,這個就是控制寄存器,因為時鐘需要切換,控制寄存器也包含這個功能
        3、ADC需要有數(shù)據(jù)寄存器來保存讀取到的數(shù)據(jù),那么每個輸入管腳就對應一個寄存器用來存儲對應引腳的數(shù)據(jù),這就是數(shù)據(jù)寄存器
        4、ADC當前狀態(tài)的檢測需要一個狀態(tài)寄存器
        5、從ADC的塊圖上我們可以看出有中斷接口,所以肯定有一個中斷使能寄存器表明是那個引腳引起的中斷
        6、從塊圖上看到有一個觸發(fā)源,這里也是一個寄存器控制
        從塊圖和ADC的原理上我們基本上能理出這些內(nèi)容,下面我們就來看一個ADC的例程,從例程中分析LPC1788 ADC的編程思路。
        這是關于LPC1788的ADC寄存器定義,跟我們的分析差不多

        typedef struct
        {
        __IO uint32_t CR; /*!< Offset: 0x000 A/D Control Register (R/W) */
        __IO uint32_t GDR; /*!< Offset: 0x004 A/D Global Data Register (R/W) */
        uint32_t RESERVED0;
        __IO uint32_t INTEN; /*!< Offset: 0x00C A/D Interrupt Enable Register (R/W) */
        __IO uint32_t DR[8]; /*!< Offset: 0x010-0x02C A/D Channel 0..7 Data Register (R/W) */
        __I uint32_t STAT; /*!< Offset: 0x030 A/D Status Register (R/ ) */
        __IO uint32_t ADTRM;
        } LPC_ADC_TypeDef;

        本文引用地址:http://www.104case.com/article/201611/317287.htmADC的初始化代碼,主要設置了時鐘頻率,滿足ADC操作的需求

        void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t rate)
        {
        uint32_t temp, tmp;

        // Turn on power and clock
        CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCADC, ENABLE); //開啟ADC功能

        ADCx->CR = 0; //控制寄存器初始化

        //Enable PDN bit
        tmp = ADC_CR_PDN;

        // Set clock frequency
        temp = CLKPWR_GetCLK(CLKPWR_CLKTYPE_PER); //設置時鐘頻率

        /* The APB clock (PCLK_ADC0) is divided by (CLKDIV+1) to produce the clock for
        * A/D converter, which should be less than or equal to 12.4MHz.
        * A fully conversion requires 31 of these clocks.
        * ADC clock = PCLK_ADC0 / (CLKDIV + 1);
        * ADC rate = ADC clock / 31;
        */
        temp = (temp /(rate * 31)) - 1;
        tmp |= ADC_CR_CLKDIV(temp);

        ADCx->CR = tmp; //配置了時鐘頻率
        }

        中斷配置

        /*********************************************************************//**
        * @brief ADC interrupt configuration
        * @param[in] ADCx pointer to LPC_ADC_TypeDef, should be: LPC_ADC
        * @param[in] IntType: type of interrupt, should be:
        * - ADC_ADINTEN0: Interrupt channel 0
        * - ADC_ADINTEN1: Interrupt channel 1
        * ...
        * - ADC_ADINTEN7: Interrupt channel 7
        * - ADC_ADGINTEN: Individual channel/global flag done generate an interrupt
        * @param[in] NewState:
        * - SET : enable ADC interrupt
        * - RESET: disable ADC interrupt
        * @return None
        **********************************************************************/
        void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState)
        {
        ADCx->INTEN &= ~ADC_INTEN_CH(IntType);
        if (NewState){
        ADCx->INTEN |= ADC_INTEN_CH(IntType);
        }
        }

        設置通道

        void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState)
        {
        if (NewState == ENABLE) {
        ADCx->CR |= ADC_CR_CH_SEL(Channel);
        } else {
        ADCx->CR &= ~ADC_CR_CH_SEL(Channel);
        }
        }

        中斷處理

        void ADC_IRQHandler(void)
        {
        adc_value = 0;

        if (ADC_ChannelGetStatus(LPC_ADC, TENGHUA_ADC_PREPARED_CHANNEL, ADC_DATA_DONE))
        {
        adc_value = ADC_ChannelGetData(LPC_ADC, TENGHUA_ADC_PREPARED_CHANNEL);
        NVIC_DisableIRQ(ADC_IRQn);
        }
        }


        其實ADC是很簡單和基礎的,主要還是掌握好寄存器的使用。



        關鍵詞: ArmADC編

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 安化县| 华亭县| 乐山市| 湟源县| 博白县| 闵行区| 九龙坡区| 玛曲县| 含山县| 洱源县| 福泉市| 南充市| 安岳县| 井研县| 瓮安县| 淮阳县| 通许县| 孙吴县| 新巴尔虎左旗| 阿鲁科尔沁旗| 冷水江市| 南和县| 攀枝花市| 屯昌县| 和龙市| 三河市| 年辖:市辖区| 鲁山县| 柯坪县| 沙洋县| 定结县| 福清市| 廉江市| 沙田区| 鄂尔多斯市| 泗阳县| 玉溪市| 布拖县| 香格里拉县| 买车| 宜兰市|