STM32 ADC使用学习笔记

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


前言

个人认为,ADC是stm32中最核心的功能之一,因为stm32所处理的信号是数字信号,而现实生活中所接触的大部分是模拟信号,因此需要对模拟信号进行采样使其变成数字信号后再对其进行处理,也是大部分电子信息相关专业本科所学的信号处理方法得以运用的关键步骤之一,由于本人最近在做AD相关的项目,因此在这里记载一下学习过程和感悟。本次用的单片机是ch32,与stm32相似,希望能为也在学习的朋友提供参考。


一、ADC是什么?

ADC 代表模数转换,它用于将模拟值从现实世界转换为数字值,只有经过AD才能将现实生活中的模拟信号转变为可以经由单片机处理的数字信号,因此对于数字信号处理有着先决作用。

二、ADC的主要功能模块

1.从功能框图开始

adc中断触发方式,stm32,学习,笔记
首先,要先清除ADC的量化范围,即ADC能把多大范围内的模拟信号转换成数字信号,在stm32中量化范围为: 0 ⩽ V I N ⩽ V D D A 0 \leqslant V_{I N} \leqslant V_{D D A} 0VINVDDA,因此常规情况下在设计电路时要将单片机的VDDA引脚接VCC。
每个外部ADC通道通过一个GPIO引出,如上图中有16个ADC通道,此外还有两个内部通道,这18个ADC通道可配置到两种转换组中:规则组和注入组。若想理解这两个转换组的定义,可单独查阅手册,这里做一个不太恰当的比喻,规则组就像是主函数的进程,注入组就像是中断函数的进程,当注入组ADC被触发后,程序开始执行注入组的任务,关闭后又回到规则组。
ADC的时钟是由系统时钟分频得来的,可在初始化ADC结构体中将ADC时钟设置为系统时钟的二分频,四分频,六分频或八分频。ADC 使用若干个 ADCCLK 周期对输入电压采样,总转换时间可以用以下公式来计算: T CON  =  采样时间  + 12.5   T ADCCLK  \mathrm{T}_{\text {CON }}=\text { 采样时间 }+12.5 \mathrm{~T}_{\text {ADCCLK }} TCON = 采样时间 +12.5 TADCCLK 其中 T A D C C L K T_{ADCCLK} TADCCLK即为前面设置的ADC的时钟周期,而采样时间也可在初始化结构体中设置
adc中断触发方式,stm32,学习,笔记
上述过程每进行一次则表示完成了一次ADC,若将ADC设置为规则组则转换完成后EOC标志位置一,若设置为注入组则转换完成后JEOC标志位置一,通过判断标志位可用来进行ADC的DMA过程或者中断过程等。以上即为ADC过程的概述,接下来具体讨论。

2.触发方式

stm32的ADC有三种触发方式,分别为:内部触发方式(定时器的TRGO事件)、外部触发方式(通过外部中断触发)、软件触发方式,在我所用的这款单片机中,关于触发方式的定义如下:

/* ADC_mode */
#define ADC_Mode_Independent                        ((uint32_t)0x00000000)
#define ADC_Mode_RegInjecSimult                     ((uint32_t)0x00010000)
#define ADC_Mode_RegSimult_AlterTrig                ((uint32_t)0x00020000)
#define ADC_Mode_InjecSimult_FastInterl             ((uint32_t)0x00030000)
#define ADC_Mode_InjecSimult_SlowInterl             ((uint32_t)0x00040000)
#define ADC_Mode_InjecSimult                        ((uint32_t)0x00050000)
#define ADC_Mode_RegSimult                          ((uint32_t)0x00060000)
#define ADC_Mode_FastInterl                         ((uint32_t)0x00070000)
#define ADC_Mode_SlowInterl                         ((uint32_t)0x00080000)
#define ADC_Mode_AlterTrig                          ((uint32_t)0x00090000)

/* ADC_external_trigger_sources_for_regular_channels_conversion */
#define ADC_ExternalTrigConv_T1_CC1                 ((uint32_t)0x00000000) 
#define ADC_ExternalTrigConv_T1_CC2                 ((uint32_t)0x00020000) 
#define ADC_ExternalTrigConv_T2_CC2                 ((uint32_t)0x00060000) 
#define ADC_ExternalTrigConv_T3_TRGO                ((uint32_t)0x00080000) 
#define ADC_ExternalTrigConv_T4_CC4                 ((uint32_t)0x000A0000)
#define ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO     ((uint32_t)0x000C0000) 

