<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Arm學(xué)習(xí)筆記--ADC編程

          Arm學(xué)習(xí)筆記--ADC編程

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


          LPC1788的ADC是一個(gè)12位的逐次逼近型模數(shù)轉(zhuǎn)換器,有8個(gè)復(fù)用的輸入管腳,它的時(shí)鐘使用PCLK分頻得到。從這段描述中我們可以分析出一下的內(nèi)容:
          1、編程的時(shí)候需要首先打開這個(gè)功能,所以需要配置寄存器PCONP
          2、既然ADC有8個(gè)引腳,所以就有一個(gè)選擇的寄存器,這個(gè)就是控制寄存器,因?yàn)闀r(shí)鐘需要切換,控制寄存器也包含這個(gè)功能
          3、ADC需要有數(shù)據(jù)寄存器來(lái)保存讀取到的數(shù)據(jù),那么每個(gè)輸入管腳就對(duì)應(yīng)一個(gè)寄存器用來(lái)存儲(chǔ)對(duì)應(yīng)引腳的數(shù)據(jù),這就是數(shù)據(jù)寄存器
          4、ADC當(dāng)前狀態(tài)的檢測(cè)需要一個(gè)狀態(tài)寄存器
          5、從ADC的塊圖上我們可以看出有中斷接口,所以肯定有一個(gè)中斷使能寄存器表明是那個(gè)引腳引起的中斷
          6、從塊圖上看到有一個(gè)觸發(fā)源,這里也是一個(gè)寄存器控制
          從塊圖和ADC的原理上我們基本上能理出這些內(nèi)容,下面我們就來(lái)看一個(gè)ADC的例程,從例程中分析LPC1788 ADC的編程思路。
          這是關(guān)于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.ex-cimer.com/article/201611/317287.htmADC的初始化代碼,主要設(shè)置了時(shí)鐘頻率,滿足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); //設(shè)置時(shí)鐘頻率

          /* 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; //配置了時(shí)鐘頻率
          }

          中斷配置

          /*********************************************************************//**
          * @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);
          }
          }

          設(shè)置通道

          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);
          }
          }


          其實(shí)ADC是很簡(jiǎn)單和基礎(chǔ)的,主要還是掌握好寄存器的使用。



          關(guān)鍵詞: ArmADC編

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();