嵌入式应用开发ADC学习笔记(立创STMF4开发板)

news2024/10/10 2:15:05

                                                                               目录        

                #ADC

#ADC学习相关涉及概念介绍

#ADC相关概念介绍

#软件实现

#常用结构体配置介绍

#常用函数介绍

#软件编写,完成效果。


#ADC

#ADC学习相关涉及概念介绍

        数字信号(Digital Signal):数字信号用最为常见的二进制数来表示的信号,也就是 0 1 ,数字信号就是  0 和1 组成的信号,取值是有限制的变化范围也是有限制的,这种信号可以由ADC连续的采样转化得到;

        模拟信号(Analog Signal):模拟信号不像数字信号,其信号可以随意变化,其取值没有受限,在一个范围内取值,是随意地,这是二者的差别,通常由传感器采样得到,这种信号。

        ADC采样:对模拟信号按照相等时间进行切片,这个操作会导致丢失一些信息。ADC采样的频率越高,得到的数字信号就越接近原来的模拟信号,也就是保真度越高,但是需要更多的资源和计算功耗。

        ADC量化:这个过程就是将每个切片进行,四舍五入得到一个具体的数字取值

        ADC编码:编码就是将量化得到的数字取值,进行二进制转换,这个取值的结果就是数字信号,二进制编码的位宽等于ADC的位宽。(这里就是 12位ADC比8位ADC精度高的原因),具体过程见下图。

                                

        ADC相关定义:Analog-to-Digital Conversion, ADC,用于将模拟信号转化为数字信号

        DAC相关定义:Digital-to-Analog Conversion, DAC,用于将数字信号转化为模拟信号,与上一条相反,这里本章介绍ADC而不是DAC,DAC转换需要经历 解码  重构

        DAC解码:将数字信号里面的值重新转化为数值    

        DAC重构: 将解码过后的数值进行换化为连续的模拟信号,这个过程需要使用插值或者滤波  技术    

       分辨率:ADC位数,通常有,8位、10位、12位等,位数越高,精度越高,这个用在编码环节将数值转化为ADC的位宽。

         采样率: 表示ADC对模拟输入信号进行采样的速率,通常以每秒采样次数(samples per second,SPS)表示,也称为转换速率,表示ADC能够进行多少次模拟到数字的转换。

        采样范围:指ADC可以采集到的模拟输入信号的电压范围,范围见下:

                                                        V(REF-) ≤ ADC ≤ V(REF+)

其中V(REF- )为负参考电压等于 V(SSA )等于地0V,V(REF+ )为正参考电压等于V(DDA)也就是3.3V。

#ADC相关概念介绍

        ADC(Analog-to-Digital Conversion),的工作原理是将模拟信号通过采样转换为离散的数字信号,然后再通过量化、编码等处理,最终结果也就是得到数字信号。

        STMF4有12位ADC,19路通道,这些通道是用来进行ADC准换或者DAC转换,每个ADC通道可以配置为 单次 连续 扫描 间接准换模式 ,具体看下图数据手册

        单次转换模式:每进行一次ADC转换过后,ADC会自动停止工作,不在进行转换。

        连续转换模式:当进行ADC转换过后,还会连续进行ADC转换,直到软件触发停止转换

        扫描模式:对于多个ADC通道,按照顺序依次进行转换,完成后自动切换到常规通道。

#软件实现

#配置细节介绍

        ADC配置时钟要求在40MHz以下,具体见下图数据手册(实验2分频),GPIO配置为模拟输入,这个模式专门用于,输入模拟电路也就是(DO)

#软件编写,完成效果。

void ADC_GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//开启时钟,GPIO系列挂在在AHB总线上面
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;//这里配置为模拟输入模式功能
	GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_5;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;  
	
	GPIO_Init(GPIOA,&GPIO_InitStruct); 

}

             初始化GPIO,这里注意需要配置模拟输入,配置为模拟就自动代表为输入

