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

【经验分享】STM32H7 ADC hal库

[复制链接]
STMCU小助手 发布时间:2021-12-24 19:00
前言
9 n# T; Q( y: s6 G% b+ B" B使用STM32H750VB作为主控,使用stm32cubemx配置工程,在单通道对ADC通道进行采集,预计对通道采集1024次,然后对1024个数据进行fft。
' q- G! B- T& K) u4 t+ {# h9 \/ Q8 ]4 T# C9 _
一、配置& R. W0 w1 j2 i' l' Y- F0 }( g
1. 时钟配置9 S. L+ c, v9 O6 X; n4 O" j
在cubemx中配置,RCC中采用外部时钟,外部晶振分别为25MHz和32.768KHz。时钟树配置如下图所示:+ q- F8 h# E. x& g) z9 X; E# x
1 X0 X* ^  Y& X" Q
20210704095938344.png
" {9 m# N' d4 O0 ]4 ^( p! [5 A: M% t

4 n; o% K' _) N# W8 R3 ^
20210704100011534.png
3 i7 d, l* G$ K5 a- X& U

/ X# ]) A+ N# ~! P$ f; L9 PADC时钟频率为150MHz。4 \9 _- M& }) t) T/ y/ O
. C: [' q  b7 X& n
2. ADC配置" t' i+ `- Y6 B& V
选用ADC3中的IN0,其他的不选,具体配置如下,根据下图计算采样率首先,ADC的时钟为150MHz,时钟分频8分频,然后采样时间为32.5个时钟周期,采样率约577KHz,实测采用8.5个时钟周期也可也,但是时采样率再高就不太行了。
! d% i+ y4 w/ H: \$ e4 V
& _/ {: R& u* w7 M0 J
20210704100216440.png
+ \6 o$ J/ Y+ Z$ s$ f" J3 J

" e' R6 ^( p- H- n# d$ C" m; t3. DMA配置
2 v" s% a; q, H( f: x$ SDMA配置如下图所示,由于是连续采样DMA配置为循环模式,同样,在ADC的配置中的转换数据管理模式也要配置为DMA Circular Mode。数据宽度选择half byte,在Debug中选上串行线就行。至此在cubemx中的配置完成。
% E: |; n/ _+ Q; ]5 l% W, @3 T8 W3 Q$ I1 P/ J! _
2021070410290080.png
8 Q3 b8 a% M3 |( r) `
7 m1 i! y5 A5 |6 W
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。' W% y" t1 R. K. Y( y6 o; Z+ M
. q' x2 F* _) V8 Y
二、工程3 A' y" q, n- K* @9 I# r
1 . ADC测试2 w- S0 s6 q7 L" \" u+ p! t
cubemx建立的工程已经包含了对各个部分的初始化,查看与ADC相关的函数。然后选择调用函数。首先进行对ADC的校准,如下所示。校准函数后面的两个参数可以在函数定义上面的注解中找到。
3 @8 B2 d, l& z* Q
- \+ l5 ~# \0 L! U4 V* r
  1. volatile HAL_StatusTypeDef status;8 d$ K6 D( D4 _3 O/ _
  2. status=HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);
复制代码
0 L( h+ `9 ^0 G6 a
20210704105245249.png

* B9 \  h2 H: Y% A% x* i7 n
5 N: ]+ _0 ~! C6 U然后开启ADC采样,由于是使用DMA方式,所以调用HAL_ADC_Start_DMA函数。处理方式也一并写在下面所示的程序中。0 {; g2 z( t, R8 K
% U  n; A/ y3 ^- s7 G
  1. volatile uint32_t result;
    ' f& Z. `$ m9 a0 N# |
  2. volatile float value;
    1 o$ C6 M7 K$ Q$ D$ b
  3. status=HAL_ADC_Start_DMA(&hadc3, &result, 1);, T+ X( h1 `: a, M  S
  4. value=(float)(result&0xffff)/65536*3.3;
复制代码
) L$ c0 M1 ]6 g6 C/ @; ]1 C; s, Z
调试时可以发现ADC的值可以连续被转换。% Z/ d5 V5 g- L- I
20210704112136488.gif
" o1 n; r0 \. ]( C

% Z9 K9 ]) b! p3 c; l三、FFT
0 ^2 i8 }- g  E/ x1 _5 V3 ?1. 添加DSP库
4 V) o7 O, d! R: h5 @+ l0 S( kCMSIS包含了数字信号处理的一系列库,在Keil中添加比较方便,如下图所示。9 K5 [$ W9 M, J8 \9 i8 z' Y, J

) T) R( a. K- V6 R8 u1 W* i  h+ A' l
20210704110212638.png
+ k  ^* b+ f3 z' q8 I  m

" t# m9 A4 k3 oDSP库的资料可以在keil安装目录中找到,如下图所示。2 |% Y. Q/ I* ?+ O' D
* l" c$ |8 w' |- O8 q
20210704112010793.png
6 d# x) J$ G$ o7 M1 |5 Q8 s

, r; ]8 n. @# Z" u5 b% ~; ~# O- q2. 数据采集
8 c0 u4 {- B, A( d' ~1 e采集1024组数据,声明长度为1024的float数组后,当给数组赋值,程序会进入hardfault,发现是H750VB的flash或者ram不够。后面准备研究外部flash存储数据,如果是ram的问题那就没办法了。后面就只有研究FPGA进行数据处理了。
0 }2 t! s. X6 z5 P& N2 o$ {* |  W2 G& P: O. C" x
总结  K$ L. R9 T. Y6 j) F; \, V
在整个过程中,发现使用6.0及以上版本的编译器编译的速度比5.0版本的块很多诶。2 n. |8 i  i. d$ P' ?
. l' `+ U: u4 `4 X4 U3 r7 I7 W
2 V8 r. [# X4 j& t
" ]7 w1 L, ^+ C6 A' S7 \5 Q
收藏 评论0 发布时间:2021-12-24 19:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版