------------恢復內容開始------------
硬件原理圖 ,滑動電位器與芯片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
------------恢復內容結束------------