你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32CubeMX实现ADC的经验分享

[复制链接]
攻城狮Melo 发布时间:2024-6-15 12:26
什么是ADC?
ADC是模数转换器(Analog-to-Digital Converter)的缩写,它是一种将模拟信号转换为数字信号的设备。在嵌入式系统中,ADC常用于将传感器产生的模拟信号转换为数字信号,以便微控制器进行处理。


ADC是非常常用的器件,所以应该学会如何使用。


微信图片_20240615122111.png



STM32中的ADC
STM32微控制器系列是由STMicroelectronics推出的一系列32位ARM Cortex-M处理器的嵌入式系统。STM32系列通常配备了内置的ADC单元,使其能够轻松地进行模拟信号的数字化转换。


微信图片_20240615122108.png



STM32 ADC的主要特点
1.多通道: STM32 ADC通常具有多个通道,允许同时转换多个模拟信号。每个通道可以连接到不同的传感器或电压源。


2.分辨率: 分辨率表示ADC能够将模拟信号分成多少个离散的步骤。常见的分辨率有12位和16位,分辨率越高,转换精度越高。


3.采样速率: 采样速率是ADC每秒对模拟信号进行转换的次数。STM32 ADC通常具有可调节的采样速率,允许根据应用的要求进行优化。


4.触发模式: ADC可以通过软件或外部触发启动转换。这使得可以根据需要灵活地控制转换的时机。

CubeMX初始化
其实STM32的ADC可以分为单通道与多通道两种。


单通道即使用一个IO来实现ADC,多通道也顾名思义,使用多个通道ADC时如何处理。


单通道ADC配置图片


微信图片_20240615122103.png



在CubeMX中选择好对应的芯片,配置好时钟,开启串口方便调试。

微信图片_20240615122058.png



选择具有ADC功能的IO,点击开启ADC。


ADC设置

微信图片_20240615122053.png



设置ADC的模式,单通道的话大部分都不用改。
然后就可以生成我们的工程了。


代码配置
  1. #include <stdio.h>
  2. int fputc(int ch, FILE *f) {
  3.     // 发送单个字符
  4.     HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  5.    
  6.     // 返回发送的字符
  7.     return ch;
  8. }
复制代码

在Uart.c中重定向我们的串口,方便使用Printf函数。
  1. while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.     HAL_ADC_Start(&hadc1);//轮询模式开启ADC
  6.     HAL_ADC_PollForConversion(&hadc1, 50);//等待ADC转换结束
  7.     int Value = HAL_ADC_GetValue(&hadc1);//获取ADC转换的结果
  8.     printf("ADC:%d\r\n",Value);//打印ADC
  9.   }
复制代码

微信图片_20240615122049.png



可以看到我们实现了单通道ADC。


多通道ADC
多通道ADC,我们使用多通道间断模式

微信图片_20240615122046.png



开启多个ADC通道。

微信图片_20240615122043.png



这里必须使能扫描模式和间断模式

微信图片_20240615122040.png



通道数设置为3,顺序为12,13,14.
  1.   while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.     HAL_ADC_Start(&hadc1);//轮询模式开启ADC
  6.     HAL_ADC_PollForConversion(&hadc1, 50);//等待ADC转换结束
  7.     for(int i = 1;i<=3;i++)//总共三个通道
  8.     {
  9.       int Value = HAL_ADC_GetValue(&hadc1);//获取ADC转换的结果
  10.       printf("ADC%c:%d\r\n",'a'+i-1,Value);//打印ADC
  11.     }

  12.   }
复制代码

这样子ADC返回的值就是按照通道顺序而定。

微信图片_20240615122035.png



可以看到,可以读到ADC的值并打印了出来


转载自: 电路小白


如有侵权请联系删除




收藏 评论0 发布时间:2024-6-15 12:26

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版