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

【经验分享】STM32H7 ADC hal库

[复制链接]
STMCU小助手 发布时间:2021-12-24 19:00
前言" T1 U" P7 R# }+ \6 `6 V5 {
使用STM32H750VB作为主控,使用stm32cubemx配置工程,在单通道对ADC通道进行采集,预计对通道采集1024次,然后对1024个数据进行fft。4 O* [8 U4 g* E1 c8 G* j

& X$ [9 r7 x# C( h  C( t一、配置
! I' Z* j' K4 k; \2 G  ~6 X: W/ M1. 时钟配置, g! U1 [- n7 N) a, _4 k9 ~
在cubemx中配置,RCC中采用外部时钟,外部晶振分别为25MHz和32.768KHz。时钟树配置如下图所示:
' e6 K/ ~1 h- t1 y' [/ Z) W
4 _/ C, y* f4 U4 u6 r1 I
20210704095938344.png

7 y& C& ~  B' E+ O; r
3 ~  x) ]4 K$ z; d0 N3 r
20210704100011534.png
& \& H) P7 _( M/ B  v

4 l  C+ V* R2 k* BADC时钟频率为150MHz。3 X7 p( u0 q7 |/ ]
, m* L# [2 J' t$ w/ V8 o, ]
2. ADC配置
# S) I" W! k/ c0 k* y) Z' r选用ADC3中的IN0,其他的不选,具体配置如下,根据下图计算采样率首先,ADC的时钟为150MHz,时钟分频8分频,然后采样时间为32.5个时钟周期,采样率约577KHz,实测采用8.5个时钟周期也可也,但是时采样率再高就不太行了。" c: ~% u. y" V% M* w4 H/ M5 _) B

- o5 e* b# u5 f  B1 C+ r
20210704100216440.png

& n7 Z" w) q! O' O8 H9 p9 b% l4 N( o, B1 l4 \) E5 p; L* ~
3. DMA配置
, K$ x6 F' L/ K' k( bDMA配置如下图所示,由于是连续采样DMA配置为循环模式,同样,在ADC的配置中的转换数据管理模式也要配置为DMA Circular Mode。数据宽度选择half byte,在Debug中选上串行线就行。至此在cubemx中的配置完成。, z$ Y/ s/ W5 t% g, E! u

' q2 T- b0 G, W6 B: J
2021070410290080.png

3 N3 H" D! i5 p9 p! a) Q% _) I+ _7 p
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。  _8 X4 }! D1 Z

1 b* H  b, k: e2 h0 R) U" W2 k二、工程3 C0 p: f+ Q9 O
1 . ADC测试
3 R' u+ i( r% @- ^3 c7 Mcubemx建立的工程已经包含了对各个部分的初始化,查看与ADC相关的函数。然后选择调用函数。首先进行对ADC的校准,如下所示。校准函数后面的两个参数可以在函数定义上面的注解中找到。( ?# T# q1 `! r2 V" t7 ^

( n) d1 F4 S0 M0 A# q# E  o/ h: m
  1. volatile HAL_StatusTypeDef status;7 X, S* f8 Z( Z9 x9 D6 k
  2. status=HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);
复制代码

6 w5 Q- R& s. y9 h; O
20210704105245249.png
0 P# x. ?6 F) C& I, `0 h4 \) ~
) W6 }9 b  G* |5 q* I. f% O
然后开启ADC采样,由于是使用DMA方式,所以调用HAL_ADC_Start_DMA函数。处理方式也一并写在下面所示的程序中。" s+ I1 D& k* A" x
, P- d) m. b$ h) B6 o
  1. volatile uint32_t result;
      x0 j! W0 G  S& o; J5 d+ @
  2. volatile float value;% W* J2 |& A: N/ J
  3. status=HAL_ADC_Start_DMA(&hadc3, &result, 1);. G" k: X9 k& v7 w0 \; H' f4 b
  4. value=(float)(result&0xffff)/65536*3.3;
复制代码
; g; w. C# p- ?/ R7 O
调试时可以发现ADC的值可以连续被转换。
# e7 F+ R) I7 O$ v7 h
20210704112136488.gif

$ b) n# Z! L$ r$ E0 D5 d7 O8 g+ s4 z8 Y
三、FFT; i; X# B8 j. L" _
1. 添加DSP库
) X3 E; `+ N$ {0 Z0 Q) DCMSIS包含了数字信号处理的一系列库,在Keil中添加比较方便,如下图所示。% n4 `: Q9 V$ Y- c

5 \3 I: Y+ m, f) |9 F
20210704110212638.png
5 S4 |4 W+ W2 I" e
# p4 f7 K0 T' O/ c
DSP库的资料可以在keil安装目录中找到,如下图所示。
7 r8 _/ D/ _1 _) P, J" S# z6 {7 J' ~3 u" [  M, J
20210704112010793.png

2 A, h/ P) H2 W* }, p8 N. W3 y3 `/ p' ^
2. 数据采集4 ^/ @+ u' y: i# z
采集1024组数据,声明长度为1024的float数组后,当给数组赋值,程序会进入hardfault,发现是H750VB的flash或者ram不够。后面准备研究外部flash存储数据,如果是ram的问题那就没办法了。后面就只有研究FPGA进行数据处理了。
& b# P! X! ?$ |' p* i. m% G* @- y; Y3 i! \
总结/ b/ G1 T5 T0 c5 y) F! n$ W2 Y, O
在整个过程中,发现使用6.0及以上版本的编译器编译的速度比5.0版本的块很多诶。
" a7 H* }- G, S$ d8 ~4 L) a8 ]+ D) V6 V

/ Q* s- A) U0 c, A* z
( i7 l6 d5 x3 p; |4 a5 W6 t+ ~) A) \
收藏 评论0 发布时间:2021-12-24 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

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