细说MCU用定时器控制ADC采样频率的实现方法

news/2024/9/13 20:18:54/ 标签: 单片机, 嵌入式硬件

目录

一、工程依赖的硬件及背景

二、设计目的

三、 建立工程

1.选择时钟源和Debug模式

2.配置系统时钟和ADC时钟

3.配置串口

4.配置ADC

5.设置TIM3

6.设置TIM4 

7.配置中断

8.GPIO

四、代码修改

1.重新定义ADC回调函数

2.在主程序中编写数据发送代码

3.使能ADC和开启定时器

4.查看结果


        在细说MCU的ADC模块单通道连续采样的实现方法-CSDN博客  https://blog.csdn.net/wenchm/article/details/140008718icon-default.png?t=N7T8http://xn--https-rfa//blog.csdn.net/wenchm/article/details/140008718中,通过使能AD配置参数中的连续转换模式(Continuous Conversion Mode),并结合ADC中断,实现了连续采样。该例中,ADC的采样频率约为1.58 kHz,是通过设置ADC的时钟频率和采样时间得到的。实际中,有时希望ADC以给定的采样频率转换数据,譬如1 kHz。在这种情况下靠配置ADC时钟频率和采样时间的方法就非常不方便。

        本例子使用定时器来控制ADC连续采样。

一、工程依赖的硬件及背景

        文章依赖的硬件及工程配置参考本文作者的其他文章:细说MCU的ADC模块单通道连续采样的实现方法-CSDN博客  https://blog.csdn.net/wenchm/article/details/140008718icon-default.png?t=N7T8http://xn--https-rfa//blog.csdn.net/wenchm/article/details/140008718

二、设计目的

        信号源为TIM4的TIM_CHANNEL_1,管脚PA11,给ADC1_IN1输入信号;也可以用管脚PA5的LD2作为信号源给ADC1_IN1输入信号;

       ADC1_IN1采集到信号后,按缓冲大小的规定,循环给串口发送数据;

       ADC采集样品的频率由TIM3设置的规则控制;

三、 建立工程

1.选择时钟源和Debug模式

        使用片外时钟晶体作为HSE的时钟源。将Debug设置为Serial Wire。

2.配置系统时钟和ADC时钟

        将系统时钟(SYSCLK)频率配置为170 MHz,并设置ADC1的时钟为34 MHz。

3.配置串口

        配置USART2模式(Mode)为异步(Asychronous),其他参数设置均保持默认(波特率为115200),不开启中断。将USART2的两引脚PA2和PA3均设置为上拉(Pull-up)。

4.配置ADC

        配置ADC1的通道1(IN1),选择IN1 Single-ended;在下面的配置(Configuration)区,对几个参数进行调整:

  • ADC的时钟预分频参数(Clock Prescaler)选择Asynchronous clock mode divided by 1,也就是不分频(前面的例子是分频256倍,目的是想得到所需要的采样频率)。本例将用定时器实现对采样频率的控制,所以ADC的时钟可以不用进行分频处理。
  • 将ADC设置(ADC_Settings)参数栏中连续转换模式(Continuous Conversion Mode)设置为Disabled,即不使能,因为本例中ADC采样频率要通过定时器来控制。
  • 转换结束选择(End Of Conversion Selection)参数仍保持单次转换结束(End of single conversion);由于目前只使用了一个ADC通道,还可以选择序列转换结束(End of sequence conversion),对结果没有影响。
  • 在ADC规则转换模式(ADC_Regular_Conversion Mode)栏中,外部触发转换源(External Trigger Conversion Source)选择Timer 3 Trigger Out event,使用TIM3的触发输出作为ADC的触发源。
  • 位于Rank下的采样时间选择2.5个周期。前面提到过,这个参数决定着ADC的转换时间。如果选择2.5个周期,则在12位分辨率时ADC的转换时间为2.5+12+0.5=15个周期。
  • 使能ADC1的中断。

