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

【经验分享】STM32Cube HAL ADC

[复制链接]
STMCU小助手 发布时间:2022-4-7 15:52
实验内容:使用的ADC单通道采集,实现引脚电压的采集并通过串口打印至PC 端串口调试助手。
1 {- |0 ?, `+ Q6 E
4 g! W8 a, m. I. q/ Q& j+ V一、原理图) n' n; e2 V' Q% s% N4 S
. ^- X' I- z4 _0 T8 \7 P4 {: ~
K_8ZFRZTSJY7IY444870WAT.png
; O6 g# M/ K8 X! U
$ c* Y; y% T' z8 G% I二、 CubeMX配置
: m8 e2 N# Q4 B' B
; f7 p+ q  d. e7 A) J' b/ z0 hStep1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。* D; \) V$ f. |' Z  D! \* d

6 e' L" x$ y3 y J1YY8KJ84GT]AK8{AKCFNO0.png
+ N4 N5 I1 D( s! n
" O" M( `; P: N  O Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。
* m8 o  M2 W! X1 d6 b0 I- x; s1 J2 t: \+ w) ^4 o" C9 }
TY5%PNVDOFHII{Z~FJ1DR94.png ( j3 O7 F  E- y9 z

; O! F  d* A" E: g1 Y 8{VI3XV$J9HA2$K2L@XG.png
$ u. g/ X/ ^4 G2 X6 U% t* @
9 f+ R9 R2 @0 J0 ZStep3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。). ~) r/ u7 x1 c; _: b, T# r

1 B: p7 h2 a7 `4 l1 _$ X7 H! L _YENG7W_DGM@YY1G[~5T_OM.png   A2 Y4 I$ ^) Q

/ f6 k* D4 u3 y1 y+ B+ OStep4.串口配置(主要为了在串口调试助手显示测试的时间),因为没有用到中断和DMA所以我们就不过多讲解。" B6 m5 ~( J  C
1 @- k! B# ^5 t+ z( \
BDG@}R[H5YUZPX%RLHMJVQT.png 0 @+ j; r! x" `% f5 u* U

+ w* ?( x4 ^7 H$ s/ B: j, c PAK3`EN27{7T1FBSKI$_QOH.png $ H$ o7 \% I9 X/ J: L

0 p1 o" w4 [! W* l+ _Step5.ADC的配置,因为就使用一个ADC,所以工作模式选择独立模式,如果使用两个ADC时,是双模式,双模式还有很多细分情况。对齐模式,我们一般使用右对齐。ADC扫描使能与否,取决于你是否使用多通道。连续转换使能,因为希望能够不断的转换而不是转换一次。正常转换是使用的规则通道所以需要使能,通道数目就根据你实际使用来填写,多个通道还需要设置优先级,来决定转换顺序。因为是通过转换完成后进入中断以后获取转换值,所以还需要使能中断。(rank中还可以设置采样周期,我是使用默认1.5周期,这里的周期1/ADC_CLK,ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M,我们配置是12M,采样周期1.5周期,转换时间:Tconv = 采样时间 + 12.5 个周期,所以约等于1.17us。)
4 L/ `4 p& F! d! @7 A: M; b; f* W5 _
JZB09%OH`4ZST4R(OW}S981.png / N: W$ i! [7 D8 Y: G2 L& F4 b
& ?- }9 h0 R( R* q. H8 `0 |8 F
$ u! d' f& ^' Q; S! X( Z6 s
Q]OQSVYMP7FFA)%)%W~%X3A.png
1 F5 |1 [! Y$ [* v" S2 ?
. r) q6 R$ U0 D# a6 J: z7 F
# R1 k. ^( x( _0 r& M  到这里关于ADC参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。6 g+ D4 R' v) p( A; F3 ^3 ]$ w
0 V& J5 T9 [+ [3 ?' B. n
三、添加功能代码
0 O& \7 ~/ r9 V$ o" u& f' k) @; Z1 c) H' |# {
1、我们等会会向串口调试助手发送数据,进行实验结果的验证。 发送数据我们采用printf函数,所有需要重定向c库函数printf到串口。注意使用时需要在keil设置中勾选微库(use mircolib),同时需要添加头文件#include <stdio.h>。重定向代码如下(usart.c)7 M, C: t* @; M3 c/ J! [! F7 X

0 z' x7 h. ?5 l( b- ?/ n! `5 O- Y, d/ }
  1. //重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
    4 }# }: ?: x& T- n, h
  2. int fputc(int ch, FILE *f)
    8 ~/ ~, F+ E- }0 c7 z* v; s
  3. {
    0 \% p  ^' ^- v- ~' o5 C4 f. l
  4.         /* 发送一个字节数据到串口DEBUG_USART */
      J& Z8 a2 q2 e" R" p6 q) C- g
  5.         HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);        - M( y  }/ e9 H' Q( m
  6.         
    " Z/ C  |2 H, T+ x' t' Y1 @0 L- c) S
  7.         return (ch);
    * b% c  C0 E3 s
  8. }
    4 T0 O+ t4 v& \7 d
  9. ; o( m! |: w+ m* T5 c
  10. //重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数- K/ u/ G+ B) C# `3 ?1 t9 W
  11. int fgetc(FILE *f)) q3 m1 V0 U# D' \- O
  12. {               
    : P) E. Z( ^* ?4 h0 A/ I
  13.         int ch;3 g; E0 H2 U8 A5 B/ ^9 Q: ?
  14.         HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);        ' A" B: r, t9 |) e4 v/ @0 F
  15.         return (ch);! Y& j* @- l! o; z- j
  16. }
