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

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

[复制链接]
STMCU小助手 发布时间:2022-9-5 21:43
概述8 U( H9 k+ g) k9 Y* W  o" v
本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。需要GD样片的可以加Q_QUN申请:615061293。
* t3 L2 }3 f/ s8 o! s" g# C! R9 n本章主要配置,双ADC轮询模式扫描多个通道,通过串口进行打印。# J" I  M) k5 O) g0 I8 V
查阅手册可以得知,PA9、PA10为串口0的输出和输入口。3 H) h: i2 q( ]6 h( Q
5 R. F0 F) v  m
0a398431e6b94d6896fddd0c4da2b142.png
3 T/ h1 T  I5 a: I
6 F7 T$ w/ C% i, VADC通道配置
@C7$U(ED{N(WYR5I9QGAHM1.png
; Y% P9 U* d" E# R3 }生成例程
; J( f& ~2 \  I8 q- j( O9 J) M! @这里准备了GD32303C_START开发板进行验证。9 r! k5 K; ?: X7 u( t
' E3 X  k+ i! _3 |+ p! L
edc4150f9a0d4b2fad612de25ac8ac74.png
9 S+ n( D$ D( S) ^9 _
7 S2 P( c0 }4 }0 e# vSTM32CUBEMX配置
. }1 H' d' z& E0 y' \0 Y" y3 C$ w  y
44e940ce1b824abe99ed266d38469f22.png
% ?8 j5 z2 S+ y! |0 B; {- M- j* N6 V# E9 [# f- B" Z# Q- j/ ~
勾选中断。
6 @( k7 Y1 N; V! v- q9 f9 f
& E/ H( @. d4 j- c 838f2d392e9948d998372216c86e4d60.png
/ ]* @& _% v: @& G2 i3 ~. O
" |1 o$ M" h  R" }: l8 E) {ADC1配置。
/ O' q) p6 O# m- C2 o
9 \; r/ C6 b, B, G) a c8e7e43cee284f3a97f52ea44c812994.png
) f8 d3 a- Q9 N: m$ D/ L1 U, A& G2 ^6 E/ H; i
ADCs_Common_Settings:
+ a, m( E- J7 q( r1 ^- ]: JMode:Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选,具体配置 ADC_CR1UALMOD 位。8 _4 R& n% k: Z0 D; R: {0 ~% \: R7 ?

- [8 x, m9 d% p9 E/ z# d: I; R6 qADC_Settings:
, `0 ?- X7 Z" o4 h$ N5 B; nData Alignment:
) o8 U  {9 z  g5 _. b( bRight alignment 转换结果数据右对齐,一般我们选择右对齐模式。
* Y& o* k0 k( e5 HLeft alignment 转换结果数据左对齐。
! j, W2 n; k) }Scan Conversion Mode:
( V/ r; c$ S$ UDisabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。! H- C$ w( D/ [7 h( z! u
Enabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。
% m# }$ u1 z7 c3 tContinuous Conversion Mode:
- k# ?: l* s. B: K8 T4 FDisabled 单次转换。转换一次后停止需要手动控制才重新启动转换。
8 Z( v7 j, F+ E: V: {) |) J  GEnabled 自动连续转换。
# I( Q: _" h+ R) D$ bDiscontinuousConvMode:6 `# ]. F- m, r( B& [/ Q9 X
Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。
8 N6 m$ H2 C* X; u1 oEnabled 开启间断模式。
" U1 o9 g. t& Y" B2 }
: R! @! q6 O% J$ l2 S( D( t" O+ @1 eADC_Regular_ConversionMode:
* ^0 t" o) X2 S. b4 D5 i! h. MEnable Regular Conversions 是否使能规则转换。- i" p& \6 m9 J8 K; _/ i  A: ^1 L; f
Number Of Conversion ADC转换通道数目,有几个写几个就行。; b. K! t. l1 ?4 c; e$ S
External Trigger Conversion Source 外部触发选择。这个有多个选择,一般采用软件触发方式。; w1 L# N8 @+ X* S
5 ]: r8 d4 ^) k2 U9 M0 f  I0 P- J
Rank:+ t, }4 N% [, g% L  f. d
Channel ADC转换通道
3 s3 t, o1 H6 h( x' a9 @# t& P7 }Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。
' x$ A" a* }% J( T! q- p  zADC_Injected_ConversionMode:
) ?- U: N+ Z9 u' o% |% h- S+ i9 aEnable Injected Conversions 是否使能注入转换。注入通道只有在规则通道存在时才会出现。9 O0 _/ g8 `( i7 s0 @3 o
WatchDog:3 _4 s) K3 S6 [' }
Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。
, G* P% U$ \2 b: v* l  g5 R6 f% V
' `: f2 H/ n  l8 A! U! }ADC2配置。
2 F/ B9 [+ v6 y9 I: k4 m! _, n8 a
7 t- n- f8 ]1 b. v( l+ H; A 2e3cb4df71d34ee1a55b7f2e1b0a1d36.png 9 G# y" \1 I& z, g/ T

( p) h2 e. \5 I% Y生成独立的文件。4 I. t; P. f& F7 T4 K3 F

% N* F5 @3 H% Q% ^0 f 0ab2e1efc82b436ab05e6330529c444c.png
! x$ f& l- r# g* h7 \
: J, U4 b  Q% U) a4 w6 fkeil配置
) A$ b7 p! A% l+ ]% }microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。+ N. @4 y/ X4 k- T, F0 V
, }) {9 c9 y$ I5 O+ E/ o6 }
fe23b1a0759a4cb8843ac02dfe30f893.png & ^5 @. h3 R2 ^2 Q3 x

* g( p) Y0 f$ A代码
4 q- b: Q) c( S4 j
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
6 h; a4 o( v( h& \& u3 n8 ~0 T, g# r- r, S* ~8 Q
  1. /* USER CODE BEGIN Includes */
    & }( I, S. S" X9 P
  2. #include "stdio.h"
    3 O; ]( U3 e. x) t/ y
  3. /* USER CODE END Includes */
复制代码
. L7 g( c3 b, j7 C0 g# a& h" {
函数声明和串口重定向:: n. J2 y) @( r% [
1 r6 y; \4 o5 I7 W5 `
  1. /* USER CODE BEGIN PFP */4 ^: p& N9 K1 o! o( U9 V
  2. int fputc(int ch, FILE *f){. S! V8 g% u6 \# ^0 J
  3.         HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    # Y' s! r, H  l) M! U$ D' b, x7 ^
  4.         return ch;
    7 T6 J& Z& D5 H, m5 \0 F, ~3 X
  5. }
    2 u9 u) y; f1 R$ h4 F6 _  b4 z$ [

  6. * y1 @) g4 k. L6 _/ T
  7. /* USER CODE END PFP */
复制代码
7 f! b' h, P. t( b& G0 C" R
定义变量,存放采集到的数据。" Z$ B+ b4 `0 b' n
7 X& J8 n3 _! R
  1. /* USER CODE BEGIN 0 */3 M- T! \4 ]% i: P6 _& O: k8 b
  2. uint8_t i;
    $ E* P. n: V* y
  3. uint16_t adc1Buf[3];//ADC1数组! T. E! I7 N4 ^4 g1 J
  4. uint16_t adc2Buf[3];//ADC2数组+ ]% c# n% n) f: e$ m

  5. + P3 o' ~+ t5 c  a4 V6 {
  6. /* USER CODE END 0 */
复制代码

2 G3 |$ o- z  g! x7 zADC校准。- d, \; v1 ], {! W0 Z% R% b1 `

1 y% G1 M* L+ z7 V/ w
  1.   /* USER CODE BEGIN 2 */
    1 M# c2 O/ d1 q8 N& M
  2.         HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准
    9 `4 l$ H. M% {9 A# q& ~+ G
  3.         HAL_ADCEx_Calibration_Start(&hadc2); //ADC校准" u8 H2 A5 g' G
  4.         printf("ADC Demo!\r\n");
    0 t8 X$ c' }! V( {, u
  5.   /* USER CODE END 2 */
复制代码
7 e" x1 O  z5 l0 I7 q
采集数据。3 P& I7 t5 u# m2 }$ G, H1 `
: T- x, f- L$ S+ c. w& g# Z
  1. /* USER CODE BEGIN WHILE */
    $ G9 V* c- m% f" i5 k$ F7 Y4 J
  2.   while (1)
    $ i. |3 Y. j. `2 C0 g# E& q( A, Y
  3.   {
      g  F' H! l+ K; |8 t
  4.     /* USER CODE END WHILE */( |: g) B1 K/ t

  5. " B0 x' H* s7 }! a
  6.     /* USER CODE BEGIN 3 */        ( @9 `8 z8 `9 c7 p
  7.         i=0;
    : Z7 n+ ]& @! ?) A, O+ ~
  8.         while(i<3)
      V2 `$ ?# q+ M. K  E$ _1 P) ~9 K! S
  9.         {2 U  [$ [$ ~8 }+ R" Z4 ]
  10.                 HAL_ADC_Start(&hadc1);//启动ADC
    5 D. I1 [  ~! n* B( L; A
  11.                 HAL_ADC_PollForConversion(&hadc1,0xffff);//表示等待转换完成,第二个参数表示超时时间,单位ms.
    : j0 s  d$ O' n2 G. S& w
  12.                 //HAL_ADC_GetState(&hadc1)为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。
    ; p7 Z, [% W* N$ Y, \
  13.                 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))//就是判断转换完成标志位是否设置,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用
    7 [/ Q( {% o) \2 R! S
  14.                 {
    5 F* K5 q) i, U. I2 }, @
  15.                  //读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.
    1 m2 _9 o3 n- X- f3 W- Q0 R0 b; B
  16.                  adc1Buf<i>=HAL_ADC_GetValue(&hadc1);* U" S# L5 s8 t$ D& G, V: e
  17.                  i++;
    ' L' {1 F9 I$ b5 Z  C
  18.                 }
    - ]) J5 l' Y  N* a" _, j- X
  19.          }  f* a" e0 ]- L7 P/ V7 R
  20.         printf("\nadc1_IN0(PA0)=%4.0d,电压=%1.4f",adc1Buf[0],adc1Buf[0]*3.3f/4095);- I9 k) w) [3 j8 [3 E6 X
  21.         printf("\nadc1_IN3(PA3)=%4.0d,电压=%1.4f",adc1Buf[1],adc1Buf[1]*3.3f/4095);         
    8 `+ P6 b- `; d9 r' ~' Z7 h- r. U4 v( H
  22.         printf("\nadc1_IN4(PA4)=%4.0d,电压=%1.4f",adc1Buf[2],adc1Buf[2]*3.3f/4095);         3 `. [& B; q( B; a
  23.         HAL_ADC_Stop(&hadc1);1 O$ R' {8 p$ V4 n
  24.         HAL_Delay(500);               
    - J3 \! W4 [5 ^; t0 u* S) N
  25.         i=0; * t; O6 ^$ P9 D$ l' p! ]: f
  26.         while(i<3), p- g4 }1 I' y9 t9 x
  27.         {
    . k; B7 {: _  |( V+ L# }
  28.                 HAL_ADC_Start(&hadc2);//启动ADC1 a. z/ C" F+ v( R8 A, ]
  29.                 HAL_ADC_PollForConversion(&hadc2,0xffff);//表示等待转换完成,第二个参数表示超时时间,单位ms.- H# Y# Y/ H  j. @+ b# b8 N
  30.                 //HAL_ADC_GetState(&hadc1)为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。% g# P1 d& e! X9 {, n
  31.                 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2),HAL_ADC_STATE_REG_EOC))//就是判断转换完成标志位是否设置,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用
    2 l9 i+ `  O' _/ o/ v5 U% L7 j
  32.                 {
    & Q* p/ a0 s9 v9 t/ ?1 K! @; ~5 M) v# P
  33.                  //读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.
    5 c; c* v/ T0 {9 O: ]
  34.                  adc2Buf<i>=HAL_ADC_GetValue(&hadc2);3 Y' K% }( W  f# x! v- C9 g
  35.                  i++;2 R- ^: d, s; e4 U
  36.                 }
    & e4 W5 L0 u$ H  j+ L
  37.          }
    0 }" v* K- M& H3 |8 Z4 }& A
  38.         printf("\nadc2_IN7(PA7)=%4.0d,电压=%1.4f",adc2Buf[0],adc2Buf[0]*3.3f/4095);$ r5 `: v0 |3 a1 i# U' s. c
  39.         printf("\nadc2_IN8(PB0)=%4.0d,电压=%1.4f",adc2Buf[1],adc2Buf[1]*3.3f/4095);         
    7 R: p2 i% u8 n% |+ J( i5 U
  40.         printf("\nadc2_IN9(PB1)=%4.0d,电压=%1.4f",adc2Buf[2],adc2Buf[2]*3.3f/4095);         
    4 c. }9 |2 F6 S! c& t) t
  41.         HAL_ADC_Stop(&hadc2);. ^9 [2 y7 @! S% u; S/ X0 C6 A- v
  42.         HAL_Delay(500);                        - p8 s5 I0 ~8 h( ^
  43.   }
    . @$ I4 {8 q3 g. Y9 h7 K
  44.   /* USER CODE END 3 */
    5 Z1 v7 v" }" n3 J' x% l% C7 [- G
  45. </i></i>
复制代码
3 \% I9 j3 [* m" Z) J3 L( z
测试结果
& A" W6 e1 U  T. {' s0 w( r输入固定电压进行测试。7 j/ h, t! C) L6 D, i5 @" E' M: P
8 d1 b: I# D% j, U, ^
{0]VZY%M6WG_)F`W~[VVCJ4.png
9 V% Q$ g& m7 X: s% ?: M( n! N
. X) X7 ?) w5 G' H+ D/ ^测试结果如下。
1 ~  ?# ]- |6 U+ R. z6 c( V, W& x: M+ ]/ K; ]& {5 u
c8a0d9554a634e2b95c9a1c709b5dd56.png / @5 O3 ^# k+ A3 i1 s+ t* b
+ b+ ?; _! t% n0 Q9 s
————————————————
# f) p2 o  @9 s& R! ?, P& T版权声明:记帖
5 E# g8 i/ {/ Q; P6 c3 V3 B; U% [5 T% L2 j0 f4 W7 r! O

( G! F7 P0 P/ K1 x" B+ q6 Z7 k- o
4 V6 X1 H4 A: ~4 m6 {3 _; ~6 ^) Z
赞 收藏 评论0 发布时间:2022-9-5 21:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

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