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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 35299|回復: 13
打印 上一主題 下一主題
收起左側

STM32 ADC電壓采集代碼與原理講解

  [復制鏈接]
跳轉到指定樓層
樓主
秉火的STM32 ADC電壓采集的資料:




電壓輸入范圍
輸入電壓:VREF- ≤ VIN ≤ VREF+
決定輸入電壓的引腳:VREF-、 VREF+ 、 VDDA 、 VSSA
VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,
得到ADC 的輸入電壓范圍為: 0~3.3V。

超出0~3.3V的電壓怎么測?

ADC可以測量:-10V~10V  


根據基爾霍夫定律(KCL),節點流入的電流等于流出的電流
(Vint – Vout)/R2 + (3V3-Vout)/R1 = Vout / R3
Vout = (Vint + 10) /6  

R1 / R2 / R3 的值怎么確定?

每個ADC具有18個通道,其中外部通道16個


每個ADC具有18個通道,其中外部通道16個


外部的 16 個通道在轉換的時候又分為規則通道和注入通道,其中規則通道最多有 16路,注入通道最多有 4 路。那這兩個通道有什么區別?在什么時候使用?

規則通道:顧名思意,規則通道就是很規矩的意思,我們平時一般使用的就是這個通道。
注入通道:注入,可以理解為插入,插隊的意思,是一種不安分的通道。它是一種在規則通道轉換的時候強行插入要轉換的一種。這點跟中斷程序很像,都是不安分的主。所以,注入通道只有在規則通道存在時才會出現。



1、軟件觸發:ADC_CR2 :ADON/SWST ART/JSWSTART
2、外部事件觸發:內部定時器/外部IO
選擇:ADC_CR2 :EXTSEL[2:0]和 JEXTSEL[2:0]
激活:ADC_CR2 :EXTEN 和 JEXTEN

ADC_CLK:ADC模擬電路時鐘,最大值為14M,由PCLK2提供,還可分頻,2/4/6/8,RCC_CFGR 的 ADCPRE[1:0]設置。PCLK2=72M。
轉換時間:Tconv = 采樣時間 + 12.5 個周期
數字時鐘:RCC_APB2ENR,用于訪問寄存器

采樣時間:ADC 需要若干個 ADC_CLK 周期完成對輸入的模擬量迚行采樣,采樣的周期數可通過ADC 采樣時間寄存器
ADC_SMPR1 和 ADC_SMPR2 中的 SMPx[2:0]位設置,
ADC_SMPR2控制的是通道 0~9, ADC_SMPR1 控制的是通道 10~17。每個通道可以分別用不同的時間采樣。其中采樣周期最小是 1.5 個,即如果我們要達到最快的采樣,那么應該設置采樣周期為 31.5個周期,這里說的周期就是 1/ADC_CLK。

最短的轉換時間:Tconv = 采樣時間 + 12.5 個周期

PCLK2 = 72M,ADC_CLK = 72/6 = 12M
Tconv = 1.5+12.4 = 14周期 = 14/12us=1.17us

一切準備就緒后, ADC 轉換后的數據根據轉換組的不同,規則組的數據放在ADC_DR 寄存器,注入組的數據放在 JDRx。



1-16位有效,用于存放獨立模式轉換完成數據
2- ADC_CR2 :ALIGN
3-只有一個,多通道采集的是最好使用DMA



1-16位有效,用于存放注入通道轉換完成數據
2- ADC_CR2 :ALIGN
3-有4個這樣的寄存器



1-電壓輸入范圍為:0~3.3V
2-分辨率為12位
3-最小精度為:3.3/2^12
4-設數字量為X,則有模擬量 Y = (3.3 / 2^12)*X
怎么根據數據量算出模擬量

