標(biāo)題: STM32F103多路ADC采集程序 [打印本頁]

作者: thecoolstone    時(shí)間: 2018-4-1 01:42
標(biāo)題: STM32F103多路ADC采集程序
三路ADC采集stm32源程序:
  1. /**
  2.     @author                        Mei Jilin
  3.         @brief                    ADC1的配置完成3通道的數(shù)據(jù)采集
  4.     @attention
  5.        1 ----------- adc_config();                     //配置adc
  6.        2 ----------- adc_start();                      //啟動(dòng)adc,開始轉(zhuǎn)換
  7.        3 ----------- get_ChannelValue(ADC_Channel_x);  //讀取相應(yīng)通道的adc值
  8. **/
  9. #include "stm32f10x.h"
  10. #include "adc.h"
  11. #define CH_NUM  3           //要使用的ADC通道數(shù)

  12. static uint16_t ad_value[CH_NUM]={0};
  13. /** @para none
  14.   * @ret  none
  15.   * @brief adc對(duì)應(yīng)的gpio初始化
  16.   */
  17. void adc_gpio_init(void)
  18. {
  19.     GPIO_InitTypeDef gpio;
  20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  21.     gpio.GPIO_Mode = GPIO_Mode_AIN;                         //配置為模擬輸入
  22.     gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;   //ADC1 --channel0,1,2
  23.     gpio.GPIO_Speed = GPIO_Speed_50MHz;
  24.     GPIO_Init(GPIOA,&gpio);
  25. }
  26. /** @para none
  27.   * @ret  none
  28.   * @brief adc配置
  29.   */
  30. void adc_init(void)
  31. {
  32.     ADC_InitTypeDef adc;
  33.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  34.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);                       //設(shè)置ad時(shí)鐘為72/6=12M,ad最大時(shí)鐘頻率為14M
  35.    
  36.     ADC_DeInit(ADC1);
  37.     adc.ADC_Mode                = ADC_Mode_Independent;     //工作在獨(dú)立模式
  38.     adc.ADC_ContinuousConvMode  = ENABLE;                   //連續(xù)轉(zhuǎn)換模式
  39.     adc.ADC_DataAlign           = ADC_DataAlign_Right;      //數(shù)據(jù)右對(duì)齊
  40.     adc.ADC_ExternalTrigConv    = ADC_ExternalTrigConv_None;//不使用外部觸發(fā)
  41.     adc.ADC_NbrOfChannel        = CH_NUM ;                       //轉(zhuǎn)換3個(gè)通道
  42.     adc.ADC_ScanConvMode        = ENABLE;                   //連續(xù)轉(zhuǎn)換模式
  43.     ADC_Init(ADC1,&adc);
  44.     //設(shè)定指定的ADC通道組,設(shè)置轉(zhuǎn)化順序和采樣時(shí)間
  45.     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
  46.     ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
  47.     ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
  48.     //開啟adc的DMA
  49.     ADC_DMACmd(ADC1,ENABLE);
  50.     //使能ADC1
  51.     ADC_Cmd(ADC1, ENABLE);
  52.     /* Enable ADC1 reset calibaration register */   
  53.     ADC_ResetCalibration(ADC1);          //重新校準(zhǔn)
  54.     /* Check the end of ADC1 reset calibration register */
  55.     while(ADC_GetResetCalibrationStatus(ADC1));  //等待重新校準(zhǔn)完成
  56.     /* Start ADC1 calibaration */
  57.     ADC_StartCalibration(ADC1);                //開始校準(zhǔn)
  58.     /* Check the end of ADC1 calibration */
  59.     while(ADC_GetCalibrationStatus(ADC1));           //等待校準(zhǔn)完成

  60. }
  61. /** @para none
  62.   * @ret  none
  63.   * @brief 配置dma
  64.   */
  65. void adc_dma_init()
  66. {
  67.     DMA_InitTypeDef dma;
  68.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  69.    
  70.     DMA_DeInit(DMA1_Channel1);
  71.     dma.DMA_PeripheralBaseAddr  = (u32)&(ADC1->DR);     //DMA對(duì)應(yīng)的外設(shè)基地址
  72.     dma.DMA_MemoryBaseAddr      = (u32)&ad_value;       //內(nèi)存存儲(chǔ)基地址
  73.     dma.DMA_DIR                 = DMA_DIR_PeripheralSRC;//DMA的轉(zhuǎn)換模式為SRC模式,由外設(shè)搬移到內(nèi)存
  74.     dma.DMA_M2M                 = DMA_M2M_Disable;      //M2M模式禁用
  75.     dma.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_HalfWord;//定義外設(shè)數(shù)據(jù)寬度為16位
  76.     dma.DMA_MemoryDataSize      = DMA_MemoryDataSize_HalfWord;  //DMA搬移數(shù)據(jù)尺寸,HalfWord就是為16位   
  77.     dma.DMA_BufferSize          = CH_NUM;                       //DMA緩存大小CH_NUM個(gè)
  78.     dma.DMA_MemoryInc           = DMA_MemoryInc_Enable;         //接收一次數(shù)據(jù)后,目標(biāo)內(nèi)存地址后移
  79.     dma.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    //接收一次數(shù)據(jù)后,設(shè)備地址禁止后移
  80.     dma.DMA_Mode                = DMA_Mode_Circular;            //轉(zhuǎn)換模式,循環(huán)緩存模式。
  81.     dma.DMA_Priority            = DMA_Priority_High;            //DMA優(yōu)先級(jí)高
  82.     DMA_Init(DMA1_Channel1,&dma);
  83. }
  84. /** @para none
  85.   * @ret  none
  86.   * @brief 完成adc配置
  87.   */
  88. void adc_config(void)
  89. {
  90.     adc_gpio_init();
  91.     adc_dma_init();
  92.     adc_init();
  93. }
  94. /** @para none
  95.   * @ret  none
  96.   * @brief 啟動(dòng)adc,開始轉(zhuǎn)換
  97.   */
  98. void adc_start(void)
  99. {
  100.     /* Start ADC1 Software Conversion */
  101.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //連續(xù)轉(zhuǎn)換開始,ADC通過DMA方式不斷的更新RAM區(qū)。
  102.     DMA_Cmd(DMA1_Channel1,ENABLE);   
  103. }

  104. /** @para ADC_Channel --- (ADC_Channel0 ~ ADC_Channel17)
  105.   * @ret  ADC_Channel_x 的ADC值
  106.   */
  107. uint16_t get_ChannelVale(uint8_t ADC_Channel)
  108. {
  109.     uint16_t ret = 0;
  110.     switch(ADC_Channel)
  111.     {
  112.         case ADC_Channel_0:
  113.             ret = ad_value[0];
  114.             break;
  115.         case ADC_Channel_1:
  116.             ret = ad_value[1];
  117.             break;
  118.         case ADC_Channel_2:
  119.             ret = ad_value[2];
  120.             break;
  121.     }
  122.     return ret;
  123. }
復(fù)制代碼

所有資料51hei提供下載:
ADC_test.rar (274.67 KB, 下載次數(shù): 411)



作者: 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