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

【经验分享】DAC 无法输出 0V 的问题分析与解决

[复制链接]
STMCU小助手 发布时间:2022-2-22 20:39
问题:
) S/ M. x& S( n" T  l该问题由某客户提出,发生在 STM32F100R8T6 器件上。据其工程师讲述:在使用 STM32F100 的 DAC时,不管如何设置输出的值,最低只能输出到 63mV,无法输出 0V,而 63mV 的电压经过他的放大电路,对产品的性能产生较大的影响。故其工程师询问是否有办法可以输出 0V?
- Y" {* d) N' s调研:
9 ^' x+ b7 `, k' Q经过对 DAC 的输出口 PA4 进行测量,发现将 DAC 的输出值设置为 0x000 的时候,电压输出确实在63mV。检查客户的程序,可以看到客户对 DAC 的配置如下:& z0 j3 G6 g9 r" B' X. ]+ r  K5 u4 `
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;3 b! l/ V* w+ K. u, J# r  r* S
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;) W6 v0 }; m, t6 _, m4 J% x0 b, L, }
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits8_0;
. a9 U/ |, D! k$ }' |! \7 h) }- n! IDAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;2 P5 f0 ^! B* V
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
" O) ^* _2 y* j( g+ I% X: V
将 DAC 配置程序修改为:
4 Q$ l) \: q+ F+ B2 c# SDAC_InitStructure.DAC_Trigger = DAC_Trigger_None;: @# w3 q! w! M, T+ z. R
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;( ?3 w" ~7 E* i, u! b
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits8_0;$ r4 F6 i( ]  g' A
DAC_InitStructure.DAC_OutputBuffer =
DAC_OutputBuffer_Disable;% y' `% o0 k, |
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
4 B6 T1 }. b3 E# \' G
修改后编译,测试:对 PA4 的电压进行测量,发现可以输出 0V 了。所以问题就是在于使能了 OutputBuffer。
7 E' ~( f) V, h+ `$ E- L+ U" f7 r0 Z
我们来看一下参考手册是如何描述 Output Buffer 的:
# a2 X7 E5 C' L' |5 I9 n
7 z' I) n' E. z- z: y9 o ND`ZI_)@YFAPVB40Z8$JU[A.png
6 R1 a/ N+ ?$ f# @; m/ d
- e9 v; y& y& O2 C0 ?可以看出,在 STM32F100 的 DAC 中,内嵌了两个 Output Buffer,其作用是减小输出阻抗,可以在不使用外部运放的情况下就可以直接驱动外部负载。可以通过 DAC_CR 寄存器的 BOFFx 位来使能或禁止Output Buffer。4 @. x* j! B+ }5 b- D9 k
: H# F; L9 |& J6 X5 M/ i0 d3 a/ b* z
再来看数据手册的描述:
/ a' `6 Y7 R/ g! z3 Z4 x
6 c7 \, U" w2 D5 R 9%OXZ]`$RG((LJ`ZE8BM)HB.png : t, d& u5 ~  ^! o( n0 N

' {7 @/ U5 M# n5 S. y+ R可以看到 Output Buffer 的位置,当其被禁止时,直接被旁路掉。% Y. K( C( n9 k1 l# z
+ `5 M) t  b1 Q9 |4 ^
再继续从数据手册里看一下 DAC 外设电气特性里关于 Buffer 的相关参数,我们可以看到:
) U% e5 P' w$ Q8 ]5 e. d# p5 T& v' A1 \3 r
~M$NXM`FHXN6K[JUP6W@}DG.png 8 |: q6 w, f- B5 Z

$ b- `+ E8 Z. B5 e$ z8 B这个表告诉我们,当 Output Buffer 被禁止,输出电压最低电压典型值在 0.5mV,输出最高电压最大值为(VREF+-1LSB)V。当 Output Buffer 被使能,能保证的的输出最低电压为 0.2V,输出最高电压为 VDDA0.2V。所以,Output Buffer 并不是轨对轨的输出驱动器,无法输出 0V。再来看一下它的注释:当 VREF+为 3.6V,其响应范围从 0x0E0 到 0xF1C 的 12 位输出值;当 VREF+为 2.4V,其响应范围从 0x155 到 0xEAB的 12 位输出值。也就是说,当 VREF+为 3.6V,DAC 的输出电压范围大约为 0.197V~3.4V;当 VREF+为2.4V,DAC 的输出电压范围大约为 0.2V~2.212V。当然,这只是能保证的数据,并不是说使能了 OutputBuffer,最低输出电压就一定是 0.2V,只是在应用中,应该以从 0.2V 到 VDDA-0.2V 这个范围来进行设计。STM32F100 在使能 Output Buffer 后,其最低输出电压为 63mV 属于正常现象。
0 v" i; h: ]# ]& e- z- B# L8 q6 n$ t, \* Q5 U
结论:6 \% H$ g2 T5 n! |4 d
由于打开了 DAC 的 Output Buffer,导致了 DAC 无法输出 0V。
8 ]: P6 `; R$ Q) {! \; |
6 x) z8 n( u/ f2 c# ^& B0 W处理:
$ Q" `  o5 l. Y/ ~! S  P禁止 DAC 的 Output Buffer 即可,也就是在配置中将 DAC_InitStructure.DAC_OutputBuffer 一项设置成DAC_OutputBuffer_Disable。1 j' x/ u1 P7 S

8 x1 x. A: V( k$ p/ K1 q
6 O+ C5 N$ u0 i: J建议:
# v' c5 J, Y, f' P) U
; R% Q: @+ k7 v5 o4 c客户的实际应用中,如果对于 DAC 的输出电压范围的要求在于 0.2V~VDDA-0.2V 的范围之内,可以直接使用 DAC 的 Output Buffer,将 Output Buffer 使能。如果对于 DAC 的输出电压范围超出 0.2V~VDDA-0.2V或者需要轨对轨输出,那么建议禁止 Output Buffer,并在外部使用合适的运放器件增强其输出能力。
: D, a# e2 T' [% o2 F6 y" X' a  c/ J8 A8 U2 a  B: E
收藏 评论0 发布时间:2022-2-22 20:39

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版