單片機源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * @file    main.c
  4.   * @author  fire
  5.   * @version V1.0
  6.   * @date    2013-xx-xx
  7.   * @brief   串口中斷接收測試

  8.   ******************************************************************************
  9.   */


  10. #include "stm32f10x.h"
  11. #include "bsp_usart.h"
  12. #include "bsp_adc.h"


  13. extern __IO uint16_t ADC_ConvertedValue[NOFCHANEL];

  14. // 局部變量,用于保存轉換計算后的電壓值         
  15. float ADC_ConvertedValueLocal[NOFCHANEL];        

  16. // 軟件延時
  17. void Delay(__IO uint32_t nCount)
  18. {
  19.   for(; nCount != 0; nCount--);
  20. }

  21. /**
  22.   * @brief  主函數
  23.   * @param  無
  24.   * @retval 無
  25.   */
  26. int main(void)
  27. {        
  28.   /*初始化USART 配置模式為 115200 8-N-1,中斷接收*/
  29.   USART_Config();
  30.         printf("歡迎使用秉火STM32開發板\n\n\n\n");
  31.         
  32.         ADCx_Init();

  33.         while (1)
  34.         {   
  35.                         ADC_ConvertedValueLocal[0] =(float) ADC_ConvertedValue[0]/4096*3.3;
  36.                         ADC_ConvertedValueLocal[1] =(float) ADC_ConvertedValue[1]/4096*3.3;
  37.                         ADC_ConvertedValueLocal[2] =(float) ADC_ConvertedValue[2]/4096*3.3;
  38.                         ADC_ConvertedValueLocal[3] =(float) ADC_ConvertedValue[3]/4096*3.3;
  39.                         ADC_ConvertedValueLocal[4] =(float) ADC_ConvertedValue[4]/4096*3.3;
  40.                         ADC_ConvertedValueLocal[5] =(float) ADC_ConvertedValue[5]/4096*3.3;
  41.                
  42.                         printf("\r\n CH0 value = %f V \r\n",ADC_ConvertedValueLocal[0]);
  43.                         printf("\r\n CH1 value = %f V \r\n",ADC_ConvertedValueLocal[1]);
  44.                         printf("\r\n CH2 value = %f V \r\n",ADC_ConvertedValueLocal[2]);
  45.                         printf("\r\n CH3 value = %f V \r\n",ADC_ConvertedValueLocal[3]);
  46.                         printf("\r\n CH4 value = %f V \r\n",ADC_ConvertedValueLocal[4]);
  47.                         printf("\r\n CH5 value = %f V \r\n",ADC_ConvertedValueLocal[5]);
  48.                
  49.                         printf("\r\n\r\n");
  50.                         Delay(0xffffee);                 
  51.         }
  52. }

  53. /*********************************************END OF FILE**********************/
復制代碼

  1. #include "bsp_adc.h"

  2. __IO uint16_t ADC_ConvertedValue[NOFCHANEL]={0,0,0,0,0,0};

  3. static void ADCx_GPIO_Config(void)
  4. {
  5.         GPIO_InitTypeDef GPIO_InitStructure;
  6.         
  7.         // 打開 ADC IO端口時鐘
  8.         ADC_GPIO_APBxClock_FUN ( ADC_GPIO_CLK, ENABLE );
  9.         
  10.         // 配置 ADC IO 引腳模式
  11.         GPIO_InitStructure.GPIO_Pin = ADC_PIN1;
  12.         GPIO_InitStructure.GPIO_Pin = ADC_PIN2;
  13.         GPIO_InitStructure.GPIO_Pin = ADC_PIN3;
  14.         GPIO_InitStructure.GPIO_Pin = ADC_PIN4;
  15.         GPIO_InitStructure.GPIO_Pin = ADC_PIN5;
  16.         GPIO_InitStructure.GPIO_Pin = ADC_PIN6;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  18.         
  19.         // 初始化 ADC IO
  20.         GPIO_Init(ADC_PORT, &GPIO_InitStructure);        
  21. }

  22. // ANSI C標準,C89 標準
  23. // C99
  24. // C11 2011

  25. static void ADCx_Mode_Config(void)
  26. {
  27.         DMA_InitTypeDef DMA_InitStructure;
  28.         RCC_AHBPeriphClockCmd(ADC_DMA_CLK, ENABLE);

  29.         DMA_DeInit(ADC_DMA_CHANNEL);
  30.         DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADC_x->DR ) );
  31.         DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;
  32.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  33.         DMA_InitStructure.DMA_BufferSize = NOFCHANEL;    // 改
  34.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  35.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  // 改
  36.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  37.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  38.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        
  39.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  40.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  41.         DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStructure);
  42.         DMA_Cmd(ADC_DMA_CHANNEL , ENABLE);
  43. /*----------------------------------------------------------------------*/
  44.         
  45.         ADC_InitTypeDef ADC_InitStruct;        
  46.         ADC_APBxClock_FUN ( ADC_CLK, ENABLE );
  47.         ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
  48.         ADC_InitStruct.ADC_ScanConvMode = ENABLE;        // 改
  49.         ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;        
  50.         ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  51.         ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
  52.         ADC_InitStruct.ADC_NbrOfChannel = NOFCHANEL;        
  53.         ADC_Init(ADC_x, &ADC_InitStruct);
  54.         
  55.         RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  56.         
  57.         ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL1, 1, ADC_SampleTime_55Cycles5);
  58.         ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL2, 2, ADC_SampleTime_55Cycles5);
  59.         ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL3, 3, ADC_SampleTime_55Cycles5);
  60.         ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL4, 4, ADC_SampleTime_55Cycles5);
  61.         ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL5, 5, ADC_SampleTime_55Cycles5);
  62.         ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL6, 6, ADC_SampleTime_55Cycles5);

  63.          // 使能ADC DMA 請求
  64.         ADC_DMACmd(ADC_x, ENABLE);

  65.         ADC_Cmd(ADC_x, ENABLE);        
  66.   // ADC開始校準
  67.         ADC_StartCalibration(ADC_x);
  68.         // 等待校準完成
  69.         while(ADC_GetCalibrationStatus(ADC_x));
  70.         
  71.         ADC_SoftwareStartConvCmd(ADC_x, ENABLE);
  72. }

  73. void ADCx_Init(void)
  74. {
  75.         ADCx_GPIO_Config();
  76.         ADCx_Mode_Config();
  77. }
