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

【经验分享】STM32H7 ADC hal库

[复制链接]
STMCU小助手 发布时间:2021-12-24 19:00
前言  ~$ `* n7 @7 V: I" b
使用STM32H750VB作为主控,使用stm32cubemx配置工程,在单通道对ADC通道进行采集,预计对通道采集1024次,然后对1024个数据进行fft。
+ j2 l, }" l' N4 g
) _  I: a6 p6 J! Z# ^  a6 m# h一、配置
( H: F0 Y8 c3 O7 O1 Z1. 时钟配置
& ?% j6 H4 k9 T& E; m在cubemx中配置,RCC中采用外部时钟,外部晶振分别为25MHz和32.768KHz。时钟树配置如下图所示:
" P/ q1 ^/ a2 d9 v0 S5 r& |5 m  X' [& N" k6 M% a' Z( ^6 J
20210704095938344.png
2 m4 S" l; b1 D" l, T5 R
0 M2 U9 @% y# V' G7 G4 I, V* d0 u
20210704100011534.png

/ M4 q/ k* k# h' Y9 c- k3 p1 k: O# Y9 H: a% y, e- }2 U: s
ADC时钟频率为150MHz。! j, \3 k! z& M8 o: L0 u
7 {$ \. o+ x- b: `; M" `. r" m
2. ADC配置
2 g2 T  _0 r) ?% b选用ADC3中的IN0,其他的不选,具体配置如下,根据下图计算采样率首先,ADC的时钟为150MHz,时钟分频8分频,然后采样时间为32.5个时钟周期,采样率约577KHz,实测采用8.5个时钟周期也可也,但是时采样率再高就不太行了。
* W) R4 m% N' Z4 e1 f( p, p0 X7 t, l1 q
20210704100216440.png
6 i7 T, V$ B7 [; g4 }. T$ [' K

9 q- ?/ W' I) `3. DMA配置
0 {( Q- _1 {5 U/ ~  ~/ Y1 ]" ?DMA配置如下图所示,由于是连续采样DMA配置为循环模式,同样,在ADC的配置中的转换数据管理模式也要配置为DMA Circular Mode。数据宽度选择half byte,在Debug中选上串行线就行。至此在cubemx中的配置完成。  {! v) u3 R: i& s) f5 h" k* H
% S. ^+ B2 s) j8 @9 h4 _. Y# |: y. x
2021070410290080.png
7 b- z/ G( k2 J& N5 S
. W' N' d9 ]8 c$ S  _' R7 u4 j
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。* N! x. w. r/ I! G
9 a) J* k+ P/ }3 B) r
二、工程4 f/ ~& p6 `" r2 R% v: n
1 . ADC测试& X" ]+ d$ J' m
cubemx建立的工程已经包含了对各个部分的初始化,查看与ADC相关的函数。然后选择调用函数。首先进行对ADC的校准,如下所示。校准函数后面的两个参数可以在函数定义上面的注解中找到。
' H" p& _& i% W% g9 {# s7 i, A  s/ j7 O! o4 N) _
  1. volatile HAL_StatusTypeDef status;
    9 d6 q5 P) P- F7 {
  2. status=HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED);
复制代码
, w( ?2 R% l; J
20210704105245249.png

. Y; [4 w  P6 D/ l7 f5 i: k- g  G
4 ]) B8 d0 I6 R, k/ M/ E然后开启ADC采样,由于是使用DMA方式,所以调用HAL_ADC_Start_DMA函数。处理方式也一并写在下面所示的程序中。% V* W2 x+ H4 N

) h! H, X( W. ^: z
  1. volatile uint32_t result;
    ! y4 r, ]6 H  k, g& Q- ^
  2. volatile float value;% ]) N2 ]$ K% V' z/ i& A8 A6 Z- o- ]: G
  3. status=HAL_ADC_Start_DMA(&hadc3, &result, 1);
    / n9 n/ @! s7 J7 }
  4. value=(float)(result&0xffff)/65536*3.3;
复制代码
5 \% o% }9 }3 F5 j
调试时可以发现ADC的值可以连续被转换。4 \! M' v8 i: c' N" k
20210704112136488.gif

' v! S3 t* T7 \6 }/ V% Z" ^1 }& \
三、FFT0 R5 D1 x9 I$ V9 {5 g- ~
1. 添加DSP库6 @3 F. W: v# L$ p; N7 V% f- S& _
CMSIS包含了数字信号处理的一系列库,在Keil中添加比较方便,如下图所示。+ [3 X" Y% h* i. ?9 m5 E3 G

3 ?. s) D) o2 e4 D
20210704110212638.png
+ Z0 G. ?" n; A8 L
- q* _6 o" G1 K# c' n( z
DSP库的资料可以在keil安装目录中找到,如下图所示。; t+ s! r5 A5 K7 h# C' n" b
1 K; K7 ]' b4 \$ x: C
20210704112010793.png

7 ~" H9 w- N5 _) Q
! N. a/ m" U) G2. 数据采集
8 u' G, z6 R+ Y0 S1 E采集1024组数据,声明长度为1024的float数组后,当给数组赋值,程序会进入hardfault,发现是H750VB的flash或者ram不够。后面准备研究外部flash存储数据,如果是ram的问题那就没办法了。后面就只有研究FPGA进行数据处理了。2 P7 G& P5 w' j- }# C; P

+ b& I- F9 n+ M( \. G7 _总结9 Q$ s3 o6 ]1 K. T% i
在整个过程中,发现使用6.0及以上版本的编译器编译的速度比5.0版本的块很多诶。
" {) `, s: d+ t$ A5 T$ E
" \( u5 ?3 o* P5 B
/ n5 |' J% ?* o2 W' t+ f* M( Z' J
赞 收藏 评论0 发布时间:2021-12-24 19:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版