如何實現STM32F407單片機的ADC轉換

2020-11-26 電子發燒友

用到的引腳是PA3也就是ADC1的通道3

1、ADC的主要參數

a、解析度----stm32f407的解析度有6位、8位、10位、12位,參考電壓如果是3.3 那麼最小解析度就是3.3/4095。

b、轉換時間----stm32f407的最高允許頻率是36M,最快轉換時間 = 3+12個周期 =0.71us。

c、參考電壓----2.4至3.3v。

2、工作過程分析

ADC轉換是把外面輸入到引腳的電壓值轉換成數位訊號,單片機裡面有一個模擬至數字的轉換模塊,我們可以控制它採集引腳的電壓,stm32F407可以利用void ADC_SoftwareStartConv(ADC_TypeDef* ADCx)這個函數來控制轉換。

3、詳細的步驟

一、開啟時鐘 設置埠IO

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC1時鐘

/*埠設置為模擬輸入*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;/*模擬輸入*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;/*通道3*/

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;/*-不帶上下拉*/

GPIO_Init(GPIOA,&GPIO_InitStructure);/*初始化*/

上面主要是設置了GPIOA 和ADC1的時鐘,並且把PA3設置為模擬輸入。

二、設置通用控制寄存器

ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;/*DMA失能*/

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;/*獨立模式*/

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;/*設置ADC的頻率為APB2/4 即84/4=21M*/

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;/*採樣間隔時間*/

ADC_CommonInit(&ADC_CommonInitStructure);/*初始化*/

三、ADC的初始化

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;/*12位模式*/

ADC_InitStructure.ADC_ScanConvMode = DISABLE;/*非掃描模式*/

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;/*關閉連續轉換*/

ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;/*禁止觸發檢測 使用軟體觸發*/

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/*右對齊*/

ADC_InitStructure.ADC_NbrOfConversion = 1;/*只使用1通道 規則通為1*/

ADC_Init(ADC1,&ADC_InitStructure);/*初始化*/

ADC_Cmd(ADC1,ENABLE);/*開啟ADC*/

到這裡ADC的設置基本完成現在就可以讀取ADC的值。

四、讀取ADC的值

uint16_t bsp_GetAdc(void)

{

ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_480Cycles);/*設置規則通道3 一個序列 採樣時間 */

ADC_SoftwareStartConv(ADC1);/*啟動軟體轉換*/

while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));/*等待轉換結束*/

return ADC_GetConversionValue(ADC1);/*讀取轉換結果*/

}

這樣我們就可以讀取ADC的值了,其中我們每次讀取的時候都要重新啟動ADC的轉換,轉換完成就可以讀取。

下面是完整的程序

/****************************************************************************************

*函 數 名:bsp_InitAdc

*函數功能:ADC1的初始化

*形 參:無

*返 回 值:無

*****************************************************************************************/

void bsp_InitAdc(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

ADC_CommonInitTypeDef ADC_CommonInitStructure;

ADC_InitTypeDef ADC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能ADC時鐘

/*初始化ADC1通道3 的IO口*/

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;/*模擬輸入*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;/*通道5*/

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;/*不帶上下拉*/

GPIO_Init(GPIOA,&GPIO_InitStructure);/*初始化*/

/*通用控制寄存器的配置*/

ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;/*DMA失能*/

ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;/*獨立模式*/

ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;/*APB2的4分頻 即84/4=21M*/

ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;/*兩個採樣階段的延時5個時鐘*/

ADC_CommonInit(&ADC_CommonInitStructure);/*初始化*/

/*初始化ADC1*/

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;/*12位模式*/

ADC_InitStructure.ADC_ScanConvMode = DISABLE;/*非掃描模式*/

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;/*關閉連續轉換*/

ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;/*禁止觸發檢測 使用軟體觸發*/

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/*右對齊*/

ADC_InitStructure.ADC_NbrOfConversion = 1;/*只使用1通道 規則通為1*/

ADC_Init(ADC1,&ADC_InitStructure);/*初始化*/

ADC_Cmd(ADC1,ENABLE);/*開啟ADC*/

}

/****************************************************************************************

*函 數 名:bsp_GetAdc

*函數功能:讀取通道3的值

*形 參:無

*返 回 值:ADC的數字值

*****************************************************************************************/

uint16_t bsp_GetAdc(void)

{

ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_480Cycles);/*設置規則通道3 一個序列 採樣時間 */

ADC_SoftwareStartConv(ADC1);/*啟動軟體轉換*/

while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));/*等待轉換結束*/

return ADC_GetConversionValue(ADC1);/*讀取轉換結果*/

}

/****************************************************************************************

*函 數 名:bsp_GetAdcValue

*函數功能:讀取通道3的值

*形 參:num轉換次數

*返 回 值:ADC的數字值

*****************************************************************************************/

