欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32F103多路ADC采集程序
[打印本頁]
作者:
thecoolstone
時間:
2018-4-1 01:42
標題:
STM32F103多路ADC采集程序
三路ADC采集stm32源程序:
/**
@author Mei Jilin
@brief ADC1的配置完成3通道的數據采集
@attention
1 ----------- adc_config(); //配置adc
2 ----------- adc_start(); //啟動adc,開始轉換
3 ----------- get_ChannelValue(ADC_Channel_x); //讀取相應通道的adc值
**/
#include "stm32f10x.h"
#include "adc.h"
#define CH_NUM 3 //要使用的ADC通道數
static uint16_t ad_value[CH_NUM]={0};
/** @para none
* @ret none
* @brief adc對應的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); //設置ad時鐘為72/6=12M,ad最大時鐘頻率為14M
ADC_DeInit(ADC1);
adc.ADC_Mode = ADC_Mode_Independent; //工作在獨立模式
adc.ADC_ContinuousConvMode = ENABLE; //連續轉換模式
adc.ADC_DataAlign = ADC_DataAlign_Right; //數據右對齊
adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部觸發
adc.ADC_NbrOfChannel = CH_NUM ; //轉換3個通道
adc.ADC_ScanConvMode = ENABLE; //連續轉換模式
ADC_Init(ADC1,&adc);
//設定指定的ADC通道組,設置轉化順序和采樣時間
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); //重新校準
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1)); //等待重新校準完成
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1); //開始校準
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1)); //等待校準完成
}
/** @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對應的外設基地址
dma.DMA_MemoryBaseAddr = (u32)&ad_value; //內存存儲基地址
dma.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA的轉換模式為SRC模式,由外設搬移到內存
dma.DMA_M2M = DMA_M2M_Disable; //M2M模式禁用
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定義外設數據寬度為16位
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //DMA搬移數據尺寸,HalfWord就是為16位
dma.DMA_BufferSize = CH_NUM; //DMA緩存大小CH_NUM個
dma.DMA_MemoryInc = DMA_MemoryInc_Enable; //接收一次數據后,目標內存地址后移
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //接收一次數據后,設備地址禁止后移
dma.DMA_Mode = DMA_Mode_Circular; //轉換模式,循環緩存模式。
dma.DMA_Priority = DMA_Priority_High; //DMA優先級高
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 啟動adc,開始轉換
*/
void adc_start(void)
{
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //連續轉換開始,ADC通過DMA方式不斷的更新RAM區。
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;
}
復制代碼
所有資料51hei提供下載:
ADC_test.rar
(274.67 KB, 下載次數: 411)
2018-4-5 04:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
hwasun
時間:
2019-1-25 22:20
不錯不錯!
作者:
scj123
時間:
2019-2-20 22:26
十分不錯.值得學習
作者:
glimmerhyy
時間:
2019-4-28 21:25
您好,我想請問一下怎么能看到最后ret的值?
作者:
1255364767
時間:
2019-5-15 14:00
很好的教程
作者:
1255364767
時間:
2019-5-15 14:00
不錯的教程,值得學習
作者:
QEQWE123
時間:
2019-6-4 14:22
怎么顯示呢?
作者:
coolzhpfree
時間:
2019-6-7 15:47
非常不錯,值得借鑒
作者:
zengyao05
時間:
2019-7-31 17:40
參考一下看看
作者:
leifeng699
時間:
2019-8-13 19:25
程序不錯不錯
作者:
wulmg
時間:
2019-8-23 13:01
非常不錯,值得借鑒
作者:
wdm913
時間:
2020-2-23 16:38
剛好用這個,樓主分享的完美,謝謝!
作者:
zcl777
時間:
2020-3-8 16:01
好東西,謝謝分享,下載下來看看
作者:
303579
時間:
2020-6-13 12:04
請問怎么看測到的值?
作者:
wpgdut
時間:
2020-6-14 17:54
謝謝分享!謝謝,很有用的資料。
作者:
wpgdut
時間:
2020-6-14 17:56
謝謝分享
作者:
Ganze
時間:
2020-6-15 11:02
學習學習 謝謝分享
作者:
thecoolstone
時間:
2021-3-4 17:47
glimmerhyy 發表于 2019-4-28 21:25
您好,我想請問一下怎么能看到最后ret的值?
在需要取值的地方,定義一個變量,調用uint16_t get_ChannelVale(uint8_t ADC_Channel)這個函數,
如uint16 a;
a = get_ChannelVale(ADC_Channel_0);//a取到的值為通道0的AD值
作者:
南山
時間:
2022-9-15 21:38
能十路同時采集嗎?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1