void ADC_Base_Init(void)
{
	ADC_CommonInitTypeDef ADC_CommonInitStruct;

	ADC_DeInit();//ADC复位

	ADC_CommonInitStruct.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;
	ADC_CommonInitStruct.ADC_Mode=ADC_Mode_Independent;
	ADC_CommonInitStruct.ADC_Prescaler=ADC_Prescaler_Div2;//这里设计预分频系数为2 
	ADC_CommonInitStruct.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;

	ADC_CommonInit(&ADC_CommonInitStruct);
	
	
	ADC_InitTypeDef ADC_InitStruct;
	
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//禁止连续转换模式
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//数据设置为右对齐
	ADC_InitStruct.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;//使用软件触发ADC转换
	ADC_InitStruct.ADC_NbrOfConversion=1;//转换数量为1
	ADC_InitStruct.ADC_Resolution=ADC_Resolution_12b;//ADC分辨率为12位
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;//禁止用扫描模式
	
	ADC_Init(ADC1,&ADC_InitStruct);
	
	//ADC1使能
	ADC_Cmd(ADC1, ENABLE);
	
}

          初始化ADC模块外设

unsigned int Get_ADC_Value(uint8_t  ADC_CHANNEL_x)
{
    unsigned int adc_value = 0;
    //设置采集通道
    ADC_RegularChannelConfig( ADC1, ADC_CHANNEL_x, 1, ADC_SampleTime_480Cycles );
    //开始软件转换
    ADC_SoftwareStartConv(ADC1);
    // 等待转换结束
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); 
    
    //读取采样值
    adc_value = ADC_GetConversionValue(ADC1);
    
    //返回采样值
    return adc_value;
}

               

uint16_t Get_Adc_Average(uint8_t CHx,uint8_t times)// 
{
        
        uint32_t value = 0;
        uint8_t t;
        
        for(t=0;t<times;t++)
        {
                value += Get_ADC_Value(CHx);
                delay_ms(5);
        }
        return value/times;
}
int main(void)
{
	board_init();
	uart1_init(115200U);
	ADC_GPIO_Init();
	ADC_Base_Init();
	
	while(1)
	{
		uint16_t value = Get_Adc_Average(ADC_Channel_5,20);
		
		printf("value = %d\r\n", value);
		delay_ms(1000); 
	}
	

}

        在主函数里面调用

                 参考文章在最后, 希望对你有所帮助!!!

