stm32 嵌入式開發 用標准庫進行 ADC 實驗總結


------------恢復內容開始------------

硬件原理圖  ,滑動電位器與芯片PC3引腳連接

根據開發板可知:STM32F429IGT6 3 ADC,每個 ADC 12 位、 10 位、 8 位和 6 位可選,每個ADC 16 個外部通道。 

        每個ADC 同時還有3個內部通道:通道16/17/18

        工作模式有3種:獨立模式、雙重模式和三重模式 。

 

 

 

 轉換順序可分為:規則序列,注入序列。如下圖所示:

規則序列寄存器設置根據表由上到下選擇通道進行配置

注入序列寄存器JSQR轉換順序為JSQR[X][4:0],

                  X=4-JL,JL為需要轉換的通道

 

 

 

 

觸發源可選擇:ADC2_CR2->ADON

       外部事件觸發:內部定時器、外部IO  (EXTSEL[2:0]    JEXTSEL[2:0]控制 )

 

 

時間設置: ADC 的輸入時鍾ADC_CLK由PCLK2經過分頻產生36MH最大z頻率

采樣時間:每個通道可以設置不同的采樣頻率,最小的采樣時間是3個周期1/ADC_CLK

    ADC總轉換時間= 采樣時間+12個時鍾周期

數據寄存器:ADC_DR         1個32位寄存器,最低16位有效。獨立模式時使用,可以開啟DMA模式

      ADC_JDRX    4個32位寄存器,低16位有效

      ADC_CDR  適用於雙重和三重模式

 

轉換結束中斷:規則通道轉換結束中斷

         注入轉換通道轉換結束中斷 

         模擬看門狗中斷:模擬電壓控制

         溢出中斷  :數據丟失

         DMA請求:

 

庫文件結構體使用:  ADC_InitTypeDef  --------->>>>>>>>>stm32f4xx_adc.h

          ADC_CommonInitTypeDe ------->>>>stm32f4xx_adc.h

          ADC_Init ----------------------->>>>>>>stm32f4xx_adc.c

 

編程要點:其中串口發送子程序直接移植

1) 初始化配置 ADC 目標引腳為模擬輸入模式;
2) 使能 ADC 時鍾;
3) 配置通用 ADC 為獨立模式,采樣 4 分頻;
4) 設置目標 ADC 12 位分辨率, 1 通道的連續轉換,不需要外部觸發;
5) 設置 ADC 轉換通道順序及采樣時間;
6) 配置使能 ADC 轉換完成中斷,在中斷內讀取轉換完數據;
7) 啟動 ADC 轉換;
8) 使能軟件觸發 ADC 轉換

引腳宏定義代碼

 1 #ifndef BSP_ADC_H
 2 #define BSP_ADC_H
 3 #include "stm32f4xx.h"
 4 
 5 // 中斷定義
 6 #define    Rheostat_ADC_IRQ                            ADC_IRQn//中斷號
 7 #define Rheostat_ADC_INT_FUNCTION                  ADC_IRQHandler//中斷接口函數
 8 // 變阻器接口GPIO
 9 #define Rheostat_ADC_GPIO_PORT                      GPIOC
10 #define Rheostat_ADC_GPIO_PIN                        GPIO_Pin_3
11 #define Rheostat_ADC_GPIO_CLK                         RCC_AHB1Periph_GPIOC
12 
13 #define Rheostat_ADC                                    ADC1
14 #define Rheostat_ADC_CLK                             RCC_APB2Periph_ADC1
15 #define Rheostat_ADC_CHANNEL                       ADC_Channel_13
16 
17 
18 
19  void Rheostat_Init(void);
20 
21 
22 
23 #endif

 

 

配置ADC工作代碼

#include "./adc/bsp_adc.h"
/*
編程要點:
初始化配置 ADC 目標引腳為模擬輸入模式
使能 ADC 時鍾
配置通用 ADC 為獨立模式,采樣 4 分頻
配置目標 ADC 為 12 位分辨率,1 通道的連續轉換,不需要外部觸發
設置 ADC 轉換通道順序及采樣時間
配置使能 ADC 轉換完成中斷,在中斷內讀取轉換完數據
啟動 ADC 轉換
使能軟件觸發 ADC 轉換
ADC 轉換結果數據使用中斷方式讀取,這里沒有使用 DMA 進行數據傳輸。
*/

