標(biāo)題:
STM32F103多路ADC采集程序
[打印本頁]
作者:
thecoolstone
時(shí)間:
2018-4-1 01:42
標(biāo)題:
STM32F103多路ADC采集程序
三路ADC采集stm32源程序:
/**
@author Mei Jilin
@brief ADC1的配置完成3通道的數(shù)據(jù)采集
@attention
1 ----------- adc_config(); //配置adc
2 ----------- adc_start(); //啟動(dòng)adc,開始轉(zhuǎn)換
3 ----------- get_ChannelValue(ADC_Channel_x); //讀取相應(yīng)通道的adc值
**/
#include "stm32f10x.h"
#include "adc.h"
#define CH_NUM 3 //要使用的ADC通道數(shù)
static uint16_t ad_value[CH_NUM]={0};
/** @para none
* @ret none
* @brief adc對(duì)應(yīng)的gpio初始化
*/
void adc_gpio_init(void)
{
GPIO_InitTypeDef gpio;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
gpio.GPIO_Mode = GPIO_Mode_AIN; //配置為模擬輸入
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; //ADC1 --channel0,1,2
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpio);
}
/** @para none
* @ret none
* @brief adc配置
*/
void adc_init(void)
{
ADC_InitTypeDef adc;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設(shè)置ad時(shí)鐘為72/6=12M,ad最大時(shí)鐘頻率為14M
ADC_DeInit(ADC1);
adc.ADC_Mode = ADC_Mode_Independent; //工作在獨(dú)立模式
adc.ADC_ContinuousConvMode = ENABLE; //連續(xù)轉(zhuǎn)換模式
adc.ADC_DataAlign = ADC_DataAlign_Right; //數(shù)據(jù)右對(duì)齊
adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部觸發(fā)
adc.ADC_NbrOfChannel = CH_NUM ; //轉(zhuǎn)換3個(gè)通道
adc.ADC_ScanConvMode = ENABLE; //連續(xù)轉(zhuǎn)換模式
ADC_Init(ADC1,&adc);
//設(shè)定指定的ADC通道組,設(shè)置轉(zhuǎn)化順序和采樣時(shí)間
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
//開啟adc的DMA
ADC_DMACmd(ADC1,ENABLE);
//使能ADC1
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1); //重新校準(zhǔn)
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1)); //等待重新校準(zhǔn)完成
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1); //開始校準(zhǔn)
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1)); //等待校準(zhǔn)完成
}
/** @para none
* @ret none
* @brief 配置dma
*/
void adc_dma_init()
{
DMA_InitTypeDef dma;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel1);
dma.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR); //DMA對(duì)應(yīng)的外設(shè)基地址
dma.DMA_MemoryBaseAddr = (u32)&ad_value; //內(nèi)存存儲(chǔ)基地址
dma.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA的轉(zhuǎn)換模式為SRC模式,由外設(shè)搬移到內(nèi)存
dma.DMA_M2M = DMA_M2M_Disable; //M2M模式禁用
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定義外設(shè)數(shù)據(jù)寬度為16位
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移數(shù)據(jù)尺寸,HalfWord就是為16位
dma.DMA_BufferSize = CH_NUM; //DMA緩存大小CH_NUM個(gè)
dma.DMA_MemoryInc = DMA_MemoryInc_Enable; //接收一次數(shù)據(jù)后,目標(biāo)內(nèi)存地址后移
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次數(shù)據(jù)后,設(shè)備地址禁止后移
dma.DMA_Mode = DMA_Mode_Circular; //轉(zhuǎn)換模式,循環(huán)緩存模式。
dma.DMA_Priority = DMA_Priority_High; //DMA優(yōu)先級(jí)高
DMA_Init(DMA1_Channel1,&dma);
}
/** @para none
* @ret none
* @brief 完成adc配置
*/
void adc_config(void)
{
adc_gpio_init();
adc_dma_init();
adc_init();
}
/** @para none
* @ret none
* @brief 啟動(dòng)adc,開始轉(zhuǎn)換
*/
void adc_start(void)
{
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //連續(xù)轉(zhuǎn)換開始,ADC通過DMA方式不斷的更新RAM區(qū)。
DMA_Cmd(DMA1_Channel1,ENABLE);
}
/** @para ADC_Channel --- (ADC_Channel0 ~ ADC_Channel17)
* @ret ADC_Channel_x 的ADC值
*/
uint16_t get_ChannelVale(uint8_t ADC_Channel)
{
uint16_t ret = 0;
switch(ADC_Channel)
{
case ADC_Channel_0:
ret = ad_value[0];
break;
case ADC_Channel_1:
ret = ad_value[1];
break;
case ADC_Channel_2:
ret = ad_value[2];
break;
}
return ret;
}
復(fù)制代碼
所有資料51hei提供下載:
ADC_test.rar
(274.67 KB, 下載次數(shù): 411)
2018-4-5 04:19 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
hwasun
時(shí)間:
2019-1-25 22:20
不錯(cuò)不錯(cuò)!
作者:
scj123
時(shí)間:
2019-2-20 22:26
十分不錯(cuò).值得學(xué)習(xí)
作者:
glimmerhyy
時(shí)間:
2019-4-28 21:25
您好,我想請(qǐng)問一下怎么能看到最后ret的值?
作者:
1255364767
時(shí)間:
2019-5-15 14:00
很好的教程
作者:
1255364767
時(shí)間:
2019-5-15 14:00
不錯(cuò)的教程,值得學(xué)習(xí)
作者:
QEQWE123
時(shí)間:
2019-6-4 14:22
怎么顯示呢?
作者:
coolzhpfree
時(shí)間:
2019-6-7 15:47
非常不錯(cuò),值得借鑒
作者:
zengyao05
時(shí)間:
2019-7-31 17:40
參考一下看看
作者:
leifeng699
時(shí)間:
2019-8-13 19:25
程序不錯(cuò)不錯(cuò)
作者:
wulmg
時(shí)間:
2019-8-23 13:01
非常不錯(cuò),值得借鑒
作者:
wdm913
時(shí)間:
2020-2-23 16:38
剛好用這個(gè),樓主分享的完美,謝謝!
作者:
zcl777
時(shí)間:
2020-3-8 16:01
好東西,謝謝分享,下載下來看看
作者:
303579
時(shí)間:
2020-6-13 12:04
請(qǐng)問怎么看測(cè)到的值?
作者:
wpgdut
時(shí)間:
2020-6-14 17:54
謝謝分享!謝謝,很有用的資料。
作者:
wpgdut
時(shí)間:
2020-6-14 17:56
謝謝分享
作者:
Ganze
時(shí)間:
2020-6-15 11:02
學(xué)習(xí)學(xué)習(xí) 謝謝分享
作者:
thecoolstone
時(shí)間:
2021-3-4 17:47
glimmerhyy 發(fā)表于 2019-4-28 21:25
您好,我想請(qǐng)問一下怎么能看到最后ret的值?
在需要取值的地方,定義一個(gè)變量,調(diào)用uint16_t get_ChannelVale(uint8_t ADC_Channel)這個(gè)函數(shù),
如uint16 a;
a = get_ChannelVale(ADC_Channel_0);//a取到的值為通道0的AD值
作者:
南山
時(shí)間:
2022-9-15 21:38
能十路同時(shí)采集嗎?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1