STM32G系列中有一系列板载运算放大器,例如STM32G473中存在着6个板载运算放大器。9 v' f' v6 I0 `. T; e6 z1 u
, `; b# l: X2 D: G
' u% k: E6 u$ Q7 T7 r6 a7 n, k& h' F
, a' d- [% p. N: V2 y, }) C4 f
这些运算放大器具有非常多的功能,包括标准运算放大器,跟随器,程控增益放大器等等。
* }- F; {: p! v1 f8 x8 n! X" }2 T* H1 [6 R m" N/ _* ^3 ?
. s0 U$ O: \ ^! t7 O1 U" G
7 \0 `4 S! k8 s8 C. Q
8 c: o4 L) p$ F L5 h. H$ K4 V
z5 g; q0 S4 V% r
8 J) ]2 Y' W' v0 K* g" e6 z其会有三个IO配置成正输入端、负输入端以及输出。+ \2 E0 l6 y. S2 h/ o
( X# D! n5 ]9 M l同样的,这里的输出IO可以配置成ADC的采样通道。
) S/ U: A* k4 x# ^: y
7 q0 }) [+ |$ k. V i4 C
# ]$ x- y4 t5 _& r1 [5 Z
7 V- S) g6 w) i& _' J" t& V这样子我们就不需要单独的线连接到ADC引脚上。( e4 D% F& w$ r* }/ p1 m o
$ |, m) P$ b Q+ M6 ?; ^: f1 r: Q如果我们想利用其放大的功能的话,我们可以选择板载PGA(可编程增益放大器)可编程增益放大器的使用场景非常广泛,我们可以测量输出波形来调节放大倍数。
- v* Q$ N7 I, G" g+ M0 U5 @' g
2 a- _" {: k) q0 g
+ g- l* x0 E( z1 n# @$ _2 a$ E' D7 l2 J2 v$ r, \ E
3 r2 o3 t) M D2 z& ^6 [# a7 \) O H: h; ~
我们调节OPAMP的放大倍数为16倍,将输入端连至信号发生器。
6 `" e! W' Z2 C" {8 K" M' L4 q! R( M5 \. ]! K. j& A
- HAL_OPAMP_Start(&hopamp1);
复制代码 2 k0 l+ u" d: E+ Q$ j% b
开启运算放大器。9 y [9 J1 p# B) Z- i
3 H$ w' H) N% ~$ o, e
& H/ ~. ?5 e" I f
# o @# M' J% k3 v2 Q& f. n
# J# ^) g- s) f3 r: L W; C6 x
0 _+ V1 O( z' Y1 ^5 ^/ N, A& m o; [
4 R* G9 K6 X5 s7 n
# h2 j* ^+ G$ I
在2MHZ的信号下依旧保持着波形,在高频信号下由于阻抗匹配的问题会导致信号衰减,但是可以知道它的压摆率已经足够了。& g. d" @0 U* _7 o; y+ R1 I9 `
9 V( C$ M+ N4 g根据官方的手册介绍,其板载运算放大器的压摆率为45V/us,增益带宽积为13MHZ,完全可以满足我们的高速运放需求。' U M/ x- C( c" W' f6 B( X
9 D, Q8 v% I. f% G' j) f并且其内部有着许多配置,例如上述所介绍的PGA程控增益放大器,当然我们也可以在使用的过程中通过修改PGA的参数来修改PGA的放大倍数。7 G* K( y7 ~( y" ^9 h; V, ]
: e4 y( E4 B' q( N2 F! l: l- void MX_OPAMP3_Init(void)/ T* f, Q5 j [9 n% j% I
- {. N" m! U5 F" ]
, q# J7 D! Q; g( w# g. e: l- 1 m( i( w6 Y' I* e f# u0 B
- /* USER CODE BEGIN OPAMP3_Init 0 */( F& _ Q! z2 E1 e t
- - U* q5 S# g% C5 F# d' f0 k
- 7 l6 f1 _+ h* h4 ~" F
- /* USER CODE END OPAMP3_Init 0 */
* ^6 U+ `1 Y, j( {0 p
9 a, r2 N& j' m W. p2 g8 {- S: @' V
4 [9 y- a. \; a9 z3 K* ]/ V- /* USER CODE BEGIN OPAMP3_Init 1 */
% j8 |! F& _! \0 G" O7 F - ' ?+ ~* S8 w* \" P0 P# j( b: O9 G
- 6 H% F! q) K U( o! u1 r: w5 _
- /* USER CODE END OPAMP3_Init 1 */6 J8 H2 s. a2 f y1 f, |1 T
- hopamp3.Instance = OPAMP3;
+ a# i. v, f& A. u! `- e; ]8 x - hopamp3.Init.PowerMode = OPAMP_POWERMODE_NORMAL;/ v& ^8 w. `$ q. L9 Q
- hopamp3.Init.Mode = OPAMP_PGA_MODE;
) f3 A# W+ q% R5 M# L# I0 L - hopamp3.Init.NonInvertingInput = OPAMP_NONINVERTINGINPUT_IO2;
, }+ {0 Y( x% m* Z - hopamp3.Init.InternalOutput = DISABLE;( d% |4 i5 v. e, e, v! O* b' y4 `
- hopamp3.Init.TimerControlledMuxmode = OPAMP_TIMERCONTROLLEDMUXMODE_DISABLE;" S8 ~- ?- k; Z
- hopamp3.Init.PgaConnect = OPAMP_PGA_CONNECT_INVERTINGINPUT_NO;
@9 S. [* i D( p& o+ N4 a& k - hopamp3.Init.PgaGain = OPAMP_PGA_GAIN_2_OR_MINUS_1;- R; t5 P. p7 r! |! u- z
- hopamp3.Init.UserTrimming = OPAMP_TRIMMING_FACTORY;
1 W2 e& o- O8 T0 z - if (HAL_OPAMP_Init(&hopamp3) != HAL_OK), D/ {. F4 P8 q& F7 _
- {
7 {8 _" u, H3 }7 w0 G+ [' u O; O. ^% e8 a - Error_Handler();
5 K/ m; W, F! G6 T/ m' v% D - }2 ]* [( [5 D$ k' }# Y
- /* USER CODE BEGIN OPAMP3_Init 2 */
2 m3 @# \# @% C' @2 Y% w - / h+ l7 Z0 ?! B7 `
; {9 {& b* ]8 {$ _- /* USER CODE END OPAMP3_Init 2 */8 w | x2 }2 g
- ; s6 j+ [, x( H2 ^1 B( Q- l, H
$ z- B4 f- m! V# R- }
复制代码
1 i7 k- Y1 a! e2 p6 ^: q- M我们利用OPAMP初始化的方式来重新初始化OPAMP则可以修改PGA的放大倍数。
! T' [3 t% ]9 M, Y8 s- Z- M; J% n9 o" X- |5 s3 X
(以下段落本人考证补全后面验证)不过板载运放虽然方便,不过也是有非常多的缺陷的,首当其冲的便是其工作范围。STM32板载运放通常被设计为单电源供电,这意味着它们的工作范围受到了严格的限制。典型情况下,这些运放能够工作在供电电压范围内,例如从0V到3.3V或5V。然而,这也意味着它们无法直接处理负电源或超出供电电压范围的信号。这样的限制可能对需要处理交流信号或需要高动态范围的应用带来挑战。在这些情况下,外部运放通常更适合,因为它们可以灵活地适应各种供电电压和信号范围。因此,在选择运放时,需要仔细评估应用需求,并权衡板载运放的便利性与其工作范围限制带来的影响。$ h+ H) S+ [* ]6 N9 L
# k) ^: H8 k) H但是合理的利用板载运放可以方便我们的电路节省适当电路。 @5 Y; b! L0 u* f- v. v8 [
* c' H0 Z- G6 l2 N( T, J% w$ {5 r7 A8 a3 ]! r2 U: B
转载自:电路小白4 n9 k/ d8 f& Z6 C/ h: j2 x
如有侵权请联系删除 z$ K* r {' D: v# g7 j9 p1 {1 r
2 S$ ?. b! E0 B! Y4 ?
* [; N% x1 r, ^* G$ c3 d, r! w& N, F3 o
0 a8 U+ f' N6 z7 } |