// 變阻器 ADC_GPIO 初始化
static void Rheostat_ADC_GPIO_Config(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;
    // 使能 GPIO 時鍾
    RCC_AHB1PeriphClockCmd(Rheostat_ADC_GPIO_CLK, ENABLE);
    //配置 IO 
    GPIO_InitStructure.GPIO_Pin = Rheostat_ADC_GPIO_PIN;
    // 模擬輸入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    // 不上拉不下拉
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    
    GPIO_Init(Rheostat_ADC_GPIO_PORT,&GPIO_InitStructure);
    
    
}

// 配置 ADC 工作模式
static void Rheostat_ADC_Mode_Config(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    ADC_CommonInitTypeDef    ADC_CommonInitStructure;
    // 使能 ADC 時鍾
    RCC_APB2PeriphClockCmd(Rheostat_ADC_CLK,ENABLE);
    // ----------ADC Common 結構體 參數  初始化--------------
    // 獨立 ADC 模式
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    // 時鍾為 fpclk x 分頻
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//90/4
    // 禁止 DMA 直接訪問模式
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
    // 采樣時間間隔
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;
    
    ADC_CommonInit  ( &ADC_CommonInitStructure );  

    // -----------ADC Init 結構體 參數 初始化-----------------
    
    // ADC 分辨率
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b  ;//電壓值=(讀取到的值*3.3v / 2^12)
    // 禁止掃描模式,多通道采集才需要
    ADC_InitStructure.ADC_ScanConvMode = DISABLE ;
    // 連續轉換
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE ;
    // 禁止外部邊沿觸發
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    // 數據右對齊
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right  ;
    // 外部觸發選擇
    //    ADC_InitStructure.ADC_ExternalTrigConv = 
    //    轉換通道1個
    ADC_InitStructure.ADC_NbrOfConversion = 1;
    ADC_Init  ( Rheostat_ADC, &ADC_InitStructure) ;
    //配置 ADC 通道轉換順序為 1,第一個轉換,采樣時間為 56 個時鍾周期
     ADC_RegularChannelConfig  ( Rheostat_ADC, Rheostat_ADC_CHANNEL,
                                                            1, ADC_SampleTime_56Cycles) ;
        //  ADC 轉換結束產生中斷,在中斷服務程序中讀取轉換
     ADC_ITConfig  ( Rheostat_ADC,ADC_IT_EOC,  ENABLE) ; 
        // 使能 ADC 
     ADC_Cmd (Rheostat_ADC,ENABLE);
        // 開始 ADC 轉換,軟件觸發
     ADC_SoftwareStartConv  ( Rheostat_ADC) ;

}

// 中斷配置ADC
static void Rheostat_ADC_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig ( NVIC_PriorityGroup_1);
    NVIC_InitStructure.NVIC_IRQChannel = Rheostat_ADC_IRQ;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    
    NVIC_Init(&NVIC_InitStructure);

}
 void Rheostat_Init(void)
 {
     Rheostat_ADC_NVIC_Config();
     Rheostat_ADC_GPIO_Config();
     Rheostat_ADC_Mode_Config();
 }

中斷響應

extern uint16_t ADC_ConvertedValue;// main 中定義的全局變量
void Rheostat_ADC_INT_FUNCTION(void)
{

        if(ADC_GetITStatus (Rheostat_ADC,ADC_IT_EOC) == SET) 
        {
            // 讀取ADC 轉換的值
            ADC_ConvertedValue = ADC_GetConversionValue(Rheostat_ADC);
            
        }
        ADC_ClearITPendingBit(Rheostat_ADC,ADC_IT_EOC);
}

 

實驗結果

 

實驗總結:

ADC_IRQn//中斷號 ---->>>>>>在文件stm32f4xx.h(外設寄存器定義文件)
ADC_IRQHandler//中斷接口函數 ----->>>>>在文件startup_stm32f429_439xx.s(匯編編寫的啟動文件中找,不能隨便定義)

 AD掛載在 APB2外設上  ADC_Channel_13 通道13對應的GPIO接口PC3

  ADC時鍾頻率=90/4=22.5mhz

 

    // 采樣時間間隔
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;

 

    //配置 ADC 通道轉換順序為 1,第一個轉換,采樣時間為 56 個時鍾周期
 ADC_RegularChannelConfig ( Rheostat_ADC, Rheostat_ADC_CHANNEL, 1, ADC_SampleTime_56Cycles) ;

 

 

 

2020-03-0909:07:16

 

 

 

 

 

 

 

------------恢復內容結束------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM