STM32F3系列 ADC采样单端采样模式(基于LL库)

这篇具有很好参考价值的文章主要介绍了STM32F3系列 ADC采样单端采样模式(基于LL库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32F3系列 ADC 单端采样(基于LL库)

  • 芯片型号:STM32f303RBT6
  • 开发软件:MDK5 & CubeMX & VS Code

目录

目录
  • STM32F3系列 ADC 单端采样(基于LL库)
    • 目录
    • 引言
    • 1 基础知识
      • 1.1ADC转换基本流程
      • 1.2 时钟树
      • 1.3 关键参数
        • 1.3.1 位数
        • 1.3.2 触发信号
        • 1.3.3 采样时间
        • 1.3.4 转换时间
    • 2 CubeMx 配置步骤
      • 2.1 确定输入通道
      • 2.2 配置ADC
      • 2.3 输出设置
      • 2.4 MD5 设置
    • 3 程序解读
      • 3.1 ADC初始化
      • 3.2 校准和启动ADC
      • 3.3 主函数配置
      • 3.4 匿名上位机程序
    • 4 实验波形
    • 5 总结

引言

STM32F303系列单片机一般具有多个12位逐次逼近型(Successive approximatio)模数转换器(ADC,analog-to-digital converter)。STM32的ADC功能很多:单端采样、差分采样、主从模式、双ADC模式、注入模式等。本文作为学习笔记,记录最简单的单端(single-end)模式.

1 基础知识

1.1ADC转换基本流程

STM32F3系列 ADC采样单端采样模式(基于LL库)
上图是STM32ADC的框图,黑色箭头我自己加的开关。其转换流程大概可以简略为:

  1. 接收到触发信号,摁下开关
  2. 外部电压经过外部电阻(\(R_{AIN}\)),杂散电容(\(C_{parastitic}\))、ADC内部电阻(\(R_{ADC}\)),给采样电容\(C_{ADC}\)充电。
  3. 充电完成,松开开关,转换核心开始将电容上的电压值转为数字信号。
  4. 转换完成,转换结果存入ADC的数据寄存器中。

1.2 时钟树

STM32F3系列的单片机的ADC时钟有两路,一路为同步时钟(黑色),一路为异步时钟(蓝色)。异步时钟除了比同步时钟具有更多的分频选择,其他没有大的区别,其时钟最高频率也是相同的。

但是建议采用同步时钟,使用异步时钟时或许可能转换会出现问题,我也不知道什么原因。
STM32F3系列 ADC采样单端采样模式(基于LL库)

1.3 关键参数

1.3.1 位数

ADC一般可以分为10bit、12bit、16bit等,这个bit就是指的位数。位数的含义就是能把参考电平分为2的多少次方份。

比如:10bit的ADC可以把参考电平分为1024份; 12bit的ADC可以把参考电平分为4096份。若是参考电压为3.3V,则10bitADC可以分辨的最小电压为\(3.3/(2^{10}) = 3.22mV\),12bitADC可以分辨的最小电压为\(3.3/(2^{12}) = 0.806mV\)

由此可见,ADC位数越大,其分辨率越高,采集到的电压相对越准确。

1.3.2 触发信号

触发信号对于ADC转换流程中的第一步,即告诉ADC什么时候开始转换。触发信号有很多种,常用的有:软件触发、定时器信号触发和外部触发等。

1.3.3 采样时间

采样时间对应ADC转换流程中的第二步,即开关摁下多久,外部信号对\(C_{ADC}\)充电多长时间。一般来说采样时间以ADC时钟周期\(T_{ADC}\)的倍数,如:\(1.5T_{ADC}\)\(2.5T_{ADC}\)\(19.5T_{ADC}\)等。一般来说采样时间越长,信号采样越准确,一般是根据外电阻的大小来选择采样时间,具体采样时间选择可以参照下表:
STM32F3系列 ADC采样单端采样模式(基于LL库)
例如:外电阻为5k,外电阻介入2.7k~8.2k之间,则可以选择的采样时间为\(61.5T_{ADC}\)

1.3.4 转换时间

转换时间指的是ADC将制定电压转为为数字信号所用的时间,这个时间一般不可以控制,与ADC的时钟周期有关,时钟周期越长则转换时间越小。

2 CubeMx 配置步骤

2.1 确定输入通道

STM32F3系列 ADC采样单端采样模式(基于LL库)
选取ADC1-IN1通道作为检测通道,选择单端模式Single-ended。

2.2 配置ADC

STM32F3系列 ADC采样单端采样模式(基于LL库)
重要参数介绍:

  • Mode:independence即独立模式;
  • Clock Prescale:选取同步时钟最为ADC的时钟,分频系数为1,即ADC时钟为72M
  • Resolution(分辨率):选取12bit
  • Data Alignment(数据对其):一般选右对齐
  • End of Conversion selection(转换完成信号):这个参数指定了何时ADC触发DMA和中断,有两个参数End of single conversion(EOC) 与 End of sequence of conversion(EOS),即单次转换完成和顺序转换完成,由于我们只有一个通道选择这两个一样的,本次选择EOC。
  • OverRun behavior(覆写行为):若使能这个功能,则在ADC上次数据还没有读取的时候,新的输出产生时,会直接覆写上次数据。
  • Lower Power Auto Wait(低功耗自动等待):用于低功耗的功能。
  • Enable Regular Conversations(使能常规转换组):字面意思,使能常规组转换。
  • Number of Conversion(转换数量):需要转换的信号有几个。
  • External Trigger Conversion Source(外部触发源):触发信号是什么?软件、或定时器等。
  • External Trigger Conversion Edge(外部触发边沿):指定触发类型,上升沿触发、或下降沿触发等
  • Rank 1:
    • Channal(通道号):对应Channel1
    • Sampling Time(采样时间):对应上文的采样时间;
    • Offset Number(通道偏移):指定那个通道需要数据偏移。
    • Offset(数值偏移):即在采集到的数据减去一个数字偏置。
  • ADC_Injected Conversions(ADC注入模式):暂时不需要。
  • Analog Watchdog1~3():看门狗功能,暂时不需要。

2.3 输出设置

STM32F3系列 ADC采样单端采样模式(基于LL库)

使用LL库,剩下的按照常规配置就行。

2.4 MD5 设置

STM32F3系列 ADC采样单端采样模式(基于LL库)

勾选Reset and Run,否则下载程序后单片机不会自动运行,复位后才会运行。

3 程序解读

3.1 ADC初始化

void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  LL_ADC_InitTypeDef ADC_InitStruct = {0};
  LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};
  LL_ADC_CommonInitTypeDef ADC_CommonInitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Peripheral clock enable */
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_ADC12);    // 使能ADC时钟

  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);    // 使能GPIOA时钟
  /**ADC1 GPIO Configuration
  PA0   ------> ADC1_IN1
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;   // 12bit分辨率
  ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;// 数据右对齐
  ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;// 不使用低功耗模式
  LL_ADC_Init(ADC1, &ADC_InitStruct);
  ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;// 软件触发
  ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;// 不使用扫描模式
  ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;// 不使用断续模式
  ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;// 单次触发单次转换
  ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_LIMITED;// 不使用DMA
  ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN; // 数据覆写使能
  LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);
  ADC_CommonInitStruct.CommonClock = LL_ADC_CLOCK_SYNC_PCLK_DIV1;// 使能内部时钟1分频作为ADC时钟
  ADC_CommonInitStruct.Multimode = LL_ADC_MULTI_INDEPENDENT;// ADC采取独立模式
  LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct);

  /* Enable ADC internal voltage regulator *//*使能ADC内部的稳压器*/
  LL_ADC_EnableInternalRegulator(ADC1);
  /* Delay for ADC internal voltage regulator stabilization. */
  /* Compute number of CPU cycles to wait for, from delay in us. */
  /* Note: Variable divided by 2 to compensate partially */
  /* CPU processing cycles (depends on compilation optimization). */
  /* Note: If system core clock frequency is below 200kHz, wait time */
  /* is only a few CPU processing cycles. */
  uint32_t wait_loop_index;
  wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);
  while(wait_loop_index != 0)
  {
    wait_loop_index--;
  }

  /** Configure Regular Channel
  */
  LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_1);    // 设置通道1转换次序为1
  LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_181CYCLES_5);// 采样时间为181.5个ADC周期
  LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SINGLE_ENDED);// 采样模式为单端采样
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

