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

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

[复制链接]
STMCU小助手 发布时间:2022-2-22 20:39
问题:, W) u) s) h7 x2 C. h6 \" A
该问题由某客户提出,发生在 STM32F100R8T6 器件上。据其工程师讲述:在使用 STM32F100 的 DAC时,不管如何设置输出的值,最低只能输出到 63mV,无法输出 0V,而 63mV 的电压经过他的放大电路,对产品的性能产生较大的影响。故其工程师询问是否有办法可以输出 0V?
0 @  o* f& P* q调研:
% v, l$ \4 n9 ~. A经过对 DAC 的输出口 PA4 进行测量,发现将 DAC 的输出值设置为 0x000 的时候,电压输出确实在63mV。检查客户的程序,可以看到客户对 DAC 的配置如下:: ]$ D3 @! r' H# f* u* e$ D
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
2 m" b' }% j8 r* |. N7 MDAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;4 T" n9 G8 @9 h
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits8_0;/ D  j. N$ t- c9 {+ i2 U
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
* b7 }& |. L4 k  q) n. u; NDAC_Init(DAC_Channel_1, &DAC_InitStructure);
- j: V& Q/ U% V+ Z
将 DAC 配置程序修改为:6 K# [# k) a2 s: y& r
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;' v' z& g7 i9 D+ k7 h; q
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
6 V  @- h( c& ]/ V4 O2 L" Q/ K1 tDAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bits8_0;8 d! n2 i. E$ v% e/ r/ D* ?
DAC_InitStructure.DAC_OutputBuffer =
DAC_OutputBuffer_Disable;
% \1 _4 q1 x, ZDAC_Init(DAC_Channel_1, &DAC_InitStructure);

6 d; V0 {# S; S! |修改后编译,测试:对 PA4 的电压进行测量,发现可以输出 0V 了。所以问题就是在于使能了 OutputBuffer。+ L- n! b2 n  q1 p* ]' X
. ^2 l% }' t, f  B5 N
我们来看一下参考手册是如何描述 Output Buffer 的:
7 h+ c: i' }$ N. h' U$ K% m$ l
) k. W, @4 x/ B! d7 C ND`ZI_)@YFAPVB40Z8$JU[A.png
2 z  s. W4 U- }6 p$ ]
; _4 P9 d* U  c5 S$ A  c可以看出,在 STM32F100 的 DAC 中,内嵌了两个 Output Buffer,其作用是减小输出阻抗,可以在不使用外部运放的情况下就可以直接驱动外部负载。可以通过 DAC_CR 寄存器的 BOFFx 位来使能或禁止Output Buffer。
' E3 T5 w& j  Z* i9 }
! K7 i$ P2 J6 U8 q2 V! V7 L1 l+ d8 y; C再来看数据手册的描述:
- k& k0 H) y- C% b
0 t$ m! L# I- R( R$ @* U 9%OXZ]`$RG((LJ`ZE8BM)HB.png
  x& M. b" N$ b/ @4 l+ F$ f, ~: h( O
可以看到 Output Buffer 的位置,当其被禁止时,直接被旁路掉。
" I% t+ ]$ V4 t. ]
! c" r3 q( Q+ ?# K, F& U+ U# S( s再继续从数据手册里看一下 DAC 外设电气特性里关于 Buffer 的相关参数,我们可以看到:
0 s9 d- X) ]9 l4 }$ x8 y, Q. l
' ?  y4 I1 ^5 C6 ^+ B/ z) F ~M$NXM`FHXN6K[JUP6W@}DG.png
( f1 J8 _1 E9 S' X( E2 c  f
6 I) D& {0 G$ f0 {  `这个表告诉我们,当 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 属于正常现象。
) }  m! u9 O5 ]: J3 w* }/ X6 ^- b4 t; C' k( {) B4 g* u% Z
结论:
$ k0 e' ?* D( s2 P由于打开了 DAC 的 Output Buffer,导致了 DAC 无法输出 0V。
" h& I; Y5 p; i& |6 F
8 F; {8 B% [% F5 c9 A, `, y处理:
6 V7 u7 N7 V6 h6 w禁止 DAC 的 Output Buffer 即可,也就是在配置中将 DAC_InitStructure.DAC_OutputBuffer 一项设置成DAC_OutputBuffer_Disable。
% j  w. b" y8 A% K1 J6 G' t1 t
: C% `+ g$ X6 ], }
2 m- [5 i: g* F- n7 C4 \* v3 [建议:
3 H1 S; A/ s( M
. F1 ]% o3 x! Y9 g7 J客户的实际应用中,如果对于 DAC 的输出电压范围的要求在于 0.2V~VDDA-0.2V 的范围之内,可以直接使用 DAC 的 Output Buffer,将 Output Buffer 使能。如果对于 DAC 的输出电压范围超出 0.2V~VDDA-0.2V或者需要轨对轨输出,那么建议禁止 Output Buffer,并在外部使用合适的运放器件增强其输出能力。) Z0 E* j, `' b" u* Z' Q
# |: b- x# Y  y3 Y, g' C2 U# k4 u! Q, y
赞 收藏 评论0 发布时间:2022-2-22 20:39

举报

0个回答

所属标签

相似技术帖

官网相关资源

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