你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的ADC+DMA采样与板载运放跟随经验分享

[复制链接]
攻城狮Melo 发布时间:2024-5-25 13:31
之前有陆续介绍STM32的ADC采样与板载运算放大器,本期我们将二者结合,顺带再完善一下ADC采样与DMA。

板载运算放大器
板子使用的ST公司的STM32G474RE部分板子上没有板载OPAMP的话可以忽略运算放大器的部分。

微信图片_20240525133129.png


微信图片_20240525133126.png

我们打开运算放大器的跟随器功能,将跟随器的输出和STM32的ADC绑定,使得我们的信号接入PA1即可通过跟随器被采样。

ADC配置

微信图片_20240525133123.png

开启ADC1_12,这里通道12只能配置为单端输入,其他的通道可以配置为差分输入。

微信图片_20240525133120.png

添加DMA传输,模式选择正常模式,这样子我们只采集一组ADC数据,这里如果开启了Circle模式的话,环形存储区会导致DMA后面采集的数据覆盖前面采集的数据,导致数据乱飞。

微信图片_20240525133117.png

触发方式(启动ADC转化)我们选择定时器8,这边可以是任意定时器推荐使用的是低级定时器,这样子就可以控制我们的采样率。

定时器配置
这里解释一下Timer 8 Trigger Out event.

定时器(Timer)的触发输出事件(Trigger Output Event)可以用于生成特定的触发信号,以触发其他外设或事件。

在STM32定时器中,可以配置不同的事件作为TRGO信号的源。常见的触发源包括:
更新事件(Update Event)
当定时器的计数器溢出或达到设定的周期值时产生的事件。
捕获/比较事件(Capture/Compare Event)
当定时器捕获输入信号或计数器值与比较值匹配时产生的事件。
输出比较事件(Output Compare Event)
当定时器的输出比较单元产生一个输出信号时的事件。


微信图片_20240525133114.png

这里设置好我们的分频系数,计数值,设置一个Update Event更新事件来触发定时器采样。这里我的主频是170MHZ,分配系数是169,溢出值是100,这样子过100us触发采样,采样率固定下就是10KHZ。

我们强调过好几次,根据奈奎斯特采样定律,采样率必须高于信号频谱最高的两倍,当然我们在性能充裕的情况下最好是在最高频率的倍数高一点。

微信图片_20240525133110.png

最后别忘记开启相对应中断源的中断。

接着就是创建工程。

  1. #define ADC_Lenth 1024
  2. int32_t ADC_Value[ADC_Lenth];
复制代码


定义一个数组用以充当DMA的缓存区。
  1.   while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.     // 检查DMA传输是否完成
  6.     if (HAL_DMA_GetState(&hdma_adc3) == HAL_DMA_STATE_READY)
  7.     {
  8.         // 处理 ADC 数据
  9.         for (int i = 0; i < ADC_Lenth; i++)
  10.         {
  11.            printf("A:%d\r\n", (uint16_t)ADC_Value[i]);
  12.         }
  13.         
  14.         
  15.         HAL_ADC_Start_DMA(&hadc3,ADC_Value,ADC_Lenth);
  16.         
  17.     }
  18.   }
复制代码

在主函数中使用轮询的方式等待ADC传输完成,传输完成后我们利用串口打印。

我们使用HAL_DMA_GetState函数来获取状态。
  1. - HAL_DMA_STATE_RESET:复位状态
  2. - HAL_DMA_STATE_READY:就绪状态
  3. - HAL_DMA_STATE_BUSY:忙碌状态
  4. - HAL_DMA_STATE_TIMEOUT:超时状态
  5. - HAL_DMA_STATE_ERROR:错误状态
复制代码
当DMA属于就绪状态就说明传输结束。这里有一个坑点,关于

HAL_DMA_PollForTransfer这个函数按理来说是用来查询传输结束的,但是不知道为什么使用起来很奇怪。

微信图片_20240525133107.png

这是我们采集的方波信号


转载自:电路小白
如有侵权请联系删除




收藏 评论0 发布时间:2024-5-25 13:31

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版