stm32 ADC采集音频信号

这篇具有很好参考价值的文章主要介绍了stm32 ADC采集音频信号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:最近在做一个关于采集音频信号的小项目,在这里做下记录和总结

1、实现的功能

最终我们需要的功能是:通过ADC模块对音频信号进行采集,利用DMA进行数据的搬运,TIMER定时器触发ADC采集,最终在LCD屏幕上展示出采集信号的波形。
stm32音频,stm32,音频

最终效果就是这种。
stm32音频,stm32,音频
文章中我没有用到TIMER定时器触发采集,用的是软件触发的方式,屏显我选择了VOFA+软件进行代替。

2、ADC简介

ADC是Analog to Digital Convert的简称。翻译过来也就是模数转换器,它可以将模拟信号转换为数字信号。
什么是模拟信号呢?
模拟信号是指用连续变化的物理量表示的信息,其信号的幅度,或频率,或相位随时间作连续变化,或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。日常生活中,我们常见的模拟信号有,如电压、温度、压力、电压、电流等等。
什么是数字信号呢?
数字信号,是指自变量是离散的、因变量也是离散的信号,这种信号的自变量用整数表示,因变量用有限数字中的一个数字来表示。在计算机中,数字信号的大小常用有限位的二进制数表示。
STM32F103 系列芯片拥有 3 个 ADC(C8T6 只有 2 个),这些 ADC 可以独立使用,其中ADC1 和 ADC2 还可以组成双重模式(提高采样率)。STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源,其中 ADC3 根据 CPU 引脚的不同其通道数也不同,一般有 8 个外部通道。ADC 中的各个通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以以左对齐或者右对齐存储在 16 位数据寄存器中。
STM32F103 的 ADC 主要特性我们可以总结为以下几条:
1、12 位分辨率;
2、转换结束、注入转换结束和发生模拟看门狗事件时产生中断
3、单次和连续转换模式
4、自校准
5、带内嵌数据一致性的数据对齐
6、采样间隔可以按通道分别编程
7、规则转换和注入转换均有外部触发选项
8、间断模式
9、双重模式(带 2 个或以上 ADC 的器件)
10、ADC 转换时间:时钟为 72MHz 为 1.17us
11、ADC 供电要求:2.4V 到 3.6V
12、ADC 输入范围:VREF–≤VIN≤VREF+
13、规则通道转换期间有 DMA 请求产生
下面这张图是ADC通道表,不同的通道对应不同的IO口,配置ADC的时候需要注意。
stm32音频,stm32,音频

3、直接上代码了

3.1 GPIO初始化(配置PC1为模拟信号输入口)

void ADCx_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); // 打开 ADC IO端口时钟    
    // 配置 ADC IO 引脚模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    
    // 初始化 ADC IO
    GPIO_Init(GPIOC, &GPIO_InitStructure);                
}

3.2 ADC和DMA初始化(PC1对应的ADC通道为11)

void ADCx_Mode_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
           
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 打开DMA时钟
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); // 打开ADC时钟
        
    DMA_DeInit(DMA1_Channel1);// 复位DMA控制器
    
    // 配置 DMA 初始化结构体
    
    DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADCx->DR ) );// 外设基址为:ADC 数据寄存器地址
       
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; // 存储器地址,实际上就是一个内部SRAM的变量
       
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 数据源来自外设
        
    DMA_InitStructure.DMA_BufferSize = 1;// 缓冲区大小为1,缓冲区的大小应该等于存储器的大小
        
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 外设寄存器只有一个,地址不用递增
        
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; // 存储器地址固定
    
    
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;// 外设数据大小为半字,即两个字节
        
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;// 存储器数据大小也为半字,跟外设数据大小相同
       
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;    // 循环传输模式
    
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;// DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
        
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;// 禁止存储器到存储器模式,因为是从外设到存储器
       
    DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStructure); // 初始化DMA
        
    DMA_Cmd(ADC_DMA_CHANNEL , ENABLE);// 使能 DMA 通道
    
    // ADC 模式配置
    
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;// 只使用一个ADC,属于单模式
       
    ADC_InitStructure.ADC_ScanConvMode = DISABLE ;  // 禁止扫描模式,多通道才要,单通道不需要
       
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 连续转换模式
       
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不用外部触发转换,软件开启即可
       
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 转换结果右对齐
       
    ADC_InitStructure.ADC_NbrOfChannel = 1; // 转换通道1个
    
    // 初始化ADC
    ADC_Init(ADCx, &ADC_InitStructure);
       
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);  // 配置ADC时钟为PCLK2的8分频,即9MHz
       
    ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5); // 配置 ADC 通道转换顺序为1,第一个转换,采样时间为55.5个时钟周期
       
    ADC_DMACmd(ADCx, ENABLE); // 使能ADC DMA 请求
        
    ADC_Cmd(ADCx, ENABLE);// 开启ADC ,并开始转换
   
         
    ADC_ResetCalibration(ADCx);// 初始化ADC 校准寄存器  
   
    while(ADC_GetResetCalibrationStatus(ADCx)); // 等待校准寄存器初始化完成
        
    ADC_StartCalibration(ADCx);// ADC开始校准
  
    while(ADC_GetCalibrationStatus(ADCx));  // 等待校准完成
       
    ADC_SoftwareStartConvCmd(ADCx, ENABLE); // 由于没有采用外部触发,所以使用软件触发ADC转换 
}

