久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12432|回復: 18
收起左側

STM32F103多路ADC采集程序

  [復制鏈接]
ID:300190 發表于 2018-4-1 01:42 | 顯示全部樓層 |閱讀模式
三路ADC采集stm32源程序:
  1. /**
  2.     @author                        Mei Jilin
  3.         @brief                    ADC1的配置完成3通道的數據采集
  4.     @attention
  5.        1 ----------- adc_config();                     //配置adc
  6.        2 ----------- adc_start();                      //啟動adc,開始轉換
  7.        3 ----------- get_ChannelValue(ADC_Channel_x);  //讀取相應通道的adc值
  8. **/
  9. #include "stm32f10x.h"
  10. #include "adc.h"
  11. #define CH_NUM  3           //要使用的ADC通道數

  12. static uint16_t ad_value[CH_NUM]={0};
  13. /** @para none
  14.   * @ret  none
  15.   * @brief adc對應的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);                       //設置ad時鐘為72/6=12M,ad最大時鐘頻率為14M
  35.    
  36.     ADC_DeInit(ADC1);
  37.     adc.ADC_Mode                = ADC_Mode_Independent;     //工作在獨立模式
  38.     adc.ADC_ContinuousConvMode  = ENABLE;                   //連續轉換模式
  39.     adc.ADC_DataAlign           = ADC_DataAlign_Right;      //數據右對齊
  40.     adc.ADC_ExternalTrigConv    = ADC_ExternalTrigConv_None;//不使用外部觸發
  41.     adc.ADC_NbrOfChannel        = CH_NUM ;                       //轉換3個通道
  42.     adc.ADC_ScanConvMode        = ENABLE;                   //連續轉換模式
  43.     ADC_Init(ADC1,&adc);
  44.     //設定指定的ADC通道組,設置轉化順序和采樣時間
  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對應的外設基地址
  72.     dma.DMA_MemoryBaseAddr      = (u32)&ad_value;       //內存存儲基地址
  73.     dma.DMA_DIR                 = DMA_DIR_PeripheralSRC;//DMA的轉換模式為SRC模式,由外設搬移到內存
  74.     dma.DMA_M2M                 = DMA_M2M_Disable;      //M2M模式禁用
  75.     dma.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_HalfWord;//定義外設數據寬度為16位
  76.     dma.DMA_MemoryDataSize      = DMA_MemoryDataSize_HalfWord;  //DMA搬移數據尺寸,HalfWord就是為16位   
  77.     dma.DMA_BufferSize          = CH_NUM;                       //DMA緩存大小CH_NUM個
  78.     dma.DMA_MemoryInc           = DMA_MemoryInc_Enable;         //接收一次數據后,目標內存地址后移
  79.     dma.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;    //接收一次數據后,設備地址禁止后移
  80.     dma.DMA_Mode                = DMA_Mode_Circular;            //轉換模式,循環緩存模式。
  81.     dma.DMA_Priority            = DMA_Priority_High;            //DMA優先級高
  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,開始轉換
  97.   */
  98. void adc_start(void)
  99. {
  100.     /* Start ADC1 Software Conversion */
  101.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //連續轉換開始,ADC通過DMA方式不斷的更新RAM區。
  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, 下載次數: 411)


回復

使用道具 舉報

ID:280272 發表于 2019-1-25 22:20 | 顯示全部樓層
不錯不錯!
回復

使用道具 舉報

ID:437392 發表于 2019-2-20 22:26 | 顯示全部樓層
十分不錯.值得學習
回復

使用道具 舉報

ID:523999 發表于 2019-4-28 21:25 | 顯示全部樓層
您好,我想請問一下怎么能看到最后ret的值?
回復

使用道具 舉報

ID:538806 發表于 2019-5-15 14:00 | 顯示全部樓層
很好的教程
回復

使用道具 舉報

ID:538806 發表于 2019-5-15 14:00 | 顯示全部樓層
不錯的教程,值得學習
回復

使用道具 舉報

ID:316613 發表于 2019-6-4 14:22 | 顯示全部樓層
怎么顯示呢?
回復

使用道具 舉報

ID:470746 發表于 2019-6-7 15:47 | 顯示全部樓層
非常不錯,值得借鑒
回復

使用道具 舉報

ID:182969 發表于 2019-7-31 17:40 | 顯示全部樓層
參考一下看看
回復

使用道具 舉報

ID:401854 發表于 2019-8-13 19:25 | 顯示全部樓層
程序不錯不錯
回復

使用道具 舉報

ID:203051 發表于 2019-8-23 13:01 | 顯示全部樓層

非常不錯,值得借鑒
回復

使用道具 舉報

ID:594340 發表于 2020-2-23 16:38 | 顯示全部樓層
剛好用這個,樓主分享的完美,謝謝!
回復

使用道具 舉報

ID:618469 發表于 2020-3-8 16:01 | 顯示全部樓層
好東西,謝謝分享,下載下來看看
回復

使用道具 舉報

ID:759611 發表于 2020-6-13 12:04 | 顯示全部樓層
請問怎么看測到的值?
回復

使用道具 舉報

ID:592257 發表于 2020-6-14 17:54 | 顯示全部樓層
謝謝分享!謝謝,很有用的資料。
回復

使用道具 舉報

ID:592257 發表于 2020-6-14 17:56 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:779688 發表于 2020-6-15 11:02 | 顯示全部樓層
學習學習 謝謝分享
回復

使用道具 舉報

ID:300190 發表于 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值
回復

使用道具 舉報

ID:137171 發表于 2022-9-15 21:38 來自觸屏版 | 顯示全部樓層
能十路同時采集嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 人人干天天干 | 91观看 | www.国产| 青青草社区 | 神马久久av | 男人天堂网址 | 国产一区二区三区在线 | 中文字幕国产高清 | 国产欧美视频一区二区三区 | 情侣酒店偷拍一区二区在线播放 | 国产精品久久欧美久久一区 | 亚洲天天干 | 伊色综合久久之综合久久 | www.一级片| 在线看片福利 | 6080yy精品一区二区三区 | 久热久| 欧美在线色视频 | 精品国产欧美在线 | 天天插天天操 | 久久国内 | 亚洲一区二区三区福利 | 精品久草 | 日本精品视频一区二区三区四区 | 欧美一区二区在线看 | 成人免费小视频 | 午夜免费视频 | 国产在线一区二区 | 亚洲一区二区三区在线 | 亚洲国产成人精品女人久久久野战 | 国产免费观看一级国产 | 日日夜夜天天干 | 日韩一区二区在线看 | 成人一区二区三区 | av一二三区| 日韩一区和二区 | 特黄毛片| 日本亚洲一区 | 一级免费毛片 | 日韩欧美亚洲 | 东方伊人免费在线观看 |