首页 > 其他分享 >定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

时间:2024-11-07 22:20:06浏览次数:3  
标签:DMA 定时器 void STM32CubeMX TIM Init ADC

在STM32微控制器中,使用定时器(PWM输出)触发ADC采样是一种常见的应用场景,尤其是在需要精确控制采样时刻和频率的场合。本文将详细介绍如何使用STM32CubeMX配置定时器产生PWM波形,并使用DMA传输ADC采样结果。

1. 定时器PWM输出配置

首先,我们需要在STM32CubeMX中配置定时器以产生PWM波形。

  1. 选择定时器:选择一个适合的定时器,例如TIM3。
  2. 设置定时器时钟源:选择内部时钟源。
  3. 设置定时器CH1为PWM模式:对应管脚自动设置为复用模式。
  4. 使能定时器中断:如果需要使用中断处理PWM事件。

定时器参数设置

  • Prescaler(预分频):设置预分频值,例如31。
  • Counter mode(计数模式):选择向上计数模式。
  • Counter period(计数周期):设置计数周期,例如999。
  • Auto-reload preload:启用自动重载预加载。
  • Mode:选择PWM模式1。
  • Pulse(占空比值):初始设置为0。

2. ADC采样配置

接下来,配置ADC以使用定时器触发采样。

  1. 选择ADC通道:选择需要采样的ADC通道。
  2. 配置触发源:选择定时器作为ADC的触发源。
  3. 配置采样时间:设置ADC采样时间。

3. DMA配置

配置DMA以连续接收ADC采样结果。

  1. 选择DMA通道:选择一个DMA通道,例如DMA1_Channel1。
  2. 配置DMA传输:设置DMA为循环模式,以便连续接收ADC数据。

4. 代码实现

以下是基于STM32CubeMX配置的代码实现。

#include "stm32f1xx_hal.h"

ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
TIM_HandleTypeDef htim3;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_TIM3_Init(void);
static void MX_DMA_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM3_Init();
    MX_DMA_Init();
    MX_ADC1_Init();

    uint16_t adcValues[100]; // 假设我们有100个采样点

    // 启动ADC采集,并通过DMA传输数据
    HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adcValues, 100);

    while (1) {
        // 处理采集到的数据
        // ...
    }
}

static void MX_TIM3_Init(void) {
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};

    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 71; // 72MHz / 71 = 1MHz
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 999; // 1MHz / 1000 = 1kHz
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim3);

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);

    HAL_TIM_PWM_Init(&htim3);
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}

static void MX_DMA_Init(void) {
    __HAL_RCC_DMA1_CLK_ENABLE();
    hdma_adc1.Instance = DMA1_Channel1;
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc1.Init.Mode = DMA_CIRCULAR;
    hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    HAL_DMA_Init(&hdma_adc1);
    __HAL_LINKDMA(&hadc1, DMA_Handle, hdma_adc1);
}

