ADC实验

原理图:

1.ADC配置函数

/* enable adc1 and config adc1 to dma mode */
ADC1_Init();

  1. /**
  2. * @brief ADC1初始化
  3. * @param 无
  4. * @retval 无
  5. */
  6. void ADC1_Init(void)
  7. {
  8. ADC1_GPIO_Config();    //端口初始化
  9. ADC1_Mode_Config();
  10. }

 对于配置ADC1的工作模式为MDA模式

ADC1是挂载到DMA1的通道1的

#define ADC1_DR_Address    ((u32)0x40012400+0x4c)//模拟量转换成数字量后存放到该地址中

看如下存储器映像 寄存器组起始地址(起始地址)

便宜地址:0x4c

----------------------------------------------------------------------------------------------------------------------

那么对于ADC自身配置:

采样总时间:

对于STM32最快的ADC转换时间也就是1US了,打死都不会变的了

-----------------------------------------------------------------------------------------------------------------------

代码:

  1. /**
  2. * @brief 配置ADC1的工作模式为MDA模式
  3. * @param 无
  4. * @retval 无
  5. */
  6. static void ADC1_Mode_Config(void)
  7. {
  8. DMA_InitTypeDef DMA_InitStructure;
  9. ADC_InitTypeDef ADC_InitStructure;
  10.  
  11. /* DMA channel1 configuration */
  12. DMA_DeInit(DMA1_Channel1);//重新配置
  13.  
  14. DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址
  15. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //内存地址
  16. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //方向从#define DMA_DIR_PeripheralSRC
  17.                                     //((uint32_t)0x00000000)开始发
  18. DMA_InitStructure.DMA_BufferSize = ;     //每次只发送一个数据
  19. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定
  20. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; //内存地址固定
  21. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字
  22. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  23. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环传输
  24. DMA_InitStructure.DMA_Priority = DMA_Priority_High;              //优先级(有三个)
  25. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  26. DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  27.  
  28. /* Enable DMA channel1 */
  29. DMA_Cmd(DMA1_Channel1, ENABLE);
  30.  
  31. /* ADC1 configuration */
  32. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式(因为咱们只用一个)
  33. ADC_InitStructure.ADC_ScanConvMode = DISABLE ; //禁止扫描模式,扫描模式用于多通道采集
  34.                               //(ADC有3个通道,若几个通道同时采集一个模拟量则用扫描)
  35.                           //若同时采(交叉采集),速率更高,对于32的示波器就是三路同时采集   
  36. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //开启连续转换模式,即不停地进行ADC转换
  37. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使用外部触发转换
  38. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  39.                         //采集数据右对齐,数据时12位,保存数据的寄存器是16位
  40. ADC_InitStructure.ADC_NbrOfChannel = ; //要转换的通道数目1
  41. ADC_Init(ADC1, &ADC_InitStructure);
  42.  
  43. /*配置ADC时钟,为PCLK2的8分频,即9MHz(最大是14M)68/9MS*/
  44. RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  45. /*配置ADC1的通道11为55.5个采样周期(模拟量转换成数字量需要多长时间),
  46.      序列为1(有三个通道它排第一) */
  47. ADC_RegularChannelConfig(ADC1, ADC_Channel_11, , ADC_SampleTime_55Cycles5);
  48.  
  49. /* Enable ADC1 DMA */
  50. ADC_DMACmd(ADC1, ENABLE);
  51.  
  52. /* Enable ADC1 */
  53. ADC_Cmd(ADC1, ENABLE);
  54.  
  55. /*复位校准寄存器 */
  56. ADC_ResetCalibration(ADC1);
  57. /*等待校准寄存器复位完成 */
  58. while(ADC_GetResetCalibrationStatus(ADC1));
  59.  
  60. /* ADC校准 */
  61. ADC_StartCalibration(ADC1);
  62. /* 等待校准完成*/
  63. while(ADC_GetCalibrationStatus(ADC1));
  64.  
  65. /* 由于没有采用外部触发,所以使用软件触发ADC转换 */
  66. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  67. }

