热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

STM32ADC多通道采集

ADC多通道采集(阻塞模式、ADC_DMA模式)ADC多通道采集(阻塞模式)ADC多通道采集(DMA模式&#x


ADC多通道采集(阻塞模式、ADC_DMA模式)

    • ADC多通道采集(阻塞模式)
    • ADC多通道采集(DMA模式)


ADC多通道采集(阻塞模式)

1、时钟源配置
在这里插入图片描述

2、配置RCC时钟(选择第三个选项 Crystal/Ceramic Resonator 晶体/陶瓷谐振器 )
在这里插入图片描述
3、配置一个LED灯,在程序编写中让它闪烁代表程序没有死机。
在这里插入图片描述
4、设置调试模式,我们选择SW
在这里插入图片描述
5、设置串口,因为我们的程序采集到了adc的数值之后会发送到串口调试助手上,证明ADC采集是否成功。选择异步模式、波特率是默认的115200.其他配置也是默认的
在这里插入图片描述
6、配置ADC。这里我选择的两个通到采集,分别是PA0、PA1.主要是配制成:扫描模式、连续转换模式、间断模式、
在这里插入图片描述
设置为2个通道
采用软件触发方式启动采集
2个通道各自的参数设置
在这里插入图片描述

7、优先级设置高一点,怕的中断其他干扰在这里插入图片描述
下面是主要的代码 。

// 串口重定向和ADC采集的代码
int fputc(int ch, FILE *f) // 串口重定向{ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;}
uint16_t Get_adc()
{//开启ADC1HAL_ADC_Start(&hadc1);//等待ADC转换完成,超时为100msHAL_ADC_PollForConversion(&hadc1,100);//判断ADC是否转换成功if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){//读取值return HAL_ADC_GetValue(&hadc1);}return 0;
}

下面是while循环的代码

HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);HAL_Delay(1000);for(uint8_t i&#61;0;i<2;i&#43;&#43;){ ADC_Value[i]&#61;Get_adc();//分别存放通道1、2的ADC值}for(uint8_t i&#61;0;i<2;i&#43;&#43;){ printf("ADC通道%d,:%.4f V\r\n",i,(ADC_Value[i]*3.3/4096));}

ADC多通道采集&#xff08;DMA模式&#xff09;

配置基本上与阻塞模式的相同&#xff0c;除了ADC的设置外。
在这里插入图片描述
在这里插入图片描述
DMA配置

mode&#xff1a;模式

Normal&#xff1a;正常模式&#xff0c;当一次DMA数据传输完后&#xff0c;停止DMA传送 &#xff0c;也就是只传输一次

Circular&#xff1a; 循环模式&#xff0c;传输完成后又重新开始继续传输&#xff0c;不断循环永不停止

data width&#xff1a;数据宽度

byte&#xff1a;字节&#xff0c;通用8位&#xff0c;与u8相同

word&#xff1a;字长&#xff0c;与硬件的位数相同&#xff0c;STM32是32位&#xff0c;所以对应是u32

Half Word&#xff1a;半个字长&#xff0c;所以对应是u16

Memory打钩表示存储ADC值的内存地址&#xff08;数组&#xff09;会自增

1、我们在设置了DMA传输数据&#xff0c;就要取消ADC转换完成中断。
在这里插入图片描述
2、代码的思想。是在while中调用启动函数&#xff0c;待ADC采集及DMA传输完成之后。我们在DMA传输完成中断服务函数中把采集到的职打印到串口上。

int fputc(int ch, FILE *f) // 串口重定向{ HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);return ch;}
#define ADC_MAX_NUM 2 uint16_t ADC_Values[ADC_MAX_NUM]&#61;{0};//启动函数&#xff0c;需要在main中调用一次
void ADC_DMA_caiji()
{//启动DMAHAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Values,ADC_MAX_NUM);}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//DMA采集完成中断服务函数
{printf("烟雾%d\r\n",ADC_Values[0]);printf("光电%d\r\n",ADC_Values[1]);HAL_ADC_Stop_DMA(&hadc1);//关闭DMA的ADC采集
}

下面是在while中的代码

HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);ADC_DMA_caiji();HAL_Delay(2000);//采集速度太快&#xff0c;加了2s的延时。

2、成果展示
在这里插入图片描述
写的不好&#xff0c;请多多见谅。有问题的可以联系我修改。


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
额外的房间
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有