3.2 校准和启动ADC

上述配置完后,使用LL库还需要一些额外的代码,ADC才可以正常工作。

void Mx_ADC_Start(void)
{
  uint8_t TimeDelta = LL_ADC_DELAY_CALIB_ENABLE_ADC_CYCLES;

  LL_ADC_StartCalibration(ADC1,LL_ADC_SINGLE_ENDED);        // 开始校准
  while(LL_ADC_IsCalibrationOnGoing(ADC1))                  // 等待校准完成
  	;
  LL_ADC_SetCalibrationFactor(ADC1,LL_ADC_SINGLE_ENDED  LL_ADC_GetCalibrationFactor(ADC1,LL_ADC_SINGLE_ENDED));// 将校准向量写  ADC1中

  while(TimeDelta > 0)  // 校准后延时
  {
  	TimeDelta--;
  }
  LL_ADC_Enable(ADC1); // 使能ADC
}

3.3 主函数配置

主函数就比较简单,使用软件触发ADC转换,待ADC转换完成后,使用窗口将转换数据经串口上传到上位机。串口程序用的为匿名上位机。

while (1)
{
  LL_ADC_REG_StartConversion(ADC1);           // 用软件触发ADC转换
  while(LL_ADC_REG_IsConversionOngoing(ADC1)) // 等待ADC转换完成
  	;
  sent_data(LL_ADC_REG_ReadConversionData12(ADC1),0,0,0);// 使用匿名上机  ADC数据发送到电脑
  while(count)  // 适当延迟
  {
  	count--;
  }
}

3.4 匿名上位机程序

uint8_t BUFF[30];

void sent_data(uint16_t A,uint16_t B,uint16_t C,uint16_t D)
{
  int i;
  uint8_t sumcheck = 0;
  uint8_t addcheck = 0;
  uint8_t _cnt=0;
  BUFF[_cnt++]=0xAA;//帧头
  BUFF[_cnt++]=0xFF;//目标地址
  BUFF[_cnt++]=0XF1;//功能码
  BUFF[_cnt++]=0x08;//数据长度
  BUFF[_cnt++]=(A&0x00ff);//数据内容,小段模式,低位在前
  BUFF[_cnt++]=(A&0xff00)>>8;//需要将字节进行拆分,调用上面的宏定义即可。
  BUFF[_cnt++]=(B&0x00ff);
  BUFF[_cnt++]=(B&0xff00)>>8;	
  BUFF[_cnt++]=(C&0x00ff);//数据内容,小段模式,低位在前
  BUFF[_cnt++]=(C&0xff00)>>8;//需要将字节进行拆分,调用上面的宏定义即可。
  BUFF[_cnt++]=(D&0x00ff);
  BUFF[_cnt++]=(D&0xff00)>>8;
  //SC和AC的校验直接抄最上面上面简介的即可
  for(i=0;i<BUFF[3]+4;i++) 
  {
  	sumcheck+=BUFF[i];
  	addcheck+=sumcheck;
  }
  BUFF[_cnt++]=sumcheck;	
  BUFF[_cnt++]=addcheck;	

  for(i=0;i<_cnt;i++) 
  {
  	while ((USART1->ISR & 0X40) == 0)
    ; /* 等待上一个字符发送完成 */
  	USART1->TDR=BUFF[i];
  }//串口逐个发送数据
}

4 实验波形

使用函数信号发生器,产生频率为1kHz,幅值为3V的正弦波,经两个2k电阻分压后传入ADC采集通道,电路图如图:
STM32F3系列 ADC采样单端采样模式(基于LL库)
实验波形在匿名上位机上显示如图:
STM32F3系列 ADC采样单端采样模式(基于LL库)
可以看到:

  • 波形为正弦波
  • 最高值 1863 对应 1.501V
    证明ADC采集正确。

5 总结

至此完成了STM32最简单的ADC单端采样,STM32的ADC还有很多其他功能,待之后有时间再记录。本文记录难免有错误,如有错误,欢迎指出。文章来源地址https://www.toymoban.com/news/detail-711171.html

