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

关于STM32的ADC/DAC问题集锦

[复制链接]
zengwh 发布时间:2012-5-8 10:48
1、STM32的DAC转换是什么开始的呢?
) G5 Z8 j7 s7 \9 w问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? ! x6 q( o% x! ^- x5 ^( m
' h+ ?% n3 @* m
答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。9 b7 Y: {* S/ F4 h
( _  X8 q# C7 f4 Z( }, @9 \0 D  T
2、STM32的DAC输出电压8 u8 h$ H6 T# a3 k

! R7 z: q! J6 {% a5 M问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下:/ l  G0 U' C. n) S) `- t
#include "stm32f10x_lib.h"7 P# ~: n& u5 T: i; I# c2 L" E
#define DAC_DHR8R1_Address 0x40007410
4 F4 f8 A; r$ D- g# `2 Q
DAC_InitTypeDef DAC_InitStructure;& U* C4 Z; S- Y# f  H6 Z
DMA_InitTypeDef DMA_InitStructure;
  ?& D; f" ^; G/ w: j# ?

% H: `3 }& d& @( G0 i& F
ErrorStatus HSEStartUpStatus;, N' t* D/ l' S6 ^5 K8 m1 m7 Y9 ~
uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};- s- j% ^$ V$ J0 e- |3 w

, A2 N! p5 \3 I5 m# k0 [1 w
void RCC_Configuration(void);
9 T% v+ a: M/ ]9 g/ Z; J& v1 O
void GPIO_Configuration(void);
3 r; t" I6 n1 \- l
void NVIC_Configuration(void);+ z# F% q" Z6 }9 g. U
void Delay(vu32 nCount);/ `0 g. f, H: ]. y. [
1 r- _3 [/ ^( r. i7 p0 f/ }
int main(void)
( ^' c' n. a' n' I; S& A+ |
{
1 y# D" S+ X8 M. n) j
#ifdef DEBUG: o) p, }) e: N2 @; _
debug();
! u, a" z  Y5 W8 y( F0 h- t0 O
#endif
( o3 t4 y! a0 E2 x

3 n: W: C' g8 X& {
RCC_Configuration();& `  n: U: \; F- X& o( j. g

2 v' z8 x% H' m
GPIO_Configuration();$ l( S' \- ~; _& t: t1 ]' W/ \
* B/ z, Q# T4 S8 L$ Y
NVIC_Configuration();* V6 |+ h- e9 l8 O4 {0 g
; A! p5 |. a9 V: q8 I
TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update);
8 ?  A1 G' R% f5 i& H+ j+ T* A% U
TIM_SetAutoreload(TIM6, 0xFF);/ A3 U0 Z* @/ c$ P7 j2 U  l! n
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
2 D9 X0 \3 j+ r
  a* R& p* j/ R6 r" v) R( W/ G  B$ i
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
' ~' f, [  }7 E. r% {3 g8 Q7 q
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;! _9 k; D9 ^+ V* p) U3 t( {9 c
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
% \# i0 H2 D% g2 P
DAC_Init(DAC_Channel_1, &DAC_InitStructure);; |; J! O) n: K+ f9 Y; ?
" q# t, U* M% V+ y6 |: }  m
DMA_DeInit(DMA2_Channel3);
: h) n# T  V0 d0 x+ I" I! o8 T
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address;
; C* ]; H" t9 d6 D1 P9 f7 o( h
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit;
+ e$ h% |+ |3 ]; B) ^' Z
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
! N+ q6 t" N: a2 |
DMA_InitStructure.DMA_BufferSize = 6;3 D' C, ~3 P6 b
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
* v2 s! y: z8 w& K/ i% B
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;: ?% d6 b+ Y* j6 w0 Q( N
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;" k' l: t+ ^- o: a1 R
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;( x1 Y9 G9 g' g- I8 }% |; f
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
. Q8 I7 w9 C. @
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
7 Q  V4 B) e2 D( K' v
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;- p. ~2 s: I+ m8 K! D/ N
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
6 l& q, Q( {: H, M0 h

: T" c0 J* H7 }) u. ^" k
DMA_Cmd(DMA2_Channel3, ENABLE);
6 }8 h6 _. e3 o- B& I

' H$ E7 D; L( U+ z4 n& ?) h, t1 x- J
DAC_Cmd(DAC_Channel_1, ENABLE);: j  r% j' {. A" s
, a. `0 \0 `9 l; _3 Y- E0 L
DAC_DMACmd(DAC_Channel_1, ENABLE);
, ~* g2 ^6 O. h5 `8 G- I. o% t

8 @) v' L% C( B0 [
TIM_Cmd(TIM6, ENABLE);
7 p4 c7 E' U. F+ u" ~4 Y" G3 N
! ^: Y, L( r- b. O' V' a
while (1)
  ]+ r, S( g( i9 Y
{
( g* j; ^2 k- W' B9 @' p
}
- R2 G3 I/ W/ U- ?4 }
}$ q- M7 q3 Y! Z# u6 R' ?0 H
void RCC_Configuration(void)) e" k% O1 o/ T8 n* A3 \
{1 f2 E* V' h! V7 z. J. V- z
RCC_DeInit();
; _* [* x3 k9 y
RCC_HSEConfig(RCC_HSE_ON);
! A4 X. v) r- c9 \$ H9 n
HSEStartUpStatus = RCC_WaitForHSEStartUp();
& D2 L" x9 I5 a: J
if(HSEStartUpStatus == SUCCESS)
. r( R7 x. R, m; k# Q- R3 x
{0 W; f; @! d2 V) H) ^! @
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);" {' v2 ~) \8 ?1 \7 q2 A
FLASH_SetLatency(FLASH_Latency_2);
3 ^. {6 T2 L- b
RCC_HCLKConfig(RCC_SYSCLK_Div1);
" k4 e& _$ s: `/ o
RCC_PCLK2Config(RCC_HCLK_Div1);; @. X" G- l6 G4 s( ^
RCC_PCLK1Config(RCC_HCLK_Div2);0 M1 u9 O' s0 F: B6 Y9 T
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);9 d3 ~5 i6 Y: L: N# D
RCC_PLLCmd(ENABLE);
  q9 K6 @$ }/ I& h% [& X* D) f- O8 G6 f
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)) A) k) y$ {- a7 |
{
# `" Q3 @/ u/ w; m
}6 c. }6 f: W, ]- V* x5 Y
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
- Q- U. H" b+ |, v. I* B
while(RCC_GetSYSCLKSource() != 0x08)
8 r3 V/ O& D. o5 l
{% n) o$ f9 P7 n
}
1 ?2 y" r0 q1 s" I/ V) O
}
% j8 p* r2 [8 \3 _! i. S+ M
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);1 T* e% y1 ~4 b
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);6 J5 y% ]/ Y1 u1 E& h: e
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
+ B) P0 t. |  z- B! T+ w. Z  a
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
2 J  `& o0 q; m* R
}* d& A8 k+ {* G; K% J( l- ?
void GPIO_Configuration(void)
* r) ~0 E2 I$ @6 @
{$ y3 @9 Y7 f7 J* V% r) G
GPIO_InitTypeDef GPIO_InitStructure;
0 `7 q, ^  \/ i4 k9 I$ e6 f  p3 U* O
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;5 ?: d% Y) ~8 z: m2 }
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;1 m- p* V( ^* }
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  K) T# _( E9 p% Z  e# l; x
GPIO_Init(GPIOA, &GPIO_InitStructure);
4 h5 a8 L2 R: J" m
}5 D  \; J( a; D# j

+ ]5 E# b: C  V) g+ j) ?
void NVIC_Configuration(void)" E; o5 m1 O8 A+ h9 N; B& g
{
. M1 y% _( h% r' Q. d6 k9 P1 J' [
#ifdef VECT_TAB_RAM% p" \9 f, U8 s4 m9 X3 k
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
0 U. w. C; Q7 O4 ~
#else /* VECT_TAB_FLASH */
4 k  k3 ?; a0 r) g9 ~- u* ]$ f( I
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);/ A& X8 j. `  w9 n
#endif
( Z: I4 a, a- s( s
}3 Z) L; E5 @$ H1 i
void Delay(vu32 nCount)
7 C4 w) `3 {& V! c2 ~# d
{& G/ A0 O  b, h" B: v% g" x$ v
for(; nCount != 0; nCount--);/ e# Q% U2 \4 c+ D
}
" O: y0 V* [3 T( U$ V3 ?4 r
输出电压为什么不是0~3.3V呢? / _3 A7 G2 ~7 r. `6 c5 I

, p2 v, N( k$ C0 p0 }. S* C' M- P+ p答1:(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095.+ ~/ ]4 Z! w. `
1 z5 V+ G# D1 F0 `! @  X
答2:DAC_OutputBuffer - 输出缓存 使能再试试9 F4 [5 ]/ F% f

( L6 l3 y8 \4 L1、关于STM32F103RE的DAC& T, S# M8 x, d: Y

( K+ u. N$ M/ a) a3 |$ A0 h问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢? * h, F# n% Q2 t
3 g2 Q! n! c: z: g* e. o
答:有2个,这个你可以到引脚图上面看到。
- P% ~3 ^& l. Z0 [& ^' r2、STM32F107的DAC例程都用TIMx更新启动DMA2- Z9 x) a) c3 N  {

$ y2 H- A# C  F% H" a, ~4 H2 V问:STM32F107的DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DAC的DHRxx寄存器里面?该如何设置呢?
. {* _: N# C  O2 E# |
$ O. f4 I4 W+ s) X答:不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.- S6 C; Z* s& h# t4 v$ l- M' X; @

9 |5 [1 H$ f5 ^2 `, \3、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?
& e6 O4 U4 i( P- n% a  f1 @2 p问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?* V' B6 O2 S5 X
答:一共有16个痛多的ADC,外置式是什么类型连接的?" {0 N  p8 t( _! n$ {

8 t' d6 I/ L( u# e
答:外置式ADC型号是AD7490的 16通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢!
; q5 e; O) [7 _3 z3 A8 A, V& J9 Y( R8 B) ?7 ~
答:用其他3个IO做片选就可以
. f3 o" ?5 F& g, y( k9 o9 L
$ n- y" R4 W1 f' D
6、STM32F2 ADC
& @% D+ R7 c: y, I& r+ K& B1 p问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是3、15、28、56、84、112、144、480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?. x9 b/ U% d; V% p* E, {# q9 c
0 B$ O: U3 R$ {& c9 L0 K) o4 F

" T" y8 E: \! c9 P答:<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问题集锦


. F% `. S0 I; B" g1 |; l- vmark
zdh451 回答时间:2012-5-8 16:38:05

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

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

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

DAC问题一,是改成下面这样吗?
" t. R8 X8 @+ f) m5 Zu16 Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
8 M' _' J% g; ]  G                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,  " [9 u8 o" z  Z2 `: w
                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647}; & G8 L" ~6 {. e4 z, F
u32 DualSine12bit[32];
+ J# v8 L: I: Y' H+ qu8 Idx = 0;
" u" H( ^1 n. Vfor (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问题
- m/ `! h1 r/ B0 E8 C 用STM32F103zet6自带AD测量一个电压,用6位半电表测得该电压稳定可靠。/ j7 k4 N$ o' n
请教几个问题:
; J" F$ \, |8 M$ Z! S" v2 E4 T(1)为什么只要单片机重新复位或者断电再上电以后测得的AD值与复位之前测得的AD值差距比较大?; f9 |  _- t3 I6 `5 x+ u6 N" ^
(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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版