找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12447|回復: 18
打印 上一主題 下一主題
收起左側(cè)

STM32F103多路ADC采集程序

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:300190 發(fā)表于 2018-4-1 01:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
三路ADC采集stm32源程序:
  1. /**
  2.     @author                        Mei Jilin
  3.         @brief                    ADC1的配置完成3通道的數(shù)據(jù)采集
  4.     @attention
  5.        1 ----------- adc_config();                     //配置adc
  6.        2 ----------- adc_start();                      //啟動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對應(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時鐘為72/6=12M,ad最大時鐘頻率為14M
  35.    
  36.     ADC_DeInit(ADC1);
  37.     adc.ADC_Mode                = ADC_Mode_Independent;     //工作在獨立模式
  38.     adc.ADC_ContinuousConvMode  = ENABLE;                   //連續(xù)轉(zhuǎn)換模式
  39.     adc.ADC_DataAlign           = ADC_DataAlign_Right;      //數(shù)據(jù)右對齊
  40.     adc.ADC_ExternalTrigConv    = ADC_ExternalTrigConv_None;//不使用外部觸發(fā)
  41.     adc.ADC_NbrOfChannel        = CH_NUM ;                       //轉(zhuǎn)換3個通道
  42.     adc.ADC_ScanConvMode        = ENABLE;                   //連續(xù)轉(zhuǎn)換模式
  43.     ADC_Init(ADC1,&adc);
  44.     //設(shè)定指定的ADC通道組,設(shè)置轉(zhuǎn)化順序和采樣時間
  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);          //重新校準
  54.     /* Check the end of ADC1 reset calibration register */
  55.     while(ADC_GetResetCalibrationStatus(ADC1));  //等待重新校準完成
  56.     /* Start ADC1 calibaration */
  57.     ADC_StartCalibration(ADC1);                //開始校準
  58.     /* Check the end of ADC1 calibration */
  59.     while(ADC_GetCalibrationStatus(ADC1));           //等待校準完成

  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對應(yīng)的外設(shè)基地址
  72.     dma.DMA_MemoryBaseAddr      = (u32)&ad_value;       //內(nèi)存存儲基地址
  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個
  78.     dma.DMA_MemoryInc           = DMA_MemoryInc_Enable;         //接收一次數(shù)據(jù)后,目標內(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)先級高
  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 啟動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. }
復制代碼

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


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發(fā)
ID:280272 發(fā)表于 2019-1-25 22:20 | 只看該作者
不錯不錯!
回復

使用道具 舉報

板凳
ID:437392 發(fā)表于 2019-2-20 22:26 | 只看該作者
十分不錯.值得學習
回復

使用道具 舉報

地板
ID:523999 發(fā)表于 2019-4-28 21:25 | 只看該作者
您好,我想請問一下怎么能看到最后ret的值?
回復

使用道具 舉報

5#
ID:538806 發(fā)表于 2019-5-15 14:00 | 只看該作者
很好的教程
回復

使用道具 舉報

6#
ID:538806 發(fā)表于 2019-5-15 14:00 | 只看該作者
不錯的教程,值得學習
回復

使用道具 舉報

7#
ID:316613 發(fā)表于 2019-6-4 14:22 | 只看該作者
怎么顯示呢?
回復

使用道具 舉報

8#
ID:470746 發(fā)表于 2019-6-7 15:47 | 只看該作者
非常不錯,值得借鑒
回復

使用道具 舉報

9#
ID:182969 發(fā)表于 2019-7-31 17:40 | 只看該作者
參考一下看看
回復

使用道具 舉報

10#
ID:401854 發(fā)表于 2019-8-13 19:25 | 只看該作者
程序不錯不錯
回復

使用道具 舉報

11#
ID:203051 發(fā)表于 2019-8-23 13:01 | 只看該作者

非常不錯,值得借鑒
回復

使用道具 舉報

12#
ID:594340 發(fā)表于 2020-2-23 16:38 | 只看該作者
剛好用這個,樓主分享的完美,謝謝!
回復

使用道具 舉報

13#
ID:618469 發(fā)表于 2020-3-8 16:01 | 只看該作者
好東西,謝謝分享,下載下來看看
回復

使用道具 舉報

14#
ID:759611 發(fā)表于 2020-6-13 12:04 | 只看該作者
請問怎么看測到的值?
回復

使用道具 舉報

15#
ID:592257 發(fā)表于 2020-6-14 17:54 | 只看該作者
謝謝分享!謝謝,很有用的資料。
回復

使用道具 舉報

16#
ID:592257 發(fā)表于 2020-6-14 17:56 | 只看該作者
謝謝分享
回復

使用道具 舉報

17#
ID:779688 發(fā)表于 2020-6-15 11:02 | 只看該作者
學習學習 謝謝分享
回復

使用道具 舉報

18#
ID:300190 發(fā)表于 2021-3-4 17:47 | 只看該作者
glimmerhyy 發(fā)表于 2019-4-28 21:25
您好,我想請問一下怎么能看到最后ret的值?

在需要取值的地方,定義一個變量,調(diào)用uint16_t get_ChannelVale(uint8_t ADC_Channel)這個函數(shù),
如uint16 a;
a = get_ChannelVale(ADC_Channel_0);//a取到的值為通道0的AD值
回復

使用道具 舉報

19#
ID:137171 發(fā)表于 2022-9-15 21:38 來自觸屏版 | 只看該作者
能十路同時采集嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表