#define ADC_ExternalTrigConv_T1_CC3                 ((uint32_t)0x00040000) 
#define ADC_ExternalTrigConv_None                   ((uint32_t)0x000E0000) 

#define ADC_ExternalTrigConv_T3_CC1                ((uint32_t)0x00000000) 
#define ADC_ExternalTrigConv_T2_CC3                ((uint32_t)0x00020000) 
#define ADC_ExternalTrigConv_T8_CC1                ((uint32_t)0x00060000) 
#define ADC_ExternalTrigConv_T8_TRGO               ((uint32_t)0x00080000)
#define ADC_ExternalTrigConv_T5_CC1                ((uint32_t)0x000A0000) 
#define ADC_ExternalTrigConv_T5_CC3                ((uint32_t)0x000C0000) 

其中软件触发方式需要在每次进行ADC转换前通过以下语句使能ADC方可正常使用,此时ADC的触发状态被配置为:ADC_ExternalTrigConv_None

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

若设置成定时器触发模式,则需将触发方式配置为ADC_ExternalTrigConv_T3_TRGO此即为定时器3的TRGO事件,不过需要另外单独配置定时器3,此处给一个案例,关于TRGO接下来会单独写一篇博客讨论:

void TTRGO(void)
{
    TIM_OCInitTypeDef TIM_OCInitStructure={0};
    GPIO_InitTypeDef GPIO_InitStructure={0};
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_TimeBaseInitStructure.TIM_Period = 10-1;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 96-1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_Pulse = 5;
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OC1Init( TIM3, &TIM_OCInitStructure );
    TIM_OC1PreloadConfig( TIM3, TIM_OCPreload_Enable );
    TIM_CtrlPWMOutputs(TIM3, ENABLE );

    TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);            //选择TRGO作为触发源为定时器更新时间

    TIM_ARRPreloadConfig( TIM3, ENABLE );
    TIM_Cmd(TIM3, ENABLE);
}


外部中断触发方式由于现在还没有接触过,等以后补上。


3.寄存器

ADC的寄存器有如下(以ADC1为例):
adc中断触发方式,stm32,学习,笔记
以上都可以在芯片手册上详细找到,这里着重说一下状态寄存器

adc中断触发方式,stm32,学习,笔记
adc中断触发方式,stm32,学习,笔记
在库函数中可以使能状态寄存器的某一状态为中断标志位,进而检测该位进入中断。


4.库函数

ADC的库函数中主要为:

void ADC_Function_Init(void)
{
	ADC_InitTypeDef ADC_InitStructure={0};
	GPIO_InitTypeDef GPIO_InitStructure={0};

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	ADC_DeInit(ADC1);
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	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;
	ADC_Init(ADC1, &ADC_InitStructure);

	ADC_DMACmd(ADC1, ENABLE);
	ADC_Cmd(ADC1, ENABLE);

	ADC_BufferCmd(ADC1, DISABLE);   //disable buffer
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1));
	Calibrattion_Val = Get_CalibrationValue(ADC1);	
	
	ADC_BufferCmd(ADC1, ENABLE);   //enable buffer
}



这个函数中将ADC设置为主频的八分频,开启了ADC和对应GPIO的时钟,将ADC设置为独立模式,连续采集模式,软件触发模式,右对齐模式,最终实现的功能为一个通道ADC连续采集1024次发送给串口打印。
此外若要开启ADC中断则需要如下代码,这里是使用EOC位作为中断标志位:

    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
    ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
        ADC_ExternalTrigConvCmd(ADC1, ENABLE);//开启ADC外部时间启动

    NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn ;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1 ;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1 ;
    NVIC_InitStructure.NVIC_IRQChannel = ENABLE ;
    NVIC_Init(&NVIC_InitStructure);
    NVIC_EnableIRQ(ADC1_2_IRQn);

若要更改其他的标志位在上述地方更改即可,最后不要忘记使能ADC中断。


总结

以上即为ADC的简单介绍。文章来源地址https://www.toymoban.com/news/detail-754980.html