復制代碼

全部資料51hei下載地址:
31-ADC—電壓采集.zip (6.15 MB, 下載次數: 520)


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

使用道具 舉報

沙發
ID:524338 發表于 2019-4-29 11:56 | 只看該作者
感謝樓主
回復

使用道具 舉報

板凳
ID:582442 發表于 2019-7-11 16:41 | 只看該作者
感謝分享
回復

使用道具 舉報

地板
ID:593904 發表于 2019-8-2 07:12 | 只看該作者
打包視頻教程
回復

使用道具 舉報

5#
ID:160995 發表于 2019-8-3 01:17 | 只看該作者
感謝分享
回復

使用道具 舉報

6#
ID:90212 發表于 2019-8-14 11:02 | 只看該作者
請教下樓主,我需要測0~60V電壓,F在分壓電阻只能用 (5.1k+5.1k)/470 ,不能用20K以上的電阻,否則測量15V以上就會出現明顯不等比例的現象
回復

使用道具 舉報

7#
ID:392569 發表于 2019-8-14 12:33 | 只看該作者
太詳細了
回復

使用道具 舉報

8#
ID:85865 發表于 2019-8-14 13:11 | 只看該作者
感謝分享
回復

使用道具 舉報

9#
ID:603929 發表于 2019-9-27 14:53 | 只看該作者
感謝分享
回復

使用道具 舉報

10#
ID:686610 發表于 2020-1-16 11:38 | 只看該作者
感謝樓主
回復

使用道具 舉報

11#
ID:142383 發表于 2020-2-20 08:24 | 只看該作者
感謝樓主分享,下載學習學習!
回復

使用道具 舉報

12#
ID:416535 發表于 2020-4-2 14:52 | 只看該作者
簡直變態的詳細,太詳細了,感謝分享!
回復

使用道具 舉報

13#
ID:146632 發表于 2021-3-19 15:16 | 只看該作者
extern __IO uint16_t ADC_ConvertedValue  為何報錯
回復

使用道具 舉報

14#
ID:64366 發表于 2021-3-27 14:49 | 只看該作者
感謝樓主  正在做相關的東西
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久91精品国产一区二区三区 | 99久久精品免费看国产高清 | 精品一区二区观看 | 99久久国产| 国产1区2区3区 | 国产精品无码专区在线观看 | 午夜精品一区二区三区三上悠亚 | 97人人澡人人爽91综合色 | 欧美日韩中文字幕在线播放 | 国产小视频在线 | 欧美色综合一区二区三区 | 日韩精品中文字幕在线 | 精品视频久久久 | 天天干精品 | 日韩av手机在线观看 | 亚洲欧美久久 | 亚洲三级在线 | 亚洲电影一区二区三区 | 一区二区三区四区不卡 | 精品视频一区二区三区在线观看 | 欧美日韩一区在线播放 | 欧美精品一区二区三区四区 在线 | 在线中文字幕日韩 | av超碰| 国产免费av网| 国产精品成人av | 日韩不卡一二区 | 成人国产免费视频 | 欧美日韩视频 | 韩国精品一区 | 九九国产在线观看 | 国产精品中文字幕一区二区三区 | 狠狠躁夜夜躁人人爽天天高潮 | 黄色成人亚洲 | 欧美色综合一区二区三区 | 亚洲美女网站 | 日韩av在线免费 | 九七午夜剧场福利写真 | 欧美成人一区二区三区 | 亚洲精品一区二区三区丝袜 | 精品一区二区三区免费毛片 |