复制代码
5 ]# w; J3 X. P2 g6 C% |8 V

7 s5 ~, C$ I+ X! s- Y  2、定义相关变量,以及使能相关ADC和处理代码(main.c)
$ R, {4 U; U. G* ?% |1 P* y/ }! ^& Q7 S8 A+ N
  1. //全局变量/ _0 Z2 i7 P. G3 r% u" F/ B" ]" m  U
  2. uint32_t conv_value;//用于存储转换的值
复制代码
  1. //使能ADC及中断
    & N) J& k. i1 k2 u% m3 C6 m$ L% m. U
  2. HAL_ADC_Start_IT(&hadc1);
复制代码
  1. //在WHILE(1)中,输出电压值+ r; O2 ]6 Q& p! H9 \8 A! C$ H
  2. while (1)
    ; ~1 B' q* u# Z4 U2 D
  3.   {
    4 C! \4 Z4 R/ k, m0 ~0 X, e: e3 r5 l
  4.                 printf("\r\n电压:%.2fV\r\n",(float)conv_value*3.3/4096);//输出电压值) V3 D3 P( W" E& Y2 W1 Y
  5.                 HAL_Delay(1000);//延时1秒0 ~( f8 Z7 U. P0 p& {
  6.   }
复制代码

; ^! ~) F) ?7 C0 I( n: f3、中断回调函数(转换完成中断)(main.c): S' a/ t/ L  z# ~( _- v0 W! O9 s6 z
8 \6 ~$ a2 n/ {* W+ j
  1. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc), X, m6 p" w* y& \
  2. {
    $ W. y* R6 a" m9 }: D. q2 t2 V. @
  3.         conv_value=HAL_ADC_GetValue(&hadc1);//获取转换的值* p/ l# y& Y$ S4 q0 F
  4. }
复制代码

, U1 x1 G. u& y- B" [( R  p ADC单通道的转换需要注意几点:5 ]8 Z7 N4 Z) c2 c1 {9 C+ J
$ F* o  _: {! ]8 J6 p
1、电压的转换,因为我们ADC的精度是12位 ,所以模拟电压经过ADC转换的以后,是一个12位的数值,我们使用串口打印,为了提高可读性,我们会通过公式转换成模拟电压,同时也能验证是否转换正确。我们一般在设计原理图的时候会把 ADC 的输入电压范围设定在:0~3.3v,因为 ADC 是 12 位的, 那么 12 位满量程对应的就是 3.3V,12 位满量程对应的数字值是:2^12。数值 0 对应的就是 0V。 如果转换后的数值为 X ,X 对应的模拟电压为 Y,那么会有这么一个等式成立: 2^12 / 3.3 = X/ Y,=> Y = (3.3 * X ) / 2^12。! M8 Z( J9 x1 L

5 Y7 f+ I; z, N7 m2、转换周期的设置,主要是通过设置采样周期、ADC时钟,我是使用默认1.5周期,这里的周期1/ADC_CLK,ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M,我们配置是12M,采样周期1.5周期,转换时间:Tconv = 采样时间 + 12.5 个周期,所以约等于1.17us。, C+ N2 f' @4 y; e" e
  h; J5 l9 b4 U) F0 h/ t
+ F" k4 G  b% u" ?4 c, s- x
赞 收藏 评论0 发布时间:2022-4-7 15:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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