【立创·天空星STM32F407VET6】入门手册 - 飞书云文档 (feishu.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1863075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s部署mongodb副本集

1.什么mongodb&#xff1f; MongoDB 是一个基于分布式文件存储的数据库&#xff0c;由 C 语言编写&#xff0c;旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff…

excel实现下拉筛选(超简单)

excel实现下拉筛选 引言1、需求&#xff1a;预警状态下的列 实现下拉筛选2、实现2.1、数据验证2.2、下拉筛选内容2.3、去掉预警状态单元格的下拉筛选 引言 通常&#xff0c;我们会单独新建一张sheet表 专门存每个列的下拉内容。下面我将专门建立一张名为代码表的sheet表来存放…

欧盟指控苹果应用商店规则非法压制竞争,面临巨额罚款风险

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

[Redis]事务

Redis事务 Redis 事务提供了一种将多个命令请求打包的功能。然后&#xff0c;再按顺序执行打包的所有命令&#xff0c;并且不会被中途打断。 但是&#xff0c;事务中的每条命令都会与 Redis 服务器进行网络交互&#xff0c;比较浪费资源 所以&#xff0c;日常开发中不建议使…

LeetCode题练习与总结:随机链表的复制--138

一、题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的…

成功解决ES高亮内容引起的字段显示不一致问题

在处理搜索引擎&#xff08;如Elasticsearch&#xff09;结果时&#xff0c;常见需求之一是对用户搜索的关键词进行高亮显示&#xff0c;这有助于用户快速识别搜索结果为何与其查询相关。但在实际应用中&#xff0c;如果处理不当&#xff0c;直接使用高亮片段可能会导致原始数据…

冰淇淋PDF编辑器,轻量,无需安装,打开即用

​IceCream PDF Editor (冰淇淋PDF编辑器) 是一款简单实用的PDF文件编辑工具。功能包括&#xff1a;编辑文本、注释添加、页面管理、PDF文件保护等&#xff1b;操作简单&#xff0c;功能强大&#xff0c;使用户能够轻松编辑和修改PDF文件。 软件链接&#xff1a;轻量&#xff…

代码随想录算法训练营第四十五天| 198.打家劫舍,213.打家劫舍II ,337.打家劫舍III

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int rob(int[] nums) {int[] dp new int[nums.length];if(nums.length 1){return nums[0];}dp[0] nums[0];dp[1] Math.max(nums[0],nums[1]);for(int i2;i<nums.length;i){dp[i] Math.ma…

【服务器】磁盘满载--docker 的日志文件太大造成满载

一.背景 早上过来测试反馈服务器都宕机了,访问不了。一看服务器磁盘都已经满了。所以开始清磁盘数据。 二.解决 主要查看下面目录情况: /home/libe/docker /containers /volumes /overlay21.查看磁盘情况 df -h/ du -a|sort -rn|…

国密SSL证书提升网络安全

随着数字化时代的到来&#xff0c;网络安全已经成为全球关注的焦点。在这种背景下&#xff0c;SSL证书作为保护数据传输安全的重要工具&#xff0c;其重要性日益凸显。 数字证书产品有以下几种类别&#xff1a; 单域名SSL证书&#xff1a;为单一网站提供安全保护。 多域名SS…

ICMAN液位检测——WS003B管道检测模组

ICMAN液位检测之WS003B管道检测模组 体积小&#xff0c;成本低&#xff0c; 液位检测精度高&#xff0c; 有水输出低电平无水高电平&#xff0c; 适用于饮水机、咖啡机、扫地机器人、洗地机等&#xff0c; 有需要朋友快联系我吧&#xff01; AWE展会不容错过的ICMAN检测模组…

sheng的学习笔记-AI-高斯混合模型(GMM)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客需要学习前置知识&#xff1a; 聚类&#xff0c;可参考 sheng的学习笔记-AI-聚类(Clustering)-CSDN博客 EM算法&#xff0c;可参考 sheng的学习笔记-AI-EM算法-CSDN博客 贝…

python编写的多个FastApi接口如何批量运行

fastapi编写接口并批量运行 为什么要写这fastapi接口以及拿它做什么呢&#xff1f; fastapi可以快速构建你自己的api&#xff0c;前端后端联调时&#xff0c;后端接口还有做好&#xff0c;那么这个fastapi可以快速生成mock一些数据。 结合uvicorn这个python库使用起来很方便 为…

【Python实战因果推断】1_因果效应异质性1

目录 From ATE to CATE Why Prediction Is Not the Answer CATE and ITE 本文将介绍应用于行业的因果推理中最有趣的发展&#xff1a;效应异质性。在此之前&#xff0c;你们了解的是一种治疗方法的一般影响。现在&#xff0c;你将专注于发现它如何对不同的人产生不同的影响。…

【漏洞复现】用友 UFIDA saveDoc.ajax 任意文件上传漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

web前端大作业-乡村扶贫、乡村振兴

文章目录 代码分析页面截图代码连接 代码分析 代码结构 主页index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta…

基于RabbitMQ原理的自定义消息队列实现

文章目录 1. 什么是消息队列2. 需求分析2.1. 核心概念12.2. 核心概念22.3. 核心API2.4. 交换机类型2.5. 持久化2.6. 网络通信2.7. 总结 3. 创建核心类3.1. Exchange3.2. MSGQueue3.3. Binding3.4. Message3.5. 数据库操作3.5.1. 建表操作3.5.2. 交换机操作3.5.3. 队列操作3.5.4…

力扣62 不同路径

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 输入&…

智能终端-Qt-课程设计分析

这个是几个简单的Qt的智能终端分享&#xff0c;其是我们上课的作业&#xff0c;我就在老师要求的基础上去进行了延申了一点的&#xff0c;下面看做了哪些东西 这个是所有的点开之后的页面&#xff0c;我做到了那些家居和那个按钮达到了同步的效果&#xff0c;这点其实还是不错…

仿真模拟--静态浮动路由

目录 静态路由 浮动路由 静态路由 浮动路由