uint16_t bsp_GetAdcValue(uint8_t num)

{

uint16_t temp = 0;

uint16_t t;

for(t = 0;t 《 num;t++)

{

temp +=bsp_GetAdc();/*求平均值*/

}

return temp/num;

}

/*

*********************************************************************************************************

* 函 數 名: main

* 功能說明: c程序入口

* 形 參:無

* 返 回 值: 錯誤代碼(無需處理)

*********************************************************************************************************

*/

int main(void)

{

/*

ST固件庫中的啟動文件已經執行了 SystemInit() 函數,該函數在 system_stm32f4xx.c 文件,主要功能是

配置CPU系統的時鐘,內部Flash訪問時序,配置FSMC用於外部SRAM

*/

bsp_Init();//在這裡對ADC1進行了初始化及其它相關的初始化

/* 進入主程序循環體 */

while (1)

{

printf(「%d 」, bsp_GetAdcValue(10));

bsp_DelayMS(1000);

}

}

通過串口我們可以看到數據的變化。

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • stm32f407之高級定時器 死區互補PWM(操作寄存器)
    lt;15;    // 剎車使能位置1,開啟所有輸出通道  TIM1->BDTR|=0xCD;     // 死區時間設定  TIM1->CR1 |= 1; //開始計時  while(1)  {  };} 關鍵字:stm32f407
  • STM32F1與STM32F0在GPIO_TypeDef 寄存器方面的不同
    有需要的同學可以參考一下,代碼如下:#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)/* #define SYSCLK_FREQ_HSE    HSE_VALUE */ #define SYSCLK_FREQ_24MHz  24000000#else/* #define SYSCLK_FREQ_HSE
  • STM8S單片機入門2(關機模式開關機按鈕)
    如果使用機械式開關(2段撥動開關,自鎖開關等)等直接接通和切斷電源,不說機械部件的可靠性,至少自動關機(一般在長時間不操作、電池電量低時需要自動關機)功能就比較難實現。所以電池供電系統一般採用按鈕開關,用一個按鈕配合軟體實現按一次開機、再按一次關機的功能及自動關機的功能。
  • 使用國產單片機是什麼體驗?(文末申請開發板測評)
    伴隨著濃濃的中國芯熱情下,國產晶片越來越好了,國產單片機也逐漸成為工程師的優選。 那麼用國產單片機開發究竟是怎樣的體驗? 1、利用東軟載波開發板進行ADC及PWM調光測試 ES32F0654LT集成的支持 1 路模數轉換器(ADC0)。ADC(Analog to Digital Convertor)是 12 位解析度的逐次逼近型模數轉換器。它具有多達 19 個復用通道,可測量從管腳輸入的 16 個外部信號、3 個內部信號。這些通道的模數轉換可在單次、連續、掃描或不連續採樣模式下進行。ADC 的結果存儲在一個左對齊或右對齊的 16 位數據寄存器中。
  • stm32f103c8t6封裝及最小系統原理圖
    打開APP stm32f103c8t6封裝及最小系統原理圖 發表於 2017-11-23 15:50:30   STM32F103C8T6是一款集成電路,芯體尺寸為32位,程序存儲器容量是64KB,需要電壓2V~3.6V,工作溫度為-40°C ~ 85°C。
  • Cortex―M0單片機二-十進位整數轉換的快速算法
    摘要:為了提高Cortex—M0系列單片機應用系統的二進位到十進位BCD碼整數轉換代碼的執行效率,採用除十求餘數法來實現。該快速算法的核心內容是通過高效的彙編語言來實現常數除法,無論在程序代碼的運行時間和存儲空間上,都遠勝於sprintf函數。
  • 算好ADC阻抗,好精確測量電阻
    2、介紹用本板卡最終實現了什麼功能及各功能對應的主要代碼片段: 這是較為準確地測量10-1MOhm的電阻的代碼。   uint32_t R_REF = 9950;uint32_t R_ADC = 332520;uint32_t measure(){uint32_t Rx;adc_status_t status;uint32_t ADCMiddleSum = 0;uint16_t ADCMiddle;for (int i =0;i<32;i++){ R_ADC_ScanStart
  • STM32CubeMX升級至V5.2.0,STM32G4即將推出,STM32CubeIDE正式面世
    官網網址: www.st.com/stm32cubemx升級,下面重點講講STM32CubeIDE這個集成開發工具。 2STM32CubeIDE第一版 今天,學習STM32的人,大不多都應該聽說了這個STM32CubeIDE工具。
  • 算好ADC阻抗,好精確測量電阻——Funpack第三期分享之一
    2、介紹用本板卡最終實現了什麼功能及各功能對應的主要代碼片段: 這是較為準確地測量10-1MOhm的電阻的代碼。 uint32_t R_REF = 9950;uint32_t R_ADC = 332520;uint32_t measure(){uint32_t Rx;adc_status_t status;uint32_t ADCMiddleSum = 0;uint16_t ADCMiddle;for (int i =0;i<32;i++){ R_ADC_ScanStart
  • STM32F30x ADC 採樣的傅立葉變換示例
    前言本文目的是演示如何使用STM32F30x 內部的DSP 進行浮點快速傅立葉變換(FFT),為聯繫實際應用,使用ADC 對波形發生器進行ADC 採樣,然後對ADC 採樣結果進行會使用到ARMDSP 庫文件,以及STM32F30x 的浮點運算單元以及DSP指令等。模擬ADC採樣數據實現FFT使用Matlab生成AM調製波形波形公式為:AM_50= sin(2πfc)*(1+50%*sin(2πfm)), 其中fc 為載波頻率,fm 為調製波頻率,調製比50%。
  • 正點原子-戰艦V3第四章 STM32F1 基礎知識入門
    4.2 STM32F1 系統架構STM32 的系統架構比 51 單片機就要強大很多了。STM32F103的時鐘系統比較複雜,不像簡單的51單片機一個系統時鐘就可以解決一切。於是有人要問,採用一個系統時鐘不是很簡單嗎?為什麼 STM32 要有多個時鐘源呢?
  • adc0832工作原理詳解_引腳圖及功能_內部結構及應用電路
    美國國家半導體公司生產的ADC0832是廣泛應用的8 位解析度、雙通道A/D轉換晶片。ADC0832是雙通道輸入,並且可以軟體配置成單端或差分輸入,其串行輸出可以方便的和標準的移位寄存器及微處理器接口。 由於它體積小,兼容性,性價比高而深受單片機愛好者及企業歡迎,其目前已經有很高的普及率。
  • 單片機進位轉換
    十 ----> 八  10進位數轉換成8進位的方法,和轉換為2進位的方法類似,惟一變化:除數由2變成8。   來看一個例子,如何將十進位數120轉換成八進位數。  假設有一個十六進數 2AF5, 那麼如何換算成10進位呢?
  • 51單片機整數二一十進位轉換的快速算法
    算法的關鍵是充分利用89C51單片機的兩條特殊指令――單字節乘和單字節除。其耗費時間不及使用sprintf()函數的1/10。關鍵詞 89C5l 單片機二一十進位轉換快速算法 89C5l系列單片機歷經20多年的發展,仍然長盛不衰,在工業控制及儀器儀表中得到廣泛應用;用於89C5l單片機軟體開發的Keil C51編譯系統也日臻成熟,成為89C5l系列單片機軟體開發的優先選擇。
  • ADC的各種指標如何理解?如何提高ADC轉換精度?
    在此我們簡要總結一下ADC的各種指標如何理解,以及從硬體到軟體都有哪些可以採用的手段來提高ADC的轉換精度。理想情況下輸入電壓每增長1LSB(714mV),那麼輸出會向上跳變一次,對應虛線L1所在轉換曲線。但實際電路往往會引入偏差,轉換曲線往往如 L2 所對應曲線。失調誤差(Offset Error)電壓從0開始增大時,引起輸出第一次跳變的電壓值,與理論上應該引起第一次跳變的電壓值(0.5 LSB)的差值。衡量小電壓時的轉換精度。
  • avr單片機和stm32區別與優缺點分析
    摘要:avr單片機和stm32單片機是目前使用較廣泛的單片機,那麼avr單片機和stm32單片機有什麼區別呢?有什麼優劣勢呢?   avr單片機特點:   1. avr系列沒有類似累加器A的結構,它主要是通過R16~R31寄存器來實現A的功能。
  • 51單片機精確控制步進電機(有TB6600驅動)
    51單片機控制模擬交通信號燈 採用單片機的I/O口PO口通過上拉電阻和交通燈相連接,P3.0、P3.1口接到數碼管控制位上,控制數碼管的顯示,程序放在STC89C52RC單片機的ROM中,在十字路口的四組紅、黃、綠交通燈中,由單片機的
  • 使用單片機實現數字溫度計設計的資料詳細說明
    使用單片機實現數字溫度計設計的資料詳細說明 89s51 發表於 2020-04-06 13:04:00 1.溫度傳感器AD590基本知識 AD590產生的電流與絕對溫度成正比
  • STM8 STM32 數據類型
    這些數據類型可以在    STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h中找到具體的定義。▲ 數據類型和IO類型限定詞   Cortex-Mx HAL使用標準ANSI C頭文件定義的標準類型。