static void MX_ADC1_Init(void) {
    ADC_ChannelConfTypeDef sConfig = {0};

    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    HAL_ADC_Init(&hadc1);

    sConfig.Channel = ADC_CHANNEL_1;
    sConfig.Rank = 1;
    sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

5. 注意事项

  1. 时钟配置:确保定时器和ADC的时钟配置正确,以便定时器能够以正确的频率运行。
  2. GPIO配置:确保ADC通道对应的GPIO引脚已经配置为模拟输入模式。
  3. DMA配置:确保DMA通道、方向、数据宽度等参数正确配置。
  4. 中断处理:在中断服务函数中,确保正确处理ADC转换完成和DMA传输完成事件。

通过上述步骤,我们可以在STM32上使用定时器产生PWM波形触发ADC采样,并通过DMA传输ADC采样结果。这为开发需要精确时间控制的采样系统提供了基础。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

标签:DMA,定时器,void,STM32CubeMX,TIM,Init,ADC
From: https://blog.csdn.net/weixin_66608063/article/details/143609102

相关文章

  • STM32G4 双ADC模式之交替触发方式
    目录概述1认识双ADC模式2功能实现2.1原理介绍2.2实现方法 2.3应用范例概述本文主要介绍STM32G4双ADC模式之交替触发方式,包括ADC模块的功能介绍,实现框架结构,以及交替触发方式ADC的转换的实现原理。1认识双ADC模式双ADC模式可用于具有两个或更多ADC的器件。......
  • Adc (ADC Driver)
    AUTOSAR(AutomotiveOpenSystemArchitecture)是一个开放且标准化的软件架构,用于汽车电子系统的开发。Analog-to-DigitalConverter(ADC)Driver模块是AUTOSAR中用于处理模拟信号转换的关键模块,负责将来自各种传感器的模拟信号转换为数字信号,以便在电子控制单元(ECU)中进行处......
  • 手把手教你学pcie(12.17)--实现一个PCIe设备与用户空间应用程序之间的DMA数据传输
    目录基于PCIe的DMA数据传输项目实例1.环境搭建2.FPGA设计3.驱动开发4.用户空间应用程序开发5.调试6.总结实现一个PCIe设备与用户空间应用程序之间的DMA数据传输。这个例子将包括环境搭建、FPGA设计、驱动开发、用户空间应用程序开发和调试等环节。基于PCIe的D......
  • 用超高纯度的正弦波振荡器测试18位ADC:精确度量,保障高性能
    在现代电子工程中,高分辨率模数转换器(ADC)的精度和性能是决定系统整体表现的关键因素之一。尤其对于需要极高数据精度和动态范围的应用,如高精度测量、音频处理、无线通信及科学仪器等领域,18位ADC更是不可或缺。然而,要准确评估这些高性能ADC的保真度,就需要采用一种高灵敏度的测试方......
  • 学习记录:STM32G431CBU6的多通道ADC采样串口打印(HAL库)
    一配置  二代码uint16_tGet_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)......
  • ST官方开发工具(一) STM32CubeMX 安装
    STM32CubeMX安装安装Java的环境STM32CubeMX安装在开发STM32MP157的时候我们还需要用到一些ST官方提供的软件,一共有三种:STM32CubeMX、STM32CubeIDE、STM32CubeProgrammerSTM32CubeMX可以直接在ST官网下载到http://www.st.com/en/developmen......
  • 高精度SAR ADC关键技术研究——王煜楠(2)
     本文基于《高精度模数转换器的关键性技术研究》——王煜楠,撰写阅读笔记。2.1ADC简介模数转换器的工作通常包含以下几个步骤:采样、保持、量化和编码。采样是对连续时间信号进行截取得到时间上离散的信号;保持则在两次采样的间隔时将上一次采样的结果进行保存;量化是将被采样......
  • ScriptBasedMapping: Script /etc/hadoop/conf/topology_script-py
    spark-sql初始化时异常spark-sql初始化的突然发现spark返回无法解决hostname的问题,网上检索也是说hosts配置不对,但是检查后确实没有因此猜测hosts问题不对也可能引发该问题,但是其他问题也能存在引发问题的情况,因为发现由于执行etc/hadoop/conf/topology_script-p......
  • STM32 第21章 DMA--直接存储器访问
    时间:2024.10.31-11.2参考资料:《零死角玩转STM32》“DMA--直接存储器访问”章节编程部分的代码基于12-GPIO输出-使用固件库点亮LED灯一、学习内容1、DMA功能框图和DMA初始化结构体1.1DMA功能框图1.1.1DMA简介DMA:DataMemoryAccess,直接存储器访问。和GPIO、串口等一......
  • 【VMware by Broadcom】新闻:Broadcom 宣布恢复 VMware vSphere Enterprise Plus 许可
    VMware被Broadcom收购后,发生了非常多的变化,其中变化之一就是,将以前众多的产品组件打包成了“四”个套件进行销售,并且将永久授权改成了订阅模式,你可以通过以下链接了解具体详情:VMwareCloudFoundation(VCF)VMwarevSphereFoundation(VVF)VMwarevSphereStandard(VVS)VMwarevS......