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

关于STM32的ADC/DAC问题集锦

[复制链接]
zengwh 发布时间:2012-5-8 10:48
1STM32DAC转换是什么开始的呢?( o8 `4 [3 y$ g, k' y# ^
问:STM32DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? # \; R. f+ K& I# L, V& E- h
7 `) y4 G3 |; r- |& z
答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。% T9 G: I9 S. N$ f' Y! g4 G5 }
4 D/ A, L# h% L% s, a/ o4 d
2STM32DAC输出电压
( }) w" a6 e$ p6 @; b: {& Y9 [) U( G! G  E, m
问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下:0 V) U  M+ v9 T5 {
#include "stm32f10x_lib.h"
5 o5 s4 q9 n: m! N3 l
#define DAC_DHR8R1_Address 0x400074105 p6 T+ R; M% {) R# p, a
DAC_InitTypeDef DAC_InitStructure;# z, `. Y& D% P5 O7 K. ^
DMA_InitTypeDef DMA_InitStructure;
( d5 B" Z3 F7 W  x. ~+ Y; t9 N8 ~

" h# A2 ]8 k% d) e' p  p
ErrorStatus HSEStartUpStatus;
( T) T2 c% V. d9 ^! r8 {* M! ]: `
uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};2 ?$ ]4 m) w' Q/ c6 r5 h

# `& K' l' J( ]. A* P
void RCC_Configuration(void);
/ x* V4 D% H! ^0 v
void GPIO_Configuration(void);( ?& b3 S  q# S. {+ Y
void NVIC_Configuration(void);5 o% [; Z" ?, A1 T( {# z* ]
void Delay(vu32 nCount);4 T+ ?5 _9 h9 z9 e
( I) q1 X' u# h
int main(void)' F# T/ @& L9 ~6 S2 {! l
{( l' N7 z. |, y, A4 _4 n! h: b5 [
#ifdef DEBUG  Y4 ]+ e4 k9 b. O  d
debug();
* m+ e. f4 |4 L
#endif
" l8 E# C+ \; b5 F+ l9 Y

8 F, a8 J! M: A7 L
RCC_Configuration();1 R4 A4 }- M1 H. R

3 v. `0 i% w1 I  c8 q% `
GPIO_Configuration();
, `- f) |( f: Y( T% A

+ I& V* |/ |7 R+ u4 C4 h1 T  }8 Z
NVIC_Configuration();
- n/ m7 n, T0 C! @

( ^3 x  }$ k4 [' E3 o/ J. T. N
TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update);
: u% g7 f  j5 _+ h
TIM_SetAutoreload(TIM6, 0xFF);
" y7 V7 E9 q( v6 }+ I) x+ [& G
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);7 \. Q$ @/ e* |  p$ v" \4 |

4 U  d. C3 {! Y
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;! j+ j4 H. Y1 d9 n
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;7 P7 b' |) P' s9 ~0 E
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;/ `  |5 y3 f7 C* E/ R
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
3 f8 H% S8 c7 ]1 L9 o& s" l$ u3 N

2 b8 w. K; W0 c
DMA_DeInit(DMA2_Channel3);+ N9 q1 S% Y; h0 X7 y/ k: I
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address;# o1 Z5 Y9 i/ j. \
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit;! A5 _2 r( L4 d9 I: G# K% J
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;; w1 i  Q; C7 l
DMA_InitStructure.DMA_BufferSize = 6;
2 X: P: K6 s# k! h% L/ j
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
1 u8 S% e1 s0 u+ K: l! B( M
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;- V  O6 k+ w* N# s
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
: [+ z' a  ~) H& e7 g& t$ A
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
. W+ a) _  K& B( J* P
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
6 f5 `# R+ x9 ]; R: V. o
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
8 J( B1 e! s6 u8 H; c# j
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;7 o- X# G/ {) H8 a- u2 m% G# F' V
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
1 U# ], W% s9 b+ J9 T0 S

, w3 K; Y; e# M- b. ?. F4 d# f+ i. d/ }
DMA_Cmd(DMA2_Channel3, ENABLE);/ _) m, ^4 U! Y) g! g
$ w' w- ~, I( C. H; K: O
DAC_Cmd(DAC_Channel_1, ENABLE);
  d' y; q. L9 N  ^
! T, ~+ B7 z! R9 Z& c  T
DAC_DMACmd(DAC_Channel_1, ENABLE);6 Q/ p7 t3 h; G8 B3 T* L6 g, o0 }

9 O% }& z2 B9 T* W0 G' P7 B
TIM_Cmd(TIM6, ENABLE);
$ _, S9 U% s) y* T% k8 A

, H& V1 n. W' E, W2 f3 e0 }
while (1)5 o8 T, V/ D  D2 Y1 e' x
{
1 C6 g# r. `5 [3 H: m3 f
}
  D" ~2 h: n; E& h+ M# T  t
}! x7 w" o* U0 C! ^" }3 h; x6 f
void RCC_Configuration(void)
, \$ F  X: t5 \5 `* v+ _* Y+ o1 n
{7 o2 N! O( A9 `0 r- S1 R
RCC_DeInit();  A( H. }  t" r9 g- Y
RCC_HSEConfig(RCC_HSE_ON);
- W9 G2 L) I% J, D5 ?2 h
HSEStartUpStatus = RCC_WaitForHSEStartUp();
; q( Y  y1 ^: @0 I8 U% O* B
if(HSEStartUpStatus == SUCCESS): Y8 Y' p/ l5 y' Q" O. v
{' T8 X0 e' \3 R" V# b4 ?: J
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);( x# I6 A- J" T, o' `
FLASH_SetLatency(FLASH_Latency_2);; U  c8 E* R3 d7 }; I; }  T; [* P' e
RCC_HCLKConfig(RCC_SYSCLK_Div1);( X  i$ x2 |2 w9 J! e3 T; a
RCC_PCLK2Config(RCC_HCLK_Div1);$ X( b; z0 C3 w& n+ W
RCC_PCLK1Config(RCC_HCLK_Div2);
1 K; _1 w" |/ O" K8 s9 \* y( p
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);% V' }- C& q2 n3 t
RCC_PLLCmd(ENABLE);
1 t' L# W+ J' v/ `, V6 I
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)9 a3 k$ W4 u8 d: r7 `: y
{, N- H2 z$ R( v9 i1 f8 S& J
}
5 l+ p8 N" h1 T' o5 B# m, w1 X
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);3 v; a0 G; _6 ]8 \* _4 v( H4 _
while(RCC_GetSYSCLKSource() != 0x08)# [5 ?( \4 x! w$ b
{! z/ K; P! v6 n- s
}2 ]+ a( G2 R0 `* K9 V( P  M/ `
}
6 `1 I  m$ c6 q7 O7 \- r
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
3 @) g+ ^8 V% P3 @& s0 z
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);: v, C. ?% n- u
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);. i7 L' W  a) \7 D' m# p5 B8 r
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);2 h+ g* {! v$ h+ ~& a6 ?1 g" @
}
1 s& O9 l7 v: m4 o0 ^- u
void GPIO_Configuration(void)
* p0 j" m) i6 k: s" m/ P3 H$ L$ c
{5 q, P$ r0 N* \1 `
GPIO_InitTypeDef GPIO_InitStructure;
: |* s0 c0 z- ]4 A
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;' o( c3 Z) D3 v: l, r( _. M  U. s- z
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;$ n) L' d: d: D8 A4 f+ Y5 i# ?4 J
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;# p( d6 h, h/ l5 _
GPIO_Init(GPIOA, &GPIO_InitStructure);/ M& [9 d; V( O
}
0 |8 s/ \. n- U+ B( |  M
1 v3 [7 E( O1 O0 J* b
void NVIC_Configuration(void)
* i+ ~9 e( [8 u
{8 N. O% u& w, }% L% b! L
#ifdef VECT_TAB_RAM
& {4 G4 u" p: k" z7 n( B9 d+ A
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
$ ]# [# v* J5 X+ G& O- ^) l
#else /* VECT_TAB_FLASH */
' }$ ^( }2 q& i) M# A: @
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
3 |' b6 ~: U1 a
#endif
" R! Q4 n3 w1 Q& @! {
}
( _! f) G$ h$ f! b2 k& _
void Delay(vu32 nCount)' _  c5 O9 [2 }
{# Z9 `5 n1 T0 t6 E& ^% j7 w
for(; nCount != 0; nCount--);" f6 Q- `3 r1 [* X' f
}
8 b6 H, J0 J% U1 r- U& |9 O- Y
输出电压为什么不是0~3.3V呢? 7 p1 B  y3 P4 L, g, V$ K% ]

) w6 V/ F1 V8 z+ P. {% j1(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095.
- f% ~: B" X, i6 s( U
& j2 z0 O" W1 w* J) X' f# l2DAC_OutputBuffer - 输出缓存 使能再试试. O/ j. l9 h+ M8 ^
1 }6 ^3 _7 E7 I' V3 |) X
1、关于STM32F103REDAC1 s( W  b! r# ~5 o9 ?0 n( Q
4 d& a, j4 Y: {+ z" w4 E+ L. l
问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢?
# e, m: Q6 x3 H) l. @
5 z/ I7 n/ [) f. E答:2个,这个你可以到引脚图上面看到。
8 l! S1 L2 M" p$ u% M# c: h2、STM32F107DAC例程都用TIMx更新启动DMA22 h  B! E- }  S, K5 p& t
2 l9 S9 m; S7 t+ E4 [
问:STM32F107DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DACDHRxx寄存器里面?该如何设置呢?
, v# v& z' ~, r) o( P& R  T  U8 e# H( k- R  K9 i7 x+ K: T) J$ A
答:不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.+ I2 K3 s. j0 e8 ^9 {
8 o  g5 q/ B. Y  G2 l2 R' `
3、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?
% }& T9 J: B: M) v2 J& B6 _. @5 y问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?+ w% q9 U6 P! x5 E
答:一共有16个痛多的ADC,外置式是什么类型连接的?
, x! b( j" [3 p9 b* Z
; L0 Y% K0 F: `: b: N, Z% d  P
答:外置式ADC型号是AD749016通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢!
) t3 h4 U3 ?$ t- E. V) Z% S5 e2 Q( {: x" Z* z% c
答:用其他3IO做片选就可以
; }9 f. G5 T  Z: U
4 R& L& G; V, [; f/ ?$ Y
6STM32F2 ADC
' w2 V1 ^' I6 B3 W# V问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是315285684112144480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?% l) Z5 H( _2 @% _5 I9 S

' b# y1 Q, g7 w. o0 P
0 y* i- A4 q5 I( f答:<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问题集锦


. k/ K7 B. l* n9 ]( a  Q7 \( _& pmark
zdh451 回答时间:2012-5-8 16:38:05

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

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

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

DAC问题一,是改成下面这样吗?: s$ L8 V+ b9 f9 c/ o8 M
u16 Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056, 7 j  X5 W  q+ b0 M1 _2 ]" K- `
                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,  
2 A' j& R- }5 m0 o. t5 P                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
, `. ?0 Z% z7 E, }/ v; }% L( nu32 DualSine12bit[32]; ) }& m+ [: ~+ q- k
u8 Idx = 0; 8 J! A9 B9 r! E1 x
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问题 2 K2 d8 L% _, k# {4 o
用STM32F103zet6自带AD测量一个电压,用6位半电表测得该电压稳定可靠。/ S) a# D' s9 o5 O  l
请教几个问题:' Y6 g6 C! E. l$ w( c0 X
(1)为什么只要单片机重新复位或者断电再上电以后测得的AD值与复位之前测得的AD值差距比较大?
- I! M* ^5 u2 j6 [2 E2 [0 Q(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 手机版