STM32_ADC多通道轉(zhuǎn)換實(shí)例.doc_第1頁
STM32_ADC多通道轉(zhuǎn)換實(shí)例.doc_第2頁
STM32_ADC多通道轉(zhuǎn)換實(shí)例.doc_第3頁
STM32_ADC多通道轉(zhuǎn)換實(shí)例.doc_第4頁
STM32_ADC多通道轉(zhuǎn)換實(shí)例.doc_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

STM32 ADC多通道轉(zhuǎn)換描述:用ADC連續(xù)采集11路模擬信號(hào),并由DMA傳輸?shù)絻?nèi)存。ADC配置為掃描并且連續(xù)轉(zhuǎn)換模式,ADC的時(shí)鐘配置為12MHZ。在每次轉(zhuǎn)換結(jié)束后,由DMA循環(huán)將轉(zhuǎn)換的數(shù)據(jù)傳輸?shù)絻?nèi)存中。ADC可以連續(xù)采集N次求平均值。最后通過串口傳輸出最后轉(zhuǎn)換的結(jié)果。程序如下:#include stm32f10x.h /這個(gè)頭文件包括STM32F10x所有外圍寄存器、位、內(nèi)存映射的定義#include eval.h /頭文件(包括串口、按鍵、LED的函數(shù)聲明)#include SysTickDelay.h #include UART_INTERFACE.h#include #define N 50 /每通道采50次#define M 12 /為12個(gè)通道vu16 AD_ValueNM; /用來存放ADC轉(zhuǎn)換結(jié)果,也是DMA的目標(biāo)地址vu16 After_filterM; /用來存放求平均值之后的結(jié)果int i;/*GPIO管腳的配置選用ADC的通道0 1 2 8 9 10 11 12 13 14 15,分別對(duì)應(yīng)的管腳為PA0 PA1 PA2 PB0 PB1 PC0 PC1 PC2 PC3 PC4 PC5串口使用USART1其中TX為PA9,RX為PA10 */void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;/* Configure USART1 Tx (PA.09) as alternate function push-pull */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /因?yàn)閁SART1管腳是以復(fù)用的形式接到GPIO口上的,所以使用復(fù)用推挽式輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure USART1 Rx (PA.10) as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/PA0/1/2 作為模擬通道輸入引腳 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;/模擬輸入引腳GPIO_Init(GPIOA, &GPIO_InitStructure);/PB0/1 作為模擬通道輸入引腳 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;/模擬輸入引腳GPIO_Init(GPIOB, &GPIO_InitStructure);/PC0/1/2/3/4/5 作為模擬通道輸入引腳 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;/模擬輸入引腳GPIO_Init(GPIOC, &GPIO_InitStructure);/*配置系統(tǒng)時(shí)鐘,使能各外設(shè)時(shí)鐘*/void RCC_Configuration(void) ErrorStatus HSEStartUpStatus; RCC_DeInit(); /RCC 系統(tǒng)復(fù)位 RCC_HSEConfig(RCC_HSE_ON); /開啟HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); /等待HSE準(zhǔn)備好 if(HSEStartUpStatus = SUCCESS) FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); /Enable Prefetch Buffer FLASH_SetLatency(FLASH_Latency_2); /Set 2 Latency cycles RCC_HCLKConfig(RCC_SYSCLK_Div1); /AHB clock = SYSCLK RCC_PCLK2Config(RCC_HCLK_Div1); /APB2 clock = HCLK RCC_PCLK1Config(RCC_HCLK_Div2); /APB1 clock = HCLK/2 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); /PLLCLK = 12MHz * 6 = 72 MHz RCC_PLLCmd(ENABLE); /Enable PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET); /Wait till PLL is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /Select PLL as system clock source while(RCC_GetSYSCLKSource() != 0x08); /Wait till PLL is used as system clock source /*使能各個(gè)外設(shè)時(shí)鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1, ENABLE ); /使能ADC1通道時(shí)鐘,各個(gè)管腳時(shí)鐘/* Configure ADCCLK such as ADCCLK = PCLK2/6 */ RCC_ADCCLKConfig(RCC_PCLK2_Div6); /72M/6=12,ADC最大時(shí)間不能超過14MRCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/使能DMA傳輸 /*配置ADC1*/void ADC1_Configuration(void) ADC_InitTypeDef ADC_InitStructure;ADC_DeInit(ADC1); /將外設(shè) ADC1 的全部寄存器重設(shè)為缺省值/* ADC1 configuration -*/ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;/ADC工作模式:ADC1和ADC2工作在獨(dú)立模式ADC_InitStructure.ADC_ScanConvMode =ENABLE;/模數(shù)轉(zhuǎn)換工作在掃描模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;/模數(shù)轉(zhuǎn)換工作在連續(xù)轉(zhuǎn)換模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;/外部觸發(fā)轉(zhuǎn)換關(guān)閉ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;/ADC數(shù)據(jù)右對(duì)齊ADC_InitStructure.ADC_NbrOfChannel = M;/順序進(jìn)行規(guī)則轉(zhuǎn)換的ADC通道的數(shù)目ADC_Init(ADC1, &ADC_InitStructure);/根據(jù)ADC_InitStruct中指定的參數(shù)初始化外設(shè)ADCx的寄存器/* ADC1 regular channel11 configuration */ /設(shè)置指定ADC的規(guī)則組通道,設(shè)置它們的轉(zhuǎn)化順序和采樣時(shí)間/ADC1,ADC通道x,規(guī)則采樣順序值為y,采樣時(shí)間為239.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 5, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 6, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 7, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 8, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 9, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 10, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 11, ADC_SampleTime_239Cycles5 );ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 12, ADC_SampleTime_239Cycles5 ); / 開啟ADC的DMA支持(要實(shí)現(xiàn)DMA功能,還需獨(dú)立配置DMA通道等參數(shù)) ADC_DMACmd(ADC1, ENABLE);/* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /使能指定的ADC1 /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); /復(fù)位指定的ADC1的校準(zhǔn)寄存器/* Check the end of ADC1 reset calibration register */while(ADC_GetResetCalibrationStatus(ADC1);/獲取ADC1復(fù)位校準(zhǔn)寄存器的狀態(tài),設(shè)置狀態(tài)則等待/* Start ADC1 calibaration */ADC_StartCalibration(ADC1);/開始指定ADC1的校準(zhǔn)狀態(tài)/* Check the end of ADC1 calibration */while(ADC_GetCalibrationStatus(ADC1);/獲取指定ADC1的校準(zhǔn)程序,設(shè)置狀態(tài)則等待/*配置DMA*/void DMA_Configuration(void)/* ADC1 DMA1 Channel Config */DMA_InitTypeDef DMA_InitStructure;DMA_DeInit(DMA1_Channel1); /將DMA的通道1寄存器重設(shè)為缺省值DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1-DR; /DMA外設(shè)ADC基地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; /DMA內(nèi)存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /內(nèi)存作為數(shù)據(jù)傳輸?shù)哪康牡谼MA_InitStructure.DMA_BufferSize = N*M; /DMA通道的DMA緩存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /外設(shè)地址寄存器不變DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /內(nèi)存地址寄存器遞增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /數(shù)據(jù)寬度為16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; /數(shù)據(jù)寬度為16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /工作在循環(huán)緩存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High; /DMA通道 x擁有高優(yōu)先級(jí) DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /DMA通道x沒有設(shè)置為內(nèi)存到內(nèi)存?zhèn)鬏擠MA_Init(DMA1_Channel1, &DMA_InitStructure); /根據(jù)DMA_InitStruct中指定的參數(shù)初始化DMA的通道/配置所有外設(shè)void Init_All_Periph(void)RCC_Configuration();GPIO_Configuration();ADC1_Configuration();DMA_Configuration();/USART1_Configuration();USART_Configuration(9600); /*獲取ADC的值,將二進(jìn)制換算為十進(jìn)制*/u16 GetVolt(u16 advalue) return (u16)(advalue * 330 / 4096); /求的結(jié)果擴(kuò)大了100倍,方便下面求出小數(shù) /*求平均值函數(shù)*/void filter(void) int sum = 0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論