到了这里,关于STM32F3系列 ADC采样单端采样模式(基于LL库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32F407 ADC+DMA+定时器 定时采样模拟量

    STM32F407 ADC+DMA+定时器 定时采样模拟量

    项目中需要对多个通道的电压进行一定频率的AD采样,由于采样过程贯穿整个任务,为了使采样过程尽可能不占用CPU资源,采用定时器触发的多通道ADC扫描采样,且采样数据由DMA传到RAM中的缓存。 这样做有以下几个好处:1、由定时器触发ADC采样,这样采样的频率可控,且定时

    2024年02月14日
    浏览(12)
  • STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

    STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

    按下 STM32F4 的 KEY0 按键,通过外部中断的方式对按键进行检测,然后进行一次固定点数的 DMA ADC 采集,采集完成后在 DMA 的中断发送采集到的数据,然后清空数据区准备下一次的按键中断。电脑接受到串口数据后对数据进行简单处理和傅里叶变化,然后实时显示在电脑上。 开

    2024年02月14日
    浏览(18)
  • 基于STM32的ADC采样序列频谱分析

    基于STM32的ADC采样序列频谱分析

      本文主要介绍对ADC采集得到的数字序列进行FFT频谱分析。   确定采样率除了要遵守奈奎斯特采样定律意外还需要考虑一些问题。在数字系统中,我们只能进行一些有限的离散的运算,对于有限长的序列,我们不可能拿它去做DTFT,只能做DFT。这就需要 把有限长序列也当

    2024年02月13日
    浏览(7)
  • 基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)

    基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)

            前言: 本文为手把手教学 ADC采样 及 各式滤波算法 的教程,本教程的 MCU 采用 STM32F103ZET6 。以 HAL库 的 ADC采样 函数为基础进行教学,通过各式 常见滤波 的实验结果进行分析对比,搭配 VOFA+工具 直观的展示滤波效果。 ADC 与 滤波算法 都是嵌入式较为常见的,希望这

    2024年02月03日
    浏览(8)
  • 基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)_数据采集滤波算法stm32(3)

    基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)_数据采集滤波算法stm32(3)

    2.2 VOFA+使用方法 VOFA+ 的数据协议引擎有 3种 : FireWater , JustFloat , RawData 。每种数据协议引擎都有自己特殊的使用效果,读者朋友可以根据自己的实际需要去选择使用。作者这里主要给大家演示一下 FireWater协议 下的VOFA+使用效果和方法。 FireWater协议 是 CSV风格 的字符串流,

    2024年04月23日
    浏览(9)
  • STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

    STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

    目录 准备 配置 步骤  总结   正点原子的STM32F103ZET6开发板(精英版) CUBEMX配置软件 KEIL5  右对齐就是正常的数据格式。左对齐除以16后得正常数据。(当输出非常大时考虑是否改了对齐方式,默认都是右对齐)  扫描模式,连续转换模式使能。(多通道下扫描模式自动使能

    2024年02月04日
    浏览(12)
  • Proteus使用STM32F103系列芯片仿真ADC电压总是为0问题解答

    Proteus使用STM32F103系列芯片仿真ADC电压总是为0问题解答

    STM32F103芯片有一组ADC参考电压端口  对应到Proteus中,发现原理图上并没有但是在“配置供电网”中存在 可以看出,VSSA与VDDA同为3.3V,这就导致采集到的电压没有0电位参考,所以需要将 VSSA 转移到 GND 组   此时再允许正确的ADC程序就可以采集到正确的电压了      

    2024年02月13日
    浏览(12)
  • STM32G070RBT6基于STM32CubeMX自动生成ADC输入电压采样工程全过程讲解

    STM32G070RBT6基于STM32CubeMX自动生成ADC输入电压采样工程全过程讲解

    📌相关篇《【硬件开源电路】STM32G070RBT6开发板》 🛠STM32CubeMX工程配置过程演示 📢Keil工程完成业务代码以及烧录演示放在资源中,gif文件过大无法上传。 📚工程概要 本工程是基于STM32CubeMX工具来配置项目,功能需求:在PA0引脚接入一个外部模拟量信号(单片机能承受的电

    2024年02月01日
    浏览(13)
  • 基于STM32F103C8T6ADC检测交流电压

    基于STM32F103C8T6ADC检测交流电压

    上篇文章写了硬件部分的实现思路,通过采样电阻的到小电压后经过二级放大电路得到单片机可处理的交流电压,此文介绍了如何采用单片机采集交流电压以及stm32ADC外设的使用。首先是硬件电路部分。  电路没有采用核心板,而是直接将芯片焊接到主板上,采用type-c接口供

    2024年02月12日
    浏览(20)
  • STM32 ADC采样

    STM32 ADC采样

    目录 1.基础概念 2.原理:ADC采样过程分为四步:采样、保持、量化、编码。 3.采样定理 4.采样保持放大器(SHA) 5.ADC电压值转换 6.ADC轮询采样 1.基础概念 ADC 全称:Analog-to-Digital Converter,指模拟/数字转换器,就是将模拟信号转换成数字信号 ①模拟信号:是连续变化的,具有电

    2024年02月04日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包