当前位置: 首页 > news >正文

STM32.ADC

ADC实验

原理图:

 

 

1.ADC配置函数

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

/**
  * @brief  ADC1初始化
  * @param  无
  * @retval 无
  */
void ADC1_Init(void)
{
	ADC1_GPIO_Config();    //端口初始化
	ADC1_Mode_Config();
}

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

ADC1是挂载到DMA1的通道1的

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

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

 

便宜地址:0x4c

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

那么对于ADC自身配置:

采样总时间:

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

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

代码:

/**
  * @brief  配置ADC1的工作模式为MDA模式
  * @param  无
  * @retval 无
  */
static void ADC1_Mode_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    
    /* DMA channel1 configuration */
    DMA_DeInit(DMA1_Channel1);//重新配置
    
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;         //ADC地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;    //内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //方向从#define DMA_DIR_PeripheralSRC 
                                    //((uint32_t)0x00000000)开始发
    DMA_InitStructure.DMA_BufferSize = 1;            //每次只发送一个数据
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    //外设地址固定
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;          //内存地址固定
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                //循环传输
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;              //优先级(有三个)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    
    /* Enable DMA channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);
    
    /* ADC1 configuration */    
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //独立ADC模式(因为咱们只用一个)
    ADC_InitStructure.ADC_ScanConvMode = DISABLE ;          //禁止扫描模式,扫描模式用于多通道采集
                              //(ADC有3个通道,若几个通道同时采集一个模拟量则用扫描)
                          //若同时采(交叉采集),速率更高,对于32的示波器就是三路同时采集   
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //开启连续转换模式,即不停地进行ADC转换
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //不使用外部触发转换
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;     
                        //采集数据右对齐,数据时12位,保存数据的寄存器是16位
    ADC_InitStructure.ADC_NbrOfChannel = 1;             //要转换的通道数目1
    ADC_Init(ADC1, &ADC_InitStructure);
    
    /*配置ADC时钟,为PCLK2的8分频,即9MHz(最大是14M)68/9MS*/
    RCC_ADCCLKConfig(RCC_PCLK2_Div8); 
    /*配置ADC1的通道11为55.5个采样周期(模拟量转换成数字量需要多长时间),
     序列为1(有三个通道它排第一) */ 
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
    
    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
    
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    
    /*复位校准寄存器 */   
    ADC_ResetCalibration(ADC1);
    /*等待校准寄存器复位完成 */
    while(ADC_GetResetCalibrationStatus(ADC1));
    
    /* ADC校准 */
    ADC_StartCalibration(ADC1);
    /* 等待校准完成*/
    while(ADC_GetCalibrationStatus(ADC1));
    
    /* 由于没有采用外部触发,所以使用软件触发ADC转换 */ 
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

 

对于main函数

    while (1)
    {
        ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值
    
        printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue); 
        printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal); 

        Delay(0xffffee);  
    }

为什么是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.电压范围:

 

 

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

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/Ph-one/p/4155008.html

相关文章:

  • stm32 Flash读写[库函数]
  • strlen与sizeof区别
  • stm32 Flash读写独立函数[库函数]
  • 器件封装及尺寸问题
  • A8逻辑篇1.点亮一个LED(S5PV210.A8)
  • 电压跟随器测量
  • RC 522模块在LINUX平台调试笔记
  • RC522 模块驱动程序
  • 基于ARM、linux的MF RC522射频读卡器
  • linux体系结构与内核结构图解
  • Linux内核源码目录说明
  • A8几种内存
  • LM358电流检测电路
  • arm-linux-ld命令
  • 从IC设计业看中国企业之发展
  • ----------
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 10个确保微服务与容器安全的最佳实践
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Python进阶细节
  • 高程读书笔记 第六章 面向对象程序设计
  • 计算机在识别图像时“看到”了什么?
  • 配置 PM2 实现代码自动发布
  • 使用权重正则化较少模型过拟合
  • 微信小程序开发问题汇总
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Prometheus VS InfluxDB
  • ​520就是要宠粉,你的心头书我买单
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2.2w字)前端单元测试之Jest详解篇
  • (23)Linux的软硬连接
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (vue)页面文件上传获取:action地址
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (规划)24届春招和25届暑假实习路线准备规划
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原)本想说脏话,奈何已放下
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net wcf memory gates checking failed
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net 怎么循环得到数组里的值_关于js数组
  • .netcore如何运行环境安装到Linux服务器
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • /var/lib/dpkg/lock 锁定问题
  • :O)修改linux硬件时间
  • [ANT] 项目中应用ANT
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [AX]AX2012 SSRS报表Drill through action
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [C#7] 1.Tuples(元组)