5.设置TIM3

        TIM3的模式(Mode)区,选择时钟源(Clock Source)为内部时钟(InterClock);计数器的预分频因子设置为169,则定时器的时钟频率为系统频率的1/170,如果系统频率为170 MHz,则定时器的时钟频率为1 MHz;计数器的周期设置为999,则计数器的溢出频率为1MHz/1000 =1 kHz。在Trigger Output参数栏中将发事件设置为更新事件(Update Event)。

6.设置TIM4 

        TIM4的模式(Mode)区,选择时钟源(Clock Source)为内部时钟(InterClock);通道1选择PWM Generation CH1;GPIO管脚默认PA11;计数器的预分频因子设置为999,计数器的周期设置为8499,auto reload=Enable;Pulse=2125;

7.配置中断

        将ADC1中断的优先级设为1。此外,由于将会用到HAL_Delay函数,所以要将tick timer中断的占式优先级设为0。

        TIM4的全局中断的优先级设置为2;

8.GPIO

        设置 PA5(LD2) 为GPIO OUTPUT,OUTput level默认LOW,PP,Pullup,High;别名LED;

四、代码修改

1.重新定义ADC回调函数

        在主程序中重写回调函数HAL_ADC_ConvCpltCallback()和串口发数据的putchar函数,并且将它们放到main.c的注释对中:

/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{ADC1ConvertedData[ADC1Data_index] = HAL_ADC_GetValue(&hadc1);if(ADCSampleFlag == 0)ADC1Data_index ++;if(ADC1Data_index == ADC_CONVERTED_DATA_BUFFER_SIZE){ADCSampleFlag = 1;ADC1Data_index = 0;}
}//信号源
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
}//串口打印
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

2.在主程序中编写数据发送代码

        将数据发送代码放置到main函数的while(1)循环中。

while(1)
/* USER CODE BEGIN 3 */
if(ADCSampleFlag == 1)
{for(uint16_t i=1;i<ADC_CONVERTED_DATA_BUFFER_SIZE;i++){printf("ADC1ConvertedData[%d] = %d\r\n",i,ADC1Convertedata[i]);}ADCSampleFlag = 0;
}
HAL_Delay(1000);
/*USER CODE END 3 */

        上述函数中用到的变量需要定义。仍然是将它们定义为全局变量,放到主程序中的注释中:

/*USER CODE BEGIN PV*/
uint16_t ADC1ConvertedData[ADC_CONVERTED_DATA_BUFFER_SIZE];
uint16_t ADC1Data_index =0;
uint8_t ADCSampleFlag =0;
/*USER CODE END PV*/

        其中,数组长度ADC_CONVERTED_DATA_BUFFER_SIZE可以定义到main.h中:

/* USER CODE BEGIN Private defines */
#define ADC_CONVERTED_DATA_BUFFER_SIZE(uint16_t) 65
/* USER CODE END Private defines */

        同时,在main.c中,包含头文件stdio.h:

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

3.使能ADC和开启定时器

        在主程序初始化代码中使能ADC中断,并开启定时器TIM3、TIM4。将HAL_ADC_Sta IT()、HAL_ADCEx_Calibration_Start()、HAL_TIM_Base_Start()、HAL_TIM_Base_Start_IT()HAL_TIM_PWM_Start()放到while(1)之前, MX_ADC1_Init()之后的注释对中: 

  /* USER CODE BEGIN 2 */HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);HAL_ADC_Start_IT(&hadc1);HAL_TIM_Base_Start(&htim3);HAL_TIM_Base_Start_IT(&htim4);HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);/* USER CODE END 2 */

4.查看结果

        把PA5(LD2)信号或者PA11(TIM4_CH1)信号施加信号到ADC1_IN1输入端PA0上,打开串口助手即可收到送上来的数据。

        为了实测ADC的采样频率,同样可以配置PC3作为输出引脚,在回调函数HAL_ADC _ ConvCpltCallback()中加入控制PC3输出状态的语句,并通过示波器测量PC3引脚的输出 形,此时测得的频率为采样频率。

        实测的PA5(LD2)信号:

         实测的串口接收的数据:

 


