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

STM32CUBEMX开发GD32F303(10)----双ADC轮询模式扫描多个通道

[复制链接]
STMCU小助手 发布时间:2022-8-18 16:26
概述
1 H$ N: r; k3 V  ^本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。需要GD样片的可以加Q_QUN申请:615061293。, H7 k5 h; M/ h& a% r2 Y
本章主要配置,双ADC轮询模式扫描多个通道,通过串口进行打印。
( b. T* i2 n, i* z! F查阅手册可以得知,PA9、PA10为串口0的输出和输入口。
+ E, S. w* a: n7 D) }: A* S# j1 ]" E. U
生成例程+ M* J4 ~0 x. p2 o; l- h
这里准备了GD32303C_START开发板进行验证。
5 p# T0 j. w: n8 F! Z" d; V/ p. E
4 C: H; `, r% [# v. _ edc4150f9a0d4b2fad612de25ac8ac74.png 4 t* _& F) L* M

7 J( J) Q& a8 x; E, }- zSTM32CUBEMX配置! j. a# r; U' M' ~4 e! L+ J; n* @$ M& s
& K3 ]# ?' E5 S8 t" h) b: ^
44e940ce1b824abe99ed266d38469f22.png   n2 L+ U  }7 t6 R9 n- T: p
2 a3 f! u' Z( ^" V  ~1 Q
勾选中断。; G' F2 A2 o! f) I

# \" O+ b- H) J1 z, o+ ` 838f2d392e9948d998372216c86e4d60.png 2 b/ X2 ?1 ?( j; O/ N2 i7 d1 m
! I# K+ X5 e! o7 ~0 f; g
ADC1配置。* I$ {1 H, m7 t0 X

8 i7 [1 R  ~- O, e  M c8e7e43cee284f3a97f52ea44c812994.png ) e3 W, \1 v1 L8 V0 d; g
# w1 A8 W  t3 f& `: c& P0 ^' [
ADCs_Common_Settings:5 N+ Z& f* h) E6 Y9 [2 d
Mode:Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选,具体配置 ADC_CR1UALMOD 位。
6 g7 o- r6 K# j  b8 DADC_Settings:
7 Q# U3 q! u  E* E' S/ \Data Alignment:% ^* {+ }/ h+ F  ^
Right alignment 转换结果数据右对齐,一般我们选择右对齐模式。
+ }) m  K6 }5 J, _) y+ lLeft alignment 转换结果数据左对齐。
. l8 T: K  s4 F* ~Scan Conversion Mode:7 R6 V8 q/ U& {4 _( I
Disabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。
9 j7 V. D+ j  v, O$ ^! Z+ Y2 XEnabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。
' e! M" e; v2 ~% c3 G6 sContinuous Conversion Mode:
. v$ Q! ?( u& |) R7 sDisabled 单次转换。转换一次后停止需要手动控制才重新启动转换。
' e# F: {" w  K/ GEnabled 自动连续转换。  C% n0 a. s* r, ^* n
DiscontinuousConvMode:
" R9 s# a4 F8 Y# }Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。, `  Z- l8 V% O, n3 c9 e+ `& f' q
Enabled 开启间断模式。3 z) q# R) _4 h2 _

  \7 u5 Z6 M; i$ O) y0 Q: p6 \7 zADC_Regular_ConversionMode:
