• <code id="zjelh"></code>

          <source id="zjelh"><form id="zjelh"></form></source><acronym id="zjelh"><form id="zjelh"><blockquote id="zjelh"></blockquote></form></acronym>

          1. <acronym id="zjelh"><form id="zjelh"></form></acronym>

            <input id="zjelh"><rt id="zjelh"></rt></input>
            <var id="zjelh"><rt id="zjelh"></rt></var>
            <source id="zjelh"><form id="zjelh"><del id="zjelh"></del></form></source>

            當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > ADC

            ADC 時間:2019-07-29      來源:成都中心,楊老師

            一、ADC介紹

            1.基本介紹

            ADC,Analog-to-Digital Converter的縮寫,指模/數轉換器或者模數轉換器  。是指將連續變化的模擬信號轉換為離散的數字信號的器件。真實世界的模擬信號,例如溫度、壓力、聲音或者圖像等,需要轉換成更容易儲存、處理和發射的數字形式。模/數轉換器可以實現這個功能,在各種不同的產品中都可以找到它的身影。與之相對應的DAC,Digital-to-Analog Converter,它是ADC模數轉換的逆向過程。

            ADC最早用于對無線信號向數字信號轉換。如電視信號,長短播電臺發接收等。

            典型的模擬數字轉換器將模擬信號轉換為表示一定比例電壓值的數字信號。然而,有一些模擬數字轉換器并非純的電子設備,例如旋轉編碼器,也可以被視為模擬數字轉換器。

            數字信號輸出可能會使用不同的編碼結構。通常會使用二進制二補數(也稱作“補碼”)進行表示,但也有其他情況,例如有的設備使用格雷碼(一種循環碼)。

            2.采集原理

            在A/D轉換中,因為輸入的模擬信號在時間上是連續的,而輸出的數字信號是離散量,所以進行轉換時只能按一定的時間間隔對輸入的模擬信號進行采樣,然后再把采樣值轉換為輸出的數字量。通過A/D轉換需要經過采樣、保持量化、編碼四個步驟。也可將采樣、保持合為一步,量化、編碼合為一步,共兩大步來完成。

             

            二、對比exynos4412和stm32f10的ADC編程

            1.exynos  ADC 介紹

            (1)10 位或 12 位 CMOS 模數轉換器(ADC)由4通道模擬輸入組成。它利用 5MHz A/D 轉換器時鐘以最大 1MSPS 的轉換速率將模擬輸入信號轉換為 10 位或 12 位二進制數字代碼。A/D 轉換器采用片上 sample-and-hold 功能。ADC 支持低功耗模式.

            (2)ADC 包括下面的特性

            分辨率:10-bit / 12-bit(可選)

            微分非線性誤差:2.0 LSB(MAX.) 

            ★注:積分非線性表示了ADC器件在所有的數值點上對應的模擬值和真實值之間誤差最大的那一點的誤差值,也就是輸出數值偏離線性最大的距離。單位是LSB。例如,一個12bit的ADC,INL值為1LSB,那么,對應基準4.095V,測某電壓得到的轉換結果是1.000V,那么,真實電壓值可能分布在0.999V到1.001V之間。

            積分非線性誤差:4.0 LSB(Max.)

            頂部偏移誤差:0~+55 LSB

            底部偏移誤差:0~-55 LSB

            最大轉換速率:1 MSPS

            低功耗

            電源電壓:1.8V(典型值),1.0V(典型值,數字 I/O 接口)

            模擬輸入范圍:0~1.8V

            2.stm32f10 ADC 介紹

            12 位 ADC 是一種逐次逼近型模擬數字轉換器。它有多達 19 個通道,可測量 16 個外部和3個內部信號源。各通道的 A/D 轉換可以單次、連續、掃描或間斷模式執行。ADC 的結果可以左對齊或右對齊方式存儲在 16 位數據寄存器中。 

            模擬看門狗允許應用程序檢測輸入電壓是否超出了用戶設定的高 / 低閥值。 

            一個有效低功耗模式實施允許在低頻情況下實現低能耗。

            3.stm32f10的ADC(DMA)編程

            #define ADC1_DR_Address    ((u32)0x40012400+0x4c)

            __IO uint16_t ADC_ConvertedValue;

            /*

             * 函數名:ADC1_GPIO_Config

             * 描述  :使能ADC1和DMA1的時鐘,初始化PC.01

             * 輸入  : 無

             * 輸出  :無

             * 調用  :內部調用

             */

            static void ADC1_GPIO_Config(void)

            {

            GPIO_InitTypeDef GPIO_InitStructure;

            /* Enable DMA clock */

            RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

            /* Enable ADC1 and GPIOC clock */

            RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);

             

            /* Configure PC.01  as analog input */

            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

            GPIO_Init(GPIOC, &GPIO_InitStructure);// PC1,輸入時不用設置速率

            }

             

            /* 函數名:ADC1_Mode_Config

             * 描述  :配置ADC1的工作模式為MDA模式

             * 輸入  : 無

             * 輸出  :無

             * 調用  :內部調用

             */

            static void ADC1_Mode_Config(void)

            {

            DMA_InitTypeDef DMA_InitStructure;

            ADC_InitTypeDef ADC_InitStructure;

             

            /* DMA channel1 configuration */

            DMA_DeInit(DMA1_Channel1);

            DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址

            DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//內存地址

            DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

            DMA_InitStructure.DMA_BufferSize = 1;

            DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設地址固定

            DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;  //內存地址固定

            DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字

            DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

            DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循環傳輸

            DMA_InitStructure.DMA_Priority = DMA_Priority_High;

            DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

            DMA_Init(DMA1_Channel1, &DMA_InitStructure);

             

            /* Enable DMA channel1 */

            DMA_Cmd(DMA1_Channel1, ENABLE);

             

            /* ADC1 configuration */

            ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //獨立ADC模式

            ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //禁止掃描模式,掃描模式用于多通道采集

            ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //開啟連續轉換模式,即不停地進行ADC轉換

            ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部觸發轉換

            ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集數據右對齊

            ADC_InitStructure.ADC_NbrOfChannel = 1; //要轉換的通道數目1

            ADC_Init(ADC1, &ADC_InitStructure);

             

            /*配置ADC時鐘,為PCLK2的8分頻,即9Hz*/

            RCC_ADCCLKConfig(RCC_PCLK2_p8); 

            /*配置ADC1的通道11為55. 5個采樣周期,序列為1 */ 

            ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);

            /* Enable ADC1 DMA */

            ADC_DMACmd(ADC1, ENABLE);

             

            /* Enable ADC1 */

            ADC_Cmd(ADC1, ENABLE);

             

            /*復位校準寄存器 */   

            ADC_ResetCalibration(ADC1);

            /*等待校準寄存器復位完成 */

            while(ADC_GetResetCalibrationStatus(ADC1));

             

            /* ADC校準 */

            ADC_StartCalibration(ADC1);

            /* 等待校準完成*/

            while(ADC_GetCalibrationStatus(ADC1));

             

            /* 由于沒有采用外部觸發,所以使用軟件觸發ADC轉換 */ 

            ADC_SoftwareStartConvCmd(ADC1, ENABLE);

            }

             

            /*

             * 函數名:ADC1_Init

             * 描述  :無

             * 輸入  :無

             * 輸出  :無

             * 調用  :外部調用

             */

            void ADC1_Init(void)

            {

            ADC1_GPIO_Config();

            ADC1_Mode_Config();

            }

            int main(void)

            {

            /* USART1 config */

            USART1_Config();

            /* enable adc1 and config adc1 to dma mode */

            ADC1_Init();

            while (1)

            {

            ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 讀取轉換的AD值

            printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue); 

            printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal); 

            Delay(2000);                // 延時 

             

             

            }

            }

            4.Exynos4412 ADC 編程

            代碼如下:

            int main ()

            {

            ADCCON = ADCCON | 1 << 16;  //1通道 12bit

            ADCCON = ADCCON | 1 << 14;  //使能預分頻

            ADCCON = ADCCON & (~(0xff << 6)) | (19 << 6); //分頻值19

             

            ADCCON = ADCCON | 1 << 2;    // Standby mode

            ADCCON = ADCCON & ~(1 << 1); //stop

             

            unsigned int value = 0;

             

            while (1)

            {

            ADCCON = ADCCON | 1;    //start

             

            while(!(ADCCON & (1 << 15))); //等待結束

             

            value = ADCDAT & 0xfff;

             

            value = value * 1.8/4096 *1000;

            // printf("value = %dmv \n",value);

             

            delay();

            }

             

            return 0;

            }

            上一篇:Shell命令

            下一篇:嵌入式程序員要學習的 經典數據結構

            熱點文章推薦
            華清學員就業榜單
            高薪學員經驗分享
            熱點新聞推薦
            前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2018 北京華清遠見科技發展有限公司 版權所有 ,京ICP備16055225號,京公海網安備11010802025203號

            回到頂部

            有位老師想和您聊一聊

            yy4480影院