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

关于STM32的ADC/DAC问题集锦

[复制链接]
zengwh 发布时间:2012-5-8 10:48
1STM32DAC转换是什么开始的呢?8 B- u# f' K. N  C( G/ Q: Q
问:STM32DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? 3 A* l9 L  R5 i0 G2 w/ _% S+ }6 A! s

! z( ]5 r+ [; b# H& k, n3 u答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。1 [' f" `. ~% l0 p& e1 h' i
, t% O; T$ g( @: M9 [# \
2STM32DAC输出电压5 j8 ~* ~1 g: j) B
3 n. B- t: T8 p) V( P* e
问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下:
8 v7 h' Z, d2 c* ?  n: O1 }
#include "stm32f10x_lib.h"% i! v2 d8 D% @3 E: s2 P  |
#define DAC_DHR8R1_Address 0x40007410
. x& q7 {  c* `' M" a
DAC_InitTypeDef DAC_InitStructure;
9 |( F+ v; t6 ^) [+ @
DMA_InitTypeDef DMA_InitStructure;
5 z. G. S9 h6 e1 \
# B5 R7 ~6 f/ J- c
ErrorStatus HSEStartUpStatus;
5 S7 m; ~; ^" d* }( ?
uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};# o1 @0 B5 y2 T8 t" c

1 v& F+ V! w( Y' F. U/ F( x
void RCC_Configuration(void);. J0 ^8 F  Z' R) i- [4 O
void GPIO_Configuration(void);
+ n/ q6 C0 d& q* V( f3 W
void NVIC_Configuration(void);6 v# Y9 ?/ q+ @4 @! N
void Delay(vu32 nCount);
! V4 b4 B0 S3 s' B

3 x6 Z2 b! @$ m3 }2 Q& r
int main(void)0 ~+ u/ \6 t  P- p  B
{0 n1 z# Y# `7 F7 i
#ifdef DEBUG
/ b8 S2 W6 k; e0 l: G* m. k
debug();5 \, z/ u6 r9 N
#endif  Q. g* A2 w; p

- V0 b0 ?" k8 W
RCC_Configuration();! \4 _3 q, z; d3 ^

5 e6 F2 I, g' T
GPIO_Configuration();8 B& V  x# T1 U1 I" }$ }

: v$ [3 x& W5 n% p% Z. J
NVIC_Configuration();
2 f8 D0 D5 F2 j; T. q

% C# _, O7 l1 F
TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update);+ p( r8 T  ]& ~+ u
TIM_SetAutoreload(TIM6, 0xFF);
, n/ G. E2 ?7 ]. B. N
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
8 M0 h" C& {: F/ a3 T7 I6 y

3 B- s% n  @& w1 H6 {$ s1 f
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;0 T3 `; I4 r1 z8 F
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  ~. R# l) h6 x; u, q; e
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
7 G4 A" L/ C& X0 W" w- k
DAC_Init(DAC_Channel_1, &DAC_InitStructure);- N* W' g7 U( U. L; D

  K; P3 }, M% F* h7 q
DMA_DeInit(DMA2_Channel3);7 N; T  t3 e5 u5 t/ R$ W
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address;
0 M. v8 R/ j4 F0 X5 J1 Q. w
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit;
2 z* G$ j5 M9 j. t1 j! m7 v
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;8 k1 n+ E, A/ C& m. t
DMA_InitStructure.DMA_BufferSize = 6;
* N. h' x% ?8 n
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
7 J1 r( r% u2 X9 \
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
, k- Y2 ^( i/ O
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
; X& E( U, Q% b( j
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;( M6 M! y& ?( \( ]$ u
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
4 k, C, o* _$ A+ \+ p; a
DMA_InitStructure.DMA_Priority = DMA_Priority_High;! p; _# z' m( t/ Z. `3 k$ Q
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;+ W; I! R: k! ?& W
DMA_Init(DMA2_Channel3, &DMA_InitStructure);& o3 t8 Z9 P8 x' r" d2 w
' q3 V, A3 _3 H) z! y0 F
DMA_Cmd(DMA2_Channel3, ENABLE);
- R+ m2 h7 ^2 a. X/ f& y( i  a, Y

, Q5 [$ ~9 z$ O6 B1 E* U0 w
DAC_Cmd(DAC_Channel_1, ENABLE);
2 H2 C3 B3 [( `
6 c) q8 O4 m/ a( R$ }5 D1 N" Y* l4 K
DAC_DMACmd(DAC_Channel_1, ENABLE);" u, ?/ u/ y' N( m1 Y/ i

3 d5 @8 Q% B! c& k5 a* P4 I
TIM_Cmd(TIM6, ENABLE);- f% B/ U9 R0 K' u' g/ r' [# J
7 z9 X1 ]2 q0 c" h( ]" l
while (1)
6 ^/ Q4 I2 \" j' D. ~( r% m3 q
{. f  d' f8 `1 c% r9 N8 B
}
! ]  F7 U* f; m( q& Y
}" e; M  ]% v0 W8 x% p
void RCC_Configuration(void)! N6 z$ {! ^7 l2 B+ m0 w
{( `8 q7 ]  v' F. _1 w! G" B
RCC_DeInit();
6 |5 U2 z' V0 s) g% }3 x8 i
RCC_HSEConfig(RCC_HSE_ON);3 j: v3 P+ R* b4 Z5 L
HSEStartUpStatus = RCC_WaitForHSEStartUp();
) V/ x$ k  }; r! \- b
if(HSEStartUpStatus == SUCCESS)
# f8 g8 B9 w$ |; r! M
{2 t- \; P: f% A- I  d
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);; e% P7 _5 W+ T7 E2 f
FLASH_SetLatency(FLASH_Latency_2);- X2 A5 [5 V# Y0 H9 l; X
RCC_HCLKConfig(RCC_SYSCLK_Div1);2 Y$ S( c6 L) Q
RCC_PCLK2Config(RCC_HCLK_Div1);8 I  E0 X; ], d% S4 V9 m: L
RCC_PCLK1Config(RCC_HCLK_Div2);9 y6 E$ e8 f4 e0 i" t  n, R4 W
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
' d4 v" y  [8 n" w5 D
RCC_PLLCmd(ENABLE);
1 u9 _+ W& {% n" i4 i5 [
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)# H% c& g& I' [& w+ [
{# `3 k. N* x* O0 v" Q' ?' L- w3 P3 `
}
) p' w9 p. r0 v. k
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
( Y) P5 `8 w- M3 e' F
while(RCC_GetSYSCLKSource() != 0x08): v, @% @3 q7 ?0 o# k
{
/ t9 r; z# i9 n5 \: j
}3 \: e% S# K( t
}& f: |/ ^2 Z* k
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
" t7 [$ b; c4 o
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
9 H0 [# V$ d5 _. _) t
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
: n5 t% F) b& _* Y( t7 \
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
. r6 w, \: D. S: f& L
}
9 s; D" h2 o" Z& @9 h
void GPIO_Configuration(void)
" n1 h" V, r. @* k5 p* Y
{
1 u. v9 P, Y  r, m+ b# S
GPIO_InitTypeDef GPIO_InitStructure;
' h1 Y* p% ~5 ]- n. O/ n9 [9 f6 v
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
$ P# D/ C% f! G5 o, U6 K
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
' `: G+ z  y; c
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
( U2 R2 `7 F! a! q/ ^
GPIO_Init(GPIOA, &GPIO_InitStructure);$ F# d7 H) c* Z4 H" I3 u
}# k$ F) d! w  q- B5 E* _

% R( ]1 ?; i! a! w% k; I
void NVIC_Configuration(void)
3 C% P5 G7 B: P; D
{
1 K) S4 S: o7 T8 [
#ifdef VECT_TAB_RAM3 n) q: }2 I$ }8 I. d' d% Y5 M
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);' v' X4 v9 S' }  M
#else /* VECT_TAB_FLASH */
  b9 z" w* a6 S) L6 F! Y6 B* J* w- ^
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
" X& i' c3 @5 X
#endif
: b3 x  W9 ~  ^$ J! P7 y
}6 f& @: ~/ e" S, J9 p6 k0 {/ o; P
void Delay(vu32 nCount)! A* V5 Y- A$ u" g3 ^# {; i
{8 [3 f% [$ i0 [: o# g0 `: X, c
for(; nCount != 0; nCount--);1 \: p' R6 D; o$ ?
}
% G# v- Y% G/ L. [  R; K0 c
输出电压为什么不是0~3.3V呢? 5 A. }1 E) Y4 G- b* n$ {3 q' e1 J
: O; s1 A; p' i5 k+ o$ \0 W1 q, I+ q
1(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095.
2 U& c. ^0 B* {( |" f3 Z6 [
' s2 {4 h4 @9 {: q1 t2DAC_OutputBuffer - 输出缓存 使能再试试
) b7 s" k- p4 N! k, g
. k& a% H( x! D3 s4 {1、关于STM32F103REDAC
1 s1 R0 j1 z, ]1 t: d/ }
3 v# s% {' h4 [9 G) _+ M问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢? : k( X: P3 L" ?1 Z% Q7 K* v6 _

3 m( u# {  F* T+ p答:2个,这个你可以到引脚图上面看到。
& w% B7 l! H1 ?2、STM32F107DAC例程都用TIMx更新启动DMA2
  E/ ?5 G" `* _% k2 z
' d5 O& K6 e. x6 G( E$ {3 `+ P4 X# h问:STM32F107DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DACDHRxx寄存器里面?该如何设置呢?: ~7 O- M7 @+ d1 I

3 F; i. P3 r* O& ]答:不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.% u# O8 Q) Q- n0 y% E7 [
1 t& g; S) R& i8 m5 Y. x
3、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?4 h5 W: Y) B6 Q0 O/ E1 j* o
问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?) ^& D1 X8 [0 `7 C3 O8 e- d* d( e+ s
答:一共有16个痛多的ADC,外置式是什么类型连接的?6 }* {% Y2 O' h6 X! e
, [' _& i( T# r/ D& J  C
答:外置式ADC型号是AD749016通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢!
. U, u( X" {: o; D# r. h! ?
4 L" l' C/ q  A答:用其他3IO做片选就可以) I- n) N9 H- V( L. x3 U
3 n7 l( a. W6 d- r! ^' J0 r& u
6STM32F2 ADC/ G% j3 x/ o0 C
问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是315285684112144480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?
6 q6 C' c5 |; W4 P. S; @1 G6 i2 k' H% f/ V  f! ]. t
4 `) |+ W, N9 o; i
答:<span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'">ADC采用周期越大采集间隔越长,这个值越小采集越精确。 规则组 此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换<font face="Times New Roman">(n
收藏 1 评论9 发布时间:2012-5-8 10:48

举报

9个回答
rovir-348745 回答时间:2013-2-21 14:39:13

RE:关于STM32的ADC/DAC问题集锦

4 H5 u+ m9 P& n5 B  U+ v+ _! ~
mark
zdh451 回答时间:2012-5-8 16:38:05

回复:关于STM32的ADC/DAC问题集锦

整理成文档就更好了!!
bkc 回答时间:2012-7-5 10:08:11

RE:关于STM32的ADC/DAC问题集锦

DAC问题一,是改成下面这样吗?
* z1 H% Q  |" A( }6 bu16 Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
- r: K$ [, i% E5 X4 K, B; u5 D                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,  
0 ?2 t. t- n' H# n: }/ v' @                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
+ x+ F$ \2 L" g# wu32 DualSine12bit[32]; & Y' O( _2 {9 _. d& F" s7 S( \
u8 Idx = 0; # ]# D1 `6 }( _& o5 q' T+ G. o
for (Idx= 0; Idx
xtx321 回答时间:2012-7-30 11:18:13

回复:关于STM32的ADC/DAC问题集锦

正缺这个呢
银洋电子 回答时间:2012-7-30 14:54:51

RE:关于STM32的ADC/DAC问题集锦

不错!要是做成文档拿就在好不过了
sxlong401 回答时间:2012-12-4 10:46:19

RE:关于STM32的ADC/DAC问题集锦

这个要看看
文琦 回答时间:2013-4-15 11:24:23

RE:关于STM32的ADC/DAC问题集锦

楼主好人啊
hhj_jstu-282668 回答时间:2013-4-22 08:15:52

RE:关于STM32的ADC/DAC问题集锦

关于STM32F103单片机AD问题 / v% [/ L( A' W; q( i
用STM32F103zet6自带AD测量一个电压,用6位半电表测得该电压稳定可靠。$ }4 k/ m3 }' }7 E# S; }4 k) g
请教几个问题:
# K: m5 E( Q$ p1 ?/ u(1)为什么只要单片机重新复位或者断电再上电以后测得的AD值与复位之前测得的AD值差距比较大?7 o; ^- s& ^3 F0 B1 Y1 O
(2)上电选择好一个通道校准完AD之后,进行AD测量时测得的值比较稳定,多次测量偏差很小,再重新配置一下之前那个的通道(即再调用一次之前配置那个通道的函数,例如ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_239Cycles5);)得到的AD值与之前的AD值偏差比较大,求解原因?
hymed 回答时间:2013-5-24 10:08:47

回复:关于STM32的ADC/DAC问题集锦

我们使用的是连续转换模式,同样的代码,其它板卡可以正常转换,但是其中一个板卡读出的ADC转换结果始终是零。将该通道配置为普通IO口使用,输入、输出电平均正常。莫非输入电压过高,将ADC输入通道烧毁了?我们是将PB1口配置为ADC输入通道,用来采集电池电压。在一次连续充电后,出现了该问题。请教各路高手。

所属标签

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