8 B% D7 e, U7 e) m2 c. y9 v; ?$ tEnable Regular Conversions 是否使能规则转换。& e/ q/ ?2 T* `! X% @; ]
Number Of Conversion ADC转换通道数目,有几个写几个就行。
. L1 p& Q: g  k, @" E1 p6 `: [2 uExternal Trigger Conversion Source 外部触发选择。这个有多个选择,一般采用软件触发方式。* R+ g0 r) ^( ^3 ?/ t* ?

6 P, [2 u: D5 L( B$ kRank:
$ s! g1 n  P2 t# E4 hChannel ADC转换通道# c: h1 p/ v( z1 v; d
Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。! a5 U- B. Y0 S
* S, L' {+ O6 }* d6 @7 O
ADC_Injected_ConversionMode:
8 }6 x1 n' {0 G4 A& U! o$ b% b# xEnable Injected Conversions 是否使能注入转换。注入通道只有在规则通道存在时才会出现。" f( x+ F( Q. q1 T9 H& m, D/ X3 \# q

5 P8 r* G' b+ E# |' N' _* _7 Z" pWatchDog:) b2 {- a; l7 Q
Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。9 s( T* w' N3 n. M6 z* e4 O4 b/ ]

% V  B# Q. N! W$ O: S% P1 v1 m- _ADC2配置。
: o" M$ `- }4 |
/ X- k2 ?& k" @, v 2e3cb4df71d34ee1a55b7f2e1b0a1d36.png 4 `9 K- R6 u2 n, Y
7 K: G8 k& j1 }; @& j5 w
生成独立的文件。  b" E* }$ G, k6 R2 O0 b/ m2 `

+ b$ `# h- r  w/ f 0ab2e1efc82b436ab05e6330529c444c.png 0 s/ F, v5 d3 W9 g* \. \: z

  w2 H& h5 v# kkeil配置4 J" \7 d$ ]  R. l$ e, O, h
microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。- O6 e, k, u9 Q+ ]- Y" N
5 l' b7 s. D. o/ K+ i: f
fe23b1a0759a4cb8843ac02dfe30f893.png : Y' m! S. y& q* I4 h* m3 U
* r# A4 W3 q7 _0 V/ l, p/ w1 s
代码
* x7 o) v* h& Q" P1 T8 [; S在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
7 t. X4 [; d6 n; E
8 w6 Y9 r4 ~' _# ^/ E8 y
  1. /* USER CODE BEGIN Includes */
    # U8 @7 q/ ^2 M+ h5 K1 ?: W
  2. #include "stdio.h"" E+ ]! R/ K5 ?3 r; S) C+ e
  3. /* USER CODE END Includes */
复制代码
" f& \5 r; N. l% {3 j" ?. Q/ C
函数声明和串口重定向:9 @! }6 C) g2 c. t! o
% R7 s% l, t8 P
  1. /* USER CODE BEGIN PFP */
    * N  X9 O' i" F' Y* o0 C! {
  2. int fputc(int ch, FILE *f){
    " a; `$ N+ w: n, E6 E% J# q3 }
  3.         HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);- c! l. b+ u3 g8 S* Z
  4.         return ch;
    , `/ B% [& _* K( s0 \
  5. }$ Q0 o2 P9 t) y# `5 I. Q, n

  6. ! }" \+ J. O9 J3 \  n; D
  7. /* USER CODE END PFP */
复制代码

8 k' T0 r! w  h3 P/ \1 n定义变量,存放采集到的数据。8 j& q4 i( I) y- Q. O
: l# A1 |' T$ @/ v3 v9 k7 j# ^& p
  1. /* USER CODE BEGIN 0 */4 `; R  A6 y+ A. F1 H+ x+ v! Y
  2. uint8_t i;! ]- H: f% x6 P+ M. D5 ]
  3. uint16_t adc1Buf[3];//ADC1数组
    6 n/ \0 i! o/ P+ z* k; k
  4. uint16_t adc2Buf[3];//ADC2数组7 D9 j7 @0 y' d9 E
  5. - m2 @  \' A  W- @
  6. /* USER CODE END 0 */
复制代码
& l9 v) f( D! r
ADC校准。6 A' p5 H  p* `! S. @! Y) c
, ~& P, c5 u8 \' f
  1.   /* USER CODE BEGIN 2 */. c  G& K  D# y
  2.         HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准/ {8 V1 v) t8 g5 f
  3.         HAL_ADCEx_Calibration_Start(&hadc2); //ADC校准! {8 w9 n6 ^3 R) l) [% X2 ~& F$ z1 ]
  4.         printf("ADC Demo!\r\n");, U9 W, ~7 I+ y6 S
  5.   /* USER CODE END 2 */