主函数里面只需要调用上面两个初始化函数,while循环中,直接打印ADC通道采集到的数据即可。

4、串口打印电压(音频)值

stm32音频,stm32,音频
这是串口打印的数据并显示波形。不过这个波形感觉很奇怪,正常的波形应该是有上下浮动的,这个只有向上浮动的数据,没有向下的数据。我用LCD屏幕显示波形的话,就是正常的。如下图所示。项目用到的ADC采集模块和这个实验用到的不一样,但ADC采集音频信号这一块的代码逻辑基都是相同的,没有做任何更改。这个原因还不知道是哪里造成的。
stm32音频,stm32,音频文章来源地址https://www.toymoban.com/news/detail-714544.html

到了这里,关于stm32 ADC采集音频信号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 ADC采集 DMA中断处理

    //============================================ //函数名称:ADC1_Mode_Config(void) //功能描述:配置ADC1的工作模式为MDA模式 //输入:无 //输出:无 //============================================ void ADC1_Mode_Config(void) {         DMA_InitTypeDef DMA_InitStructure;         ADC_InitTypeDef ADC_InitStructure;              

    2024年02月14日
    浏览(50)
  • STM32--ADC数值采样/附ADC采集热敏传感器使用

    目录 一丶ADC介绍 二丶ADC工作原理及管脚分布 三丶代码部分详解 (一)库函数介绍 (二)代码部分整合         ADC模块中文名为模拟/数字转换器,是12位逐次逼近型的模拟数字转换器,一般用于数值的采样   可以将引脚上连续变化的模拟电压转换为内存中存储的数字变

    2024年02月03日
    浏览(50)
  • STM32Cubemx——ADC采集+DMA传输

    STM32F407VE核心板 STM32Cubemx 版本 6.0.1 Keil 版本 5.31 杜邦线 ST-Link 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左

    2023年04月24日
    浏览(62)
  • STM32F103_ADC电压采集

    ADC寄存器 STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。 它有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。 模拟看门狗特性允许应用程序检测输入

    2023年04月08日
    浏览(35)
  • STM32_HAL库—ADC采集数据

    目录 一、简介 二、实例 1. (单通道、阻塞式)配置及实现方式 2. (单通道、中断式)配置及实现方式 3. (多通道、阻塞式)配置及实现方式 4. (多通道、DMA)配置及实现方式        STM32 的ADC精度为 12 位,且每个 ADC 最多有 16 个外部通道。各通道的A/D转换可以单次、连续、扫描或

    2024年02月10日
    浏览(43)
  • 基于stm32+HAL库的ADC电压采集实验

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 只会用if的大神提醒您,敌军还有30秒到达战场,碾碎他们!白银局不要怕! 软件:keil5、stm32cubemx、串口调试助手 硬件:stm32f103系列的开发板、杜邦线*1、串口工具 仅此而已!!!正好6神 1、打开cube

    2023年04月15日
    浏览(44)
  • STM32-ADC多通道数据采集:理论与实践

    本文详细介绍了STM32-ADC多通道数据采集的理论基础和实践应用。文章首先解释了ADC的基本概念和特性,然后详细阐述了ADC采样的过程和注意事项。接着,文章深入讲解了多通道采集模式的轮询和DMA两种方法,并给出了具体的代码实现。

    2024年02月10日
    浏览(47)
  • STM32-单通道ADC采集(DMA读取)实验

    关于ADC的一些原理和实验我们已经有了2篇笔记,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 实验要求:通过ADC1通道1(PA1)采集电位器的电压,并显示ADC转换的数字量和换算后的电压值。 我们通过下表可以知道DMA1通道

    2024年02月16日
    浏览(56)
  • STM32使用内部参考电压提高ADC采集准确度

    我们在使用ADC采集外部电压时,一般默认参考电压为MCU的供电电压,例如单片机供电电压为3.3V时,我们计算采集电压的公式为: 但是如果因为某些原因导致的供电不稳定,而我们任然按照3.3V计算,ADC采集计算出来的电压就会出现误差。 在STM32手册中关于ADC的介绍中提到使用

    2024年02月15日
    浏览(33)
  • STM32 热敏电阻NTC的软件设计(ADC采集)

    目录   前言 一、查表函数 二、ADC采集        三、查表 四、数据滤波 记录一些我在工作和学习过程中遇到的问题。 NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NTC温度 代码是小学生水平!         电路设计可以参考https://blog.csdn.net/qq_45217932/article/d

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包