对于main函数

  1. while ()
  2. {
  3. ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/*3.3; // 读取转换的AD值
  4.  
  5. printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue);
  6. printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal);
  7.  
  8. Delay(0xffffee);
  9. }

为什么是4096

设V为我们转换出来的电压 

V/3.3  = 读取的寄存器值/4096  (寄存器满值2^12 = 4096) 当然此时Vref- = 0V  ;Vref+ = 3.3V;若 Vref+ = (x)V  V/(x)  = 读取的寄存器值/4096

Vref+ 与 Vdda的关系:

1.Vdda和Vssa分别为ADC转换电路的电源引脚和电源地

2.

3.电压范围:

--------------------------------------------------------------------------------------------------------------------------

 

STM32.ADC的更多相关文章

  1. STM32 ADC 采样 频率的确定

    一 STM32 ADC 采样频率的确定 1.       : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...

  2. 关于STM32 ADC自校准的个人理解

    前几天发过一篇帖子,叫:关于STM32 ADC自校准的个人理解文章大体说的是自校准前要先将ADON位置1,之后再校准. 本以为彻底的了解了自校准的过程,但是昨天晚上无意间看到了一个函数说明,不禁愁云又 ...

  3. Stm32 ADC学习

    stm32 ADC 简介 stm32的ADC是 12位逐次逼近型 模拟数字转换器;它包括18个通道,可以用来测量16个外部通道和2个内部通道.ADC转换的结果存放在16位数据寄存器(ADC规则数据寄存 ...

  4. STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)

    一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/arti ...

  5. STM32 ADC多通道规则采样和注入采样

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...

  6. STM32 ADC 测电压

    1. STM32F103 ADC 本例使用STM32F103芯片的PA1引脚测试模拟输入的电压值. 查看文档<STM32F103X.pdf>第31页,引脚定义图: 得知PA1使用ADC1的 ...

  7. STM32 ADC转换时间

    STM32F103XX的ADC的采样时钟最快14MHz,最快采样率为1MHz. ADC时钟: 这个ADC时钟是从哪来的呢.我们看下面这个STM32的时钟结构图: 我们大多使用STM32的最快PCLK2 ...

  8. stm32 ADC配置

    STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器,它有 18 个通道,可测量 16 个外部和 2 个内部信号源 各通道的 A/D 转换可以单次.连续.扫描或间断模式执行. ADC 的结果 ...

  9. STM32 ADC详细篇(基于HAL库)

    一.基础认识 ADC就是模数转换,即将模拟量转换为数字量 l  分辨率,读出的数据的长度,如8位就是最大值为255的意思,即范围[0,255],12位就是最大值为4096,即范围[0,4096] l  ...

随机推荐

  1. JavaScript实现本地图片上传预览功能(兼容IE、chrome、FF)

    需要解决的问题有:本地图片如何在上传前预览.编辑:最近发现这个功能很多是基于flash实现的,很多JavaScript实现的代码兼容性都很差,特别是在IE和firefox和chrome三个浏览器上不兼 ...

  2. java基础---->Base64算法的使用

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...

  3. change事件的兼容性问题

    当input的value被修改时,在没有失去焦点的情况下,无法触发change事件,但是可以触发propertychange事件. 但是propertychange事件存在兼容性问题: IE9以下支持 ...

  4. Ubuntu 16.04 安装和配置 Redis

    因为发现之前手动安装的 redis 与现有的教程不一样,所以总结统一一下安装的标准步骤. 安装依赖项 为了获取最新版本的 Redis,我们将从源代码进行编译和安装.下载源代码之前,需要先安装一些编译所 ...

  5. V2EX的RSS订阅地址

    1.全站RSS输出: https://www.v2ex.com/index.xml 2.单独节点RSS输出: http://www.v2ex.com/feed/{节点名}.xml  以shadowso ...

  6. pta习题集 5-10 切分表达式——写个tokenizer吧

    [先说点出题背景] 这个题是为低年级同学.学C语言的同学准备的,因为,对这部分同学,这个题目编写起来略有一点复杂.如果是高年级.学过了正则表达式(Regular Expression)的同学或者学过了 ...

  7. timedatectl — Control the system time and date

    timedatectl --help 的执行结果如下: timedatectl [OPTIONS...] COMMAND ... Query or change system time and dat ...

  8. 洛谷P1373 小a和uim之大逃离 dp

    正解:dp 解题报告: 传送门! 同样是看到列表发的题解就想着跟着做下dp的题目趴 然后发现还挺难的,,,反正我只大概想到怎么转移但是初始化什么的都不会TT 所以还是大概说下QAQ 首先可以想到设f[ ...

  9. shell 变量定义技巧总结

    可以多学习和模仿操作系统自带的/etc/init.d/functions函数库脚本的定义思路,多学习Linux系统脚本中的定义,有经验的读者最终应形成一套适合自己的规范和习惯. (1)变量名及变量内容 ...

  10. UIView动画补充

    我自己的总结: // 第一种: Duration 时间 animations:动画体 /* [UIView animateWithDuration:4 animations:^{ CGRect rec ...