到了这里,关于STM32 ADC使用学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • stm32——hal库学习笔记(ADC)

    ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器 优点:转换速度快 缺点:成本高、功耗高、分辨率低 优点:结构简单、低功耗 缺点:转换速度较慢 特点: 分辨率和采样速度相互矛盾, 分辨率越高,采样速率越低 ①参考电压/模拟部分电压 ②输入通道 ③转换序列 ④触

    2024年02月22日
    浏览(49)
  • stm32学习笔记-7ADC模数转换器

    注:笔记主要参考B站 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注:工程及代码文件放在了本人的Github仓库。 ADC(Analog-Digital Converter)模拟-数字转换器 可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立 模拟电路到数字电路的桥梁 。当然

    2024年02月13日
    浏览(48)
  • 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)
  • 学习笔记|ADC反推电源电压|扫描按键(长按循环触发)|课设级实战练习|STC32G单片机视频开发教程(冲哥)|第十八集:ADC实战

    19.5.4 利用ADC第15通道(内部1.19V参考信号源)测量外部电压或电池电压 注意:这里的1.19V不是ADC 的基准电压ADC-Vref+,而是ADC15通道的固定输入信号源,1.19V STC32G系列ADC的第15通道用于测量内部参考信号源,由于内部参考信号源很稳定,约为1.19V,且不会随芯片的工作电压的改变而变化

    2024年02月07日
    浏览(49)
  • ESP32学习笔记09-ADC多通道采集 dma方式传输

    9.1.1特点 高性能。时钟更快,因此采样 速率实现了大幅提升 。 支持 多通道扫描 模式。每个 SAR ADC 的测量规则可见 样式表 。扫描模式可配置为 单通道模式 双通道模式 交替模式。 扫描可由软件或 I2S 总线发起。 支持 DMA,扫描完成即发生中断 9.1.2样式表 通道 分辨率 衰减倍

    2023年04月21日
    浏览(43)
  • STM32CubeMX系列05——ADC(轮询、中断、DMA)

    ==== 文章汇总(有代码汇总) ==== 正点原子Mini板,主控 STM32F103RCT6. 用到的外设: 串口1(PA9、PA10) 任意几个GPIO口(这里用PA1、PA2、PA3,对应ADC通道1、2、3)。 配置时钟源 配置debug模式(如果需要ST-Link下载及调试可以勾选) 配置时钟树(可以直接在HCLK那里输入72,然后敲回

    2024年02月10日
    浏览(45)
  • STM32CubeMX配置ADC采样(轮询、中断、DMA)

    STM32CubeMX能够极大减小STM32外设配置的工作量,因此作者也借助空闲时间对STM32CubeMX相关配置进行了学习,本文介绍如何利用STM32CubeMX配置ADC采样,记录了作者学习过程中遇到的问题及解决办法,使大家少走弯路,并方便以后复习 先选择所使用的MCU,这里我使用的是STM32F407ZGT系

    2024年02月03日
    浏览(58)
  • STM32_ADC————ADC+DMA多路数据传输,看门狗中断,传感器控制LED

    一:介绍ADC与DMA的基本情况与初始化 二:利用ADC+DMA+看门狗中断+传感器控制LED灯代码 三:总结实验过程中碰到的错误与问题 通过DMA转运ADC的数据,设置ADC的中断看门狗阈值,当光敏传感器的ADC采样值在看门狗高低阈值中间,不触发中断,如果超过看门狗的高低阈值就会触发

    2024年02月04日
    浏览(49)
  • stm32f030 学习笔记 (1)adc单/双通道采集

     1.实现单通道         如 pa0 pa1 pa2 温度传感器         1.实现单通道步骤                 1):配置RCC   GPIOA,UART1,ADC1使能                         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);                         RCC_APB2PeriphClockCmd(RCC_APB2Periph_A

    2024年02月15日
    浏览(42)
  • STM32学习笔记-SMT32使用HAL库UART中断方式使用

    目录 1、引言 2、配置 3、流程 近来需要使用蓝牙模块,再了解到蓝牙模块等无线模块许多使用串口透传,便决定在研究一下串口UART 的使用方法。 由于用的板子种类每次都不一样,有F103 有G0 有G4 还有公司的8位自研芯片,所以每次用起来都需要重头开始复习 每次使用UART的目

    2023年04月12日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包