新聞中心

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

        STM32學(xué)習(xí)筆記之ADC

        作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
        一、基礎(chǔ)知識

        1.18個(gè)通道,可測16個(gè)外部和2個(gè)內(nèi)部信號源,可設(shè)置成單側(cè)、連續(xù)、掃描、間斷模式執(zhí)行

        本文引用地址:http://www.104case.com/article/201611/322993.htm

        2.12位精度

        3.掃描模式,通道0到通道n的自動(dòng)轉(zhuǎn)化

        4.自校準(zhǔn)

        5.按通道配置采樣時(shí)間

        6.間斷模式?

        7.ADC模式?

        8.供電要求2.4~3.6V

        9.輸入范圍0~3.6V

        二、功能描述

        1.通道選擇:

        STM32的每個(gè)ADC模塊通過內(nèi)部的模擬多路開關(guān),可以切換到不同的輸入通道并進(jìn)行轉(zhuǎn)換。在任意多個(gè)通道上以任意順序進(jìn)行的一系列轉(zhuǎn)換構(gòu)成成組轉(zhuǎn)換。例如,可以如下順序完成轉(zhuǎn)換:通道3、通道8、通道2、通道2、通道0、通道2、通道2、通道15。

        有2種劃分轉(zhuǎn)換組的方式:規(guī)則通道組和注入通道組。通常規(guī)則通道組中可以安排最多16個(gè)通道,而注入通道組可以安排最多4個(gè)通道。

        在執(zhí)行規(guī)則通道組掃描轉(zhuǎn)換時(shí),如有例外處理則可啟用注入通道組的轉(zhuǎn)換。規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換均有外部觸發(fā)選項(xiàng),規(guī)則通道轉(zhuǎn)換期間有DMA請求產(chǎn)生,而注入轉(zhuǎn)換則無DMA請求,需要用查詢或中斷的方式保存轉(zhuǎn)換的數(shù)據(jù)。

        一個(gè)不太恰當(dāng)?shù)谋扔魇牵阂?guī)則通道組的轉(zhuǎn)換好比是程序的正常執(zhí)行,而注入通道組的轉(zhuǎn)換則好比是程序正常執(zhí)行之外的一個(gè)中斷處理程序。 規(guī)則組由多達(dá)16個(gè)轉(zhuǎn)換組成。規(guī)則通道和它們的轉(zhuǎn)換順序在ADC_SQRx寄存器中選擇。規(guī)則組中轉(zhuǎn)換的總數(shù)寫入ADC_SQR1寄存器的L[3:0]位中。
        注入組由多達(dá)4個(gè)轉(zhuǎn)換組成。注入通道和它們的轉(zhuǎn)換順序在ADC_JSQR寄存器中選擇。注入組里的轉(zhuǎn)換總數(shù)目寫入ADC_JSQR寄存器的L[1:0]位中。
        如果規(guī)則轉(zhuǎn)換已經(jīng)在運(yùn)行,為了在注入轉(zhuǎn)換后確保同步,所有的ADC(主和從)的規(guī)則轉(zhuǎn)換被停止,并在注入轉(zhuǎn)換結(jié)束時(shí)同步恢復(fù),見圖示。

        2.單次轉(zhuǎn)換模式:

        單次轉(zhuǎn)換模式里,ADC 只執(zhí)行一次轉(zhuǎn)換。

        3.連續(xù)轉(zhuǎn)換模式:

        在連續(xù)轉(zhuǎn)換模式中,當(dāng)前面ADC 轉(zhuǎn)換一結(jié)束馬上就啟動(dòng)另一次轉(zhuǎn)換。

        4.掃描模式:

        此模式用來掃描一組模擬通道。

        5.注入模式管理:

        (1)觸發(fā)注入。詳見參考手冊

        (2)自動(dòng)注入。如果設(shè)置了 JAUTO 位,在規(guī)則組通道之后,注入組通道被自動(dòng)轉(zhuǎn)換。這可以用
        來轉(zhuǎn)換在ADC_SQRx 和ADC_JSQR 寄存器中設(shè)置的多至20 個(gè)轉(zhuǎn)換序列。
        在此模式里,必須禁止注入通道的外部觸發(fā)。

        6.間斷模式:

        (1)規(guī)則組
        此模式通過設(shè)置 ADC_CR1 寄存器上的DISCEN 位激活。它可以用來執(zhí)行一個(gè)短序列的n 次轉(zhuǎn)換(n<=8),此轉(zhuǎn)換是ADC_SQRx 寄存器所選擇的轉(zhuǎn)換序列的一部分。N 由ADC_CR1 寄存器的DISCNUM[2:0]位給出。一個(gè)外部觸發(fā)信號可以啟動(dòng)ADC_SQRx 寄存器中描述的下一輪 n 次轉(zhuǎn)換,直到此序列所有的轉(zhuǎn)換完成為止。總的序列長度由ADC_SQR1 寄存器的L[3:0]定義。
        舉例:
        n=3,被轉(zhuǎn)換的通道 = 0, 1, 2, 3, 6, 7, 9, 10
        第一次觸發(fā):轉(zhuǎn)換的序列為 0,1,2
        第二次觸發(fā):轉(zhuǎn)換的序列為 3,6,7
        第三次觸發(fā):轉(zhuǎn)換的序列為 9,10,并產(chǎn)生EOC 事件
        第四次觸發(fā):轉(zhuǎn)換的序列 0,1,2
        注意: 當(dāng)一規(guī)則組以間斷模式轉(zhuǎn)換時(shí),轉(zhuǎn)換序列結(jié)束后不自動(dòng)從頭開始。當(dāng)所有子組被轉(zhuǎn)換完成,下一次觸發(fā)啟動(dòng)第一個(gè)子組的轉(zhuǎn)換。在上面的例子中,第四次觸發(fā)重新轉(zhuǎn)換第一子組的通道 0,1 和2。

        (2)注入組

        此模式通過設(shè)置 ADC_CR1 寄存器的JDISCEN 位激活。在一個(gè)外部觸發(fā)事件后,給模式按序轉(zhuǎn)換ADC_JSQR 寄存器中選擇的序列。
        一個(gè)外部觸發(fā)信號可以啟動(dòng)ADC_JSQR 寄存器選擇的下一個(gè)通道序列的轉(zhuǎn)換,直到序列中所有的轉(zhuǎn)換完成為止。總的序列長度ADC_JSQR 寄存器的JL[1:0]位定義。
        例子:
        n=1,被轉(zhuǎn)換的通道 = 1,2,3
        第一次觸發(fā):通道1 被轉(zhuǎn)換
        第二次觸發(fā):通道2 被轉(zhuǎn)換
        第三次觸發(fā):通道3 被轉(zhuǎn)換,并且產(chǎn)生EOC 和JEOC 事件
        第四次觸發(fā):通道1 被轉(zhuǎn)換
        注意:1 當(dāng)完成所有注入通道轉(zhuǎn)換,下個(gè)觸發(fā)啟動(dòng)第1 個(gè)注入通道的轉(zhuǎn)換。在上述例子中,第四個(gè)觸發(fā)重新轉(zhuǎn)換第1 個(gè)注入通道1。
        2 不能同時(shí)使用自動(dòng)注入和間斷模式。3 必須避免同時(shí)為規(guī)則和注入組設(shè)置間斷模式。間斷模式只能作用于一組轉(zhuǎn)換。

        7.雙ADC模式

        8.數(shù)據(jù)對齊
        ADC_CR2 寄存器中的ALIGN位選擇轉(zhuǎn)換后數(shù)據(jù)儲(chǔ)存的對齊方式。數(shù)據(jù)可以左對齊或右對齊,如圖146 和圖147 所示。
        注入組通道轉(zhuǎn)換的數(shù)據(jù)值已經(jīng)減去了在ADC_JOFRx 寄存器中定義的偏移量,因此結(jié)果可以是一個(gè)負(fù)值。SEXT 位是擴(kuò)展的符號值。
        對于規(guī)則組通道,不需減去偏移值,因此只有12 個(gè)位有效。
        數(shù)據(jù)右對齊:
        注入組
        SEXT SEXT SEXT SEXT D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
        規(guī)則組
        0 0 0 0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
        數(shù)據(jù)左對齊:

        注入組
        SEXT D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0
        規(guī)則組
        D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0

        三、 程序設(shè)計(jì)與軟件配置

        1.

        void ADC_Config(void)
        {
        ADC_InitTypeDef ADC_InitStructure;//定義ADC初始化結(jié)構(gòu)體變量
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在獨(dú)立模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能掃描
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC轉(zhuǎn)換工作在連續(xù)模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由軟件控制轉(zhuǎn)換
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//轉(zhuǎn)換數(shù)據(jù)右對齊
        ADC_InitStructure.ADC_NbrOfChannel = 1;//轉(zhuǎn)換通道數(shù)目為1
        ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
        ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);
        //ADC1選擇通道14,規(guī)則組采樣順序(1~16),采樣時(shí)間239.5個(gè)周期
        ADC_DMACmd(ADC1, ENABLE);//使能ADC1模塊DMA
        ADC_Cmd(ADC1, ENABLE);//使能ADC1
        ADC_ResetCalibration(ADC1); //重置ADC1校準(zhǔn)寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)重置完成
        ADC_StartCalibration(ADC1);//開始ADC1校準(zhǔn)
        while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準(zhǔn)完成
        ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1軟件開始轉(zhuǎn)換
        }



        關(guān)鍵詞: STM32學(xué)習(xí)筆記AD

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 廊坊市| 长治县| 锡林浩特市| 平湖市| 延吉市| 吉水县| 江门市| 昔阳县| 绵竹市| 边坝县| 八宿县| 萍乡市| 公主岭市| 澄迈县| 富蕴县| 江源县| 出国| 临泽县| 陆川县| 宜阳县| 长岭县| 札达县| 南部县| 陆河县| 潍坊市| 盱眙县| 墨玉县| 三门县| 怀安县| 安陆市| 丹凤县| 罗山县| 潞西市| 招远市| 边坝县| 城固县| 香港 | 哈尔滨市| 汤原县| 乐安县| 蓬安县|