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

【经验分享】STM32H7 ADC hal库

[复制链接]
STMCU小助手 发布时间:2021-12-24 19:00
前言
- c8 G9 y0 `' K' H& _7 D4 B# _! D9 E使用STM32H750VB作为主控,使用stm32cubemx配置工程,在单通道对ADC通道进行采集,预计对通道采集1024次,然后对1024个数据进行fft。
$ E6 v  z0 j3 X2 {7 Y/ j* s* y$ {& n) M" [3 _8 J
一、配置
5 W* i, E- ~8 a1. 时钟配置
- p( L" F. \+ a5 G4 k8 x在cubemx中配置,RCC中采用外部时钟,外部晶振分别为25MHz和32.768KHz。时钟树配置如下图所示:) B: }% V! G+ Y2 l

1 e" n1 T+ R- y1 ^! l$ ?
20210704095938344.png
2 m$ L  g3 u8 q. y9 F

2 m' f. |( t$ ^
20210704100011534.png

: ]+ r" B" T& k7 S5 ~
1 d/ S% l: B8 n) a$ OADC时钟频率为150MHz。! _! e7 _/ w8 ~$ [9 G; C
: f( p7 B- ^2 [  _
2. ADC配置+ y- B2 D# L1 }7 S
选用ADC3中的IN0,其他的不选,具体配置如下,根据下图计算采样率首先,ADC的时钟为150MHz,时钟分频8分频,然后采样时间为32.5个时钟周期,采样率约577KHz,实测采用8.5个时钟周期也可也,但是时采样率再高就不太行了。/ [* l$ Z1 S# `5 g7 M: O; s( w$ I

1 h6 |" }  a" {& x' a5 `+ N
20210704100216440.png

. Q& w1 S$ S( m( e& t) S* U
& O, u  {+ f1 S3 Z3. DMA配置
$ ?  u  x+ B. w9 cDMA配置如下图所示,由于是连续采样DMA配置为循环模式,同样,在ADC的配置中的转换数据管理模式也要配置为DMA Circular Mode。数据宽度选择half byte,在Debug中选上串行线就行。至此在cubemx中的配置完成。
+ u% K( n5 ?# I2 D& g3 D, {, ?: t; D3 D: A) Y9 ~4 g9 z
2021070410290080.png

- W5 r: L* G" ?0 d3 ?
: v. Q+ S! N: M3 U5 L" ^6 D示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。8 C6 E8 P! d5 k6 F( E3 O

! S- F; y0 R( o& `二、工程0 s- S/ O& |9 i; T
1 . ADC测试
7 T9 C) {+ X. ~" B: V. Ucubemx建立的工程已经包含了对各个部分的初始化,查看与ADC相关的函数。然后选择调用函数。首先进行对ADC的校准,如下所示。校准函数后面的两个参数可以在函数定义上面的注解中找到。
, {  x6 C+ k: q, O0 p% }6 R5 L% ?+ ?  a$ R& Z
  1. volatile HAL_StatusTypeDef status;
    $ Y9 [+ }/ j9 R( U+ S" ]! l
  2. status=HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);
复制代码

/ `. _' D6 E; B3 C
20210704105245249.png
" }: T4 ]/ A$ E& p: o# }' Y+ B

! x; v9 q" X% V1 t2 P& [0 y然后开启ADC采样,由于是使用DMA方式,所以调用HAL_ADC_Start_DMA函数。处理方式也一并写在下面所示的程序中。; \7 ^) K9 N* j  o8 O  i5 C

( j9 m! P  u, c) R1 q
  1. volatile uint32_t result;
    : o) k3 D+ R$ K0 B8 @
  2. volatile float value;
    , y" n+ p' R" ^0 b- `5 [8 W
  3. status=HAL_ADC_Start_DMA(&hadc3, &result, 1);
    - \2 g$ i3 N4 l9 d( K2 K
  4. value=(float)(result&0xffff)/65536*3.3;
复制代码
3 A5 v3 F& B; K" b, E" V! A0 W
调试时可以发现ADC的值可以连续被转换。
0 |3 g2 a( z, i+ A2 f6 n$ x5 S
20210704112136488.gif
7 A8 U( @$ {$ [% h! J0 w
2 N7 d/ V% D- b/ M' N, `
三、FFT+ N; Q& b+ w: p: E" e! M! g( \
1. 添加DSP库! S/ v" V1 I6 H& Y! {1 u) P
CMSIS包含了数字信号处理的一系列库,在Keil中添加比较方便,如下图所示。2 I7 ], p+ d3 ~/ a5 T$ U

2 t# D" W' t7 k/ q: k
20210704110212638.png

8 }# f$ q8 g% t. n6 E1 l( ]1 G" n8 g6 Q- N
DSP库的资料可以在keil安装目录中找到,如下图所示。
# ]) g- t+ G3 r  \7 |
% h# y1 I! s5 D$ ~$ _, t
20210704112010793.png
# z' `7 j/ d, D8 x; B

! I1 F1 [5 ^6 f' D3 z9 f1 A) V2. 数据采集
2 E7 U9 `) L" c! q采集1024组数据,声明长度为1024的float数组后,当给数组赋值,程序会进入hardfault,发现是H750VB的flash或者ram不够。后面准备研究外部flash存储数据,如果是ram的问题那就没办法了。后面就只有研究FPGA进行数据处理了。! R: m& T! Q3 W8 H! g( c
" X/ e2 r* W. Q4 a& J! ?/ g
总结: P% l9 X  _4 X( n  v
在整个过程中,发现使用6.0及以上版本的编译器编译的速度比5.0版本的块很多诶。
. W6 X7 |% h; z, N
" W) N4 J. j2 u: K- n; o+ f
& k2 S& l% b" Z( L8 w7 B; Q& b; R
3 \1 p. {! I, R' @& Z) T
收藏 评论0 发布时间:2021-12-24 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版