http://www.ppmy.cn/news/1475734.html

相关文章

云端日历同步大师:iCloud让工作与生活井井有条

云端日历同步大师&#xff1a;iCloud让工作与生活井井有条 在快节奏的现代生活中&#xff0c;无论是工作还是个人生活&#xff0c;我们都需要一个可靠的日历应用来帮助我们管理日常事务和重要事件。iCloud作为苹果公司提供的云服务&#xff0c;其日历应用&#xff08;Apple Ca…

PyMuPDF 包读取pdf文档时,span里的flags属性代表什么

在 PyMuPDF&#xff08;也称为 fitz&#xff09;库中&#xff0c;flags 属性表示文本的格式化信息。flags 是一个整数&#xff0c;它包含了不同位&#xff08;bits&#xff09;的标志&#xff0c;每个位代表文本的一种属性。这些标志位可以组合在一起表示复杂的文本格式。 具体…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(三)-机上无线电接入节点无人机

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

记一次使用vue连接rabbitMq

连接rabbitMq需要使用stompjsnpm i stompjs 下下面是连接代码 import Stomp from stompjsonConnected(frame) {// 绑定交换机exchange_pushmsg是交换机的名字rk_pushmsg是绑定的路由keyvar exchange this.rabbitMqexchange || queue.device.zzzz// 创建随机队列用上面的路由k…

神经网络替代密度泛函理论!清华研究组发布通用材料模型 DeepH,实现超精准预测

在材料设计中&#xff0c;了解其电子结构与性质是预测材料性能、发现新材料、优化材料性能的关键。过去&#xff0c;业界广泛使用密度泛函理论 (DFT) 来研究材料电子结构和性质&#xff0c;其实质是将电子密度作为分子&#xff08;原子&#xff09;基态中所有信息的载体&#x…

【Python】sklearn教程

1. sklearn库介绍 sklearn是 Python 中一个非常重要的机器学习库&#xff0c;全称为scikit-learn。它是基于Python语言的机器学习工具&#xff0c;提供了一系列简单高效的机器学习算法。sklearn库通常与NumPy和SciPy库一起使用&#xff0c;用于数据预处理、特征选择、模型训练…

无人机之遥控器分类篇

一、传统遥控器 传统无人机遥控器一般包括开关键、遥控天线等基础装置。但是会随着无人机具体的应用和功能而开发不同的按键。它的信号稳定性远超对比其他遥控&#xff0c;而且遥控距离也更远&#xff08;一般遥控范围在100米或以上&#xff09;传统遥控器对于初学者来说比较难…

/EtherCATInfo/Descriptions/Devices/Device/SubDevice/@Hideable

SubDevice/Hideable 属性 /EtherCATInfo/Descriptions/Devices/Device/SubDevice/Hideable 出现次数&#xff1a;可选 (0…1)数据类型&#xff1a;布尔值 该属性仅应在列出所有子设备的主设备的 ESI 文件中使用。该属性表示配置工具是否可以隐藏相应的子设备。只有不需要配置…

PXE、Kickstart和cobbler

一.系统装机 1.1 三种引导方式 启动操作系统 1.硬盘 2.光驱(u盘) 3.网络启动 pxe 1.2 系统安装过程 1.加载boot loader: Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设 备、建立内存空间的映射图,从而将系统的软硬…

多旋翼无人机挂载多功能抛投器技术详解

多旋翼无人机&#xff0c;作为一种具有高效、灵活、稳定等特性的无人驾驶飞行器&#xff0c;在现代社会的多个领域得到了广泛应用。其中&#xff0c;挂载多功能抛投器技术&#xff0c;使得无人机在物资投送、救援等任务中发挥出更加重要的作用。以下将详细介绍多旋翼无人机挂载…

搜索引擎算法工程师,在query理解方面,都有哪些方面的工作

一、什么是query理解&#xff1f; 通俗来讲&#xff0c;就是query整形。又可以理解为是一个转接头&#xff0c;把用户送来过来的奇奇怪怪的query&#xff08;或者说是在搜索引擎看来是奇奇怪怪的query&#xff09;转换为搜索引擎最想看到的query的。 在LLM当前能力的帮助下&a…

STM32学习历程(day6)

EXTI外部中断使用教程 首先先看下EXTI的框图 看这个框图就能知道要先初始化GPIO外设 那么和前面一样 1、先RCC使能时钟 2、配置GPIO 选择端口为输入模式&#xff0c; 3、配置AFIO&#xff0c;选择我们用的GPIO连接到后面的EXTI 4、配置EXTI&#xff0c;选择边沿触发方式…

《系统架构设计师教程(第2版)》第11章-未来信息综合技术-06-云计算(Cloud Computing) 技术概述

文章目录 1. 相关概念2. 云计算的服务方式2.1 软件即服务 (SaaS)2.2 平台即服务 (PaaS)2.3 基础设施即服务 (IaaS)2.4 三种服务方式的分析2.4.1 在灵活性2.4.2 方便性方 3. 云计算的部署模式3.1 公有云3.2 社区云3.3 私有云3.4 混合云 4. 云计算的发展历程4.1 虚拟化技术4.2 分…

大数据如何推动工业数字化发展

在全球工业4.0浪潮中&#xff0c;大数据技术作为核心驱动力&#xff0c;正深刻改变着传统工业的面貌。通过数据的采集、分析和应用&#xff0c;工业企业能够实现生产效率的提升、成本的降低以及创新能力的增强。本文将从大数据在工业数字化中的应用场景、技术实现和实际案例等方…

数据库系统概论:初识数据库

数据库&#xff08;Database&#xff09;作为计算机系统中不可或缺的重要组成部分&#xff0c;扮演着存储、管理和访问数据的核心角色。它们被设计用于高效地存储和管理数据&#xff0c;使用户能够快速地查找、更新和分析信息。数据库系统是现代信息技术的核心组成部分&#xf…

keil将“32”单片机中的axf文件转换为bin文件

需要注意的是keil自带的fromelf.exe只是将axf文件转换为bin文件 在编译stm32单片机使用才能生成axf文件&#xff0c;在编译51单片机时会输出hex文件&#xff0c;没有输出axf文件 使用方法 参考&#xff0c;参考1&#xff0c;参考2 简单来说是设置输出hex&#xff0c;然后修改…

【JavaEE】网络原理——网络层+数据链路层

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;上一篇文章&#xff1a;【JavaEE】网络原理—…

notes for datawhale 2th summer camp NLP task1

//I wrote this note in obsidian and copied it here. The strange format in this note is due to lack of obsidian plugins. tags: AI-studyML status: done 目标&#xff1a;跑通baseline&#xff0c;体验NLP模型解决问题的流程&#xff0c;基本了解赛题要求&#xff0c;…

Apache Lucene 详解及示例

Apache Lucene 详解及示例 1. 简介 Apache Lucene 是一个高性能的全文搜索引擎库&#xff0c;广泛应用于构建搜索系统。本文将详细解析 Lucene 的核心概念和主要功能&#xff0c;并通过多个示例代码演示其使用方法。 2. 核心概念 2.1 倒排索引 倒排索引将文档中的每个词条…

视频号矩阵系统源码,实现AI自动生成文案和自动回复私信评论,支持多个短视频平台

在当今短视频蓬勃发展的时代&#xff0c;视频号矩阵系统源码成为了自媒体人争相探索的宝藏。这一强大的技术工具不仅能帮助我们高效管理多个短视频平台&#xff0c;更能通过AI智能生成文案和自动回复私信评论&#xff0c;为自媒体运营带来前所未有的便利与效率。 一、视频号矩…