复制代码
, B; j) I6 y; J( m* y5 }* i
采集数据。
7 J9 a! H- q8 |" y% S2 T- v2 p, `) N/ @. n! Z) Q& B) B
  1.   /* USER CODE BEGIN WHILE */
    # f: p. i  d% _, P6 Q
  2.   while (1)
    8 b, T% ]) s6 d5 p/ `
  3.   {1 v7 M8 j1 ?9 I7 s; K& u
  4.     /* USER CODE END WHILE */. b6 [$ y# b- V# L& V( `* _2 p

  5.   r1 S' v8 `5 y( _
  6.     /* USER CODE BEGIN 3 */        
    0 a8 r0 S% N6 A' `0 E! t# S
  7.         i=0; 4 e  K4 D6 \7 C; D0 S8 j/ C/ C7 K1 Y
  8.         while(i<3)3 F* w/ Y: X" p, X; `6 O! m  i
  9.         {* ]/ p0 z) [1 E. L6 O8 O
  10.                 HAL_ADC_Start(&hadc1);//启动ADC. ?$ i+ H2 {$ ~
  11.                 HAL_ADC_PollForConversion(&hadc1,0xffff);//表示等待转换完成,第二个参数表示超时时间,单位ms.( F' t  y7 |/ Y/ F" F
  12.                 //HAL_ADC_GetState(&hadc1)为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。- t7 e; E, K) X+ A! l
  13.                 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))//就是判断转换完成标志位是否设置,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用7 K5 k1 @- M9 p: \- ], z
  14.                 {. ^+ I9 }6 q/ |8 D- x
  15.                  //读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.+ J, u+ u, v* B; T
  16.                  adc1Buf<i>=HAL_ADC_GetValue(&hadc1);8 t( e# C: E+ v* ~  A2 z
  17.                  i++;
    * \8 I$ r" O/ X" |3 M$ m( s
  18.                 }4 F! C) W  v& R: m
  19.          }
    : z' f6 B: m% T, k3 ?( b
  20.         printf("\nadc1_IN0(PA0)=%4.0d,电压=%1.4f",adc1Buf[0],adc1Buf[0]*3.3f/4095);6 [7 t4 L! H0 v# T- T& J0 f. X
  21.         printf("\nadc1_IN3(PA3)=%4.0d,电压=%1.4f",adc1Buf[1],adc1Buf[1]*3.3f/4095);         
    * A4 z! {4 h' {
  22.         printf("\nadc1_IN4(PA4)=%4.0d,电压=%1.4f",adc1Buf[2],adc1Buf[2]*3.3f/4095);           S) x# X$ S! L, U- O, u
  23.         HAL_ADC_Stop(&hadc1);
    & h' q8 ^' n% @$ l6 i% w
  24.         HAL_Delay(500);               
    & V3 S1 A9 b2 d! J. \* x
  25.         i=0;   B' L: n& N$ k
  26.         while(i<3)+ a0 K3 x6 b  D. G& W
  27.         {
    5 g: `# I3 u# X6 P9 S
  28.                 HAL_ADC_Start(&hadc2);//启动ADC
    8 i. G3 Z* ]) u" j
  29.                 HAL_ADC_PollForConversion(&hadc2,0xffff);//表示等待转换完成,第二个参数表示超时时间,单位ms.# E5 ^' J) h9 Q( N7 A: D
  30.                 //HAL_ADC_GetState(&hadc1)为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。! M; ^- g1 f. u* z7 j9 `" Q
  31.                 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2),HAL_ADC_STATE_REG_EOC))//就是判断转换完成标志位是否设置,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用/ W# E$ z, J# c( e8 k2 |# T2 t
  32.                 {
    1 Y% H' r8 r- N, |' w
  33.                  //读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.( ~$ K, y2 [+ H5 t
  34.                  adc2Buf<i>=HAL_ADC_GetValue(&hadc2);
    3 k$ d0 X: a2 |1 ^( L
  35.                  i++;1 V% M& |4 N4 U: j  S
  36.                 }7 e- n; r4 s) v& k7 k% d- f* b9 U/ z
  37.          }9 T+ {6 T) L* b# Y, w' m
  38.         printf("\nadc2_IN7(PA7)=%4.0d,电压=%1.4f",adc2Buf[0],adc2Buf[0]*3.3f/4095);
    3 h5 ~/ e3 k& T8 k8 o$ l1 D
  39.         printf("\nadc2_IN8(PB0)=%4.0d,电压=%1.4f",adc2Buf[1],adc2Buf[1]*3.3f/4095);         
      D4 {8 C( M* [# f- O9 D6 ?
  40.         printf("\nadc2_IN9(PB1)=%4.0d,电压=%1.4f",adc2Buf[2],adc2Buf[2]*3.3f/4095);         
    , v9 I) `' y# h; @( O) ]
  41.         HAL_ADC_Stop(&hadc2);1 T. k$ d. q3 }
  42.         HAL_Delay(500);                        . p, P" c9 e- w
  43.   }% U$ o7 p, k: W" g  D% W
  44.   /* USER CODE END 3 */</i></i>
复制代码

, t, J. Z+ ~2 I测试结果, ?9 f1 R+ Q: v# W; }
输入固定电压进行测试。
6 M5 N* V; a! J8 I7 \4 m  w
7 V' H  b6 }* H9 sADC1        IN0(PA0)        IN3(PA3)        IN4(PA4). ]/ u, \0 W8 g/ w
输入电压        VCC        2.0V        GND. [. W& m0 b6 z! v0 b
ADC2        IN7(PA7)        IN8(PB0)        IN9(PB1)
3 W7 b) V; h" i% ]7 J8 y" n% ?4 t' M& z, n输入电压        VCC        GND        2.0V
* `3 U8 V" X5 g( B* \4 u. z: d! @; g
( n4 y# G( x' Z2 l# B. J9 V测试结果如下。# z; K$ @3 \- O' ?  |

# D! J( e1 \( J0 D4 u) Q c8a0d9554a634e2b95c9a1c709b5dd56.png " `0 z' d! O6 X8 Y# @' ?" ^

+ G4 M; @" k" m
1 M0 C+ j. q  b0 A6 [) a/ `/ x: g& j/ i" j+ G1 B9 x
5 k6 ~2 ]  K- p/ C' U0 Q; k, ]2 \
赞 收藏 评论0 发布时间:2022-8-18 16:26

举报

0个回答

所属标签

相似技术帖

官网相关资源

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