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

关于STM32的ADC/DAC问题集锦

[复制链接]
zengwh 发布时间:2012-5-8 10:48
1STM32DAC转换是什么开始的呢?
6 i$ T, }; B: m7 G问:STM32DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢?
% ^5 H3 p% w* E& k  `) ?% `7 v* g0 o4 o; g
答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。2 I+ M7 o- Z# U, z! `
- b" y9 r/ F( x9 K, ~
2STM32DAC输出电压: f; C( b; c8 C: `8 b+ X, T
/ }" |/ _; e$ T3 i  g  V; K1 G
问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下:4 P/ B+ `+ |6 O" O4 w5 z4 O: X. ]% _! A
#include "stm32f10x_lib.h"4 j$ K7 ?6 {9 w% W
#define DAC_DHR8R1_Address 0x400074102 a' e4 ], S/ ^8 U
DAC_InitTypeDef DAC_InitStructure;- B8 T6 S- W& y0 l3 {1 ~+ ~. v
DMA_InitTypeDef DMA_InitStructure;. z  L! t) ~5 v2 ]" [
% o9 X4 |1 Z% L% T1 F8 H
ErrorStatus HSEStartUpStatus;
7 |- I; u4 _* T2 w3 F" p
uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};# u0 m7 z% M! V9 r2 {

0 d* D4 n( p. j% Z, L
void RCC_Configuration(void);
# r" S* x3 v( K  ], \) P7 O
void GPIO_Configuration(void);
9 B+ u4 j7 \- a
void NVIC_Configuration(void);8 v- Q* P7 {6 s: k2 Z
void Delay(vu32 nCount);
1 J4 T) g: n( Q3 Y  d; H

2 R: W' O! q* e$ _! J
int main(void)
' E3 Y+ y0 X9 c) S! Q
{( C2 D9 r( L9 f" r: m5 M- B4 q
#ifdef DEBUG  o! Q" C, S$ l( i% r7 r
debug();
( {0 ?  P. G& m# {9 J
#endif
4 w% ]. z; a. U1 [

8 g9 A; H2 {7 {. a% }! `
RCC_Configuration();
' T2 ~# ?* p( J" m4 {$ j3 X3 b) {6 S- U

& c  d0 _+ W9 e9 r8 B
GPIO_Configuration();
! j  B# b& D8 z
5 v" H5 e  ^' e; m
NVIC_Configuration();
: g0 c+ a- y) X9 a# J$ a9 e
2 }" C- E* a9 V- P
TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update);) X" f3 [' M. ?3 p+ c8 n
TIM_SetAutoreload(TIM6, 0xFF);; j8 ]/ H  u' b  J7 s
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);1 S& q$ J1 _: G
: R9 |3 X0 j6 S( `' [, f4 K! C& X. s
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;) U5 S2 r. Q2 ]" l; C6 V
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
0 L3 Q5 ]7 w3 h
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;6 K, K+ [# N9 K
DAC_Init(DAC_Channel_1, &DAC_InitStructure);1 |- d4 H7 H3 ^0 D9 T, |# X
0 \, P! U0 X2 e5 A- x; N0 P
DMA_DeInit(DMA2_Channel3);
; q6 x: F+ S' _( l! U! X! P( R* k
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address;
; b: X: I" {' {, {
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit;
; _3 L6 ?4 z$ v. w3 i0 ~
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
5 Q* ^$ U4 O( @5 N
DMA_InitStructure.DMA_BufferSize = 6;% m, S- L5 q9 z  W
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
4 p' F6 ~% ^2 W8 h" o) U. F( C! G
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
4 Q( G$ u7 r' l, f$ x9 ?9 t
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;- e6 b" U/ H# Z7 l
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;( _, z3 P+ B9 b
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;6 o& D  d7 h4 C3 o  ?7 Z! |
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
1 a& E+ I8 f+ \
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;4 P3 s8 E; v) S' E- J9 h
DMA_Init(DMA2_Channel3, &DMA_InitStructure);/ |4 L2 e1 k9 v, E+ |

* G! k# [9 m9 g
DMA_Cmd(DMA2_Channel3, ENABLE);
2 Y) L/ n$ j& ~/ n4 K  i

8 x! w$ B$ Q8 x0 W0 P! X; ~4 M
DAC_Cmd(DAC_Channel_1, ENABLE);7 c0 f/ E$ e, W8 V, ~

, U$ y, q' i. d& g2 l
DAC_DMACmd(DAC_Channel_1, ENABLE);7 ^3 {; |- Z. @- g4 r

) q3 k. ^) R) V4 d8 W1 V
TIM_Cmd(TIM6, ENABLE);7 n0 K' C- B$ W- N; F5 S# I
4 M- f& w: d% l6 H* f
while (1)2 {" w, ~3 ]  H# ^0 h3 [3 O
{
& T) l0 X* S. i7 v0 M2 J* m4 {, `2 S$ \
}
2 J9 Y$ \) P3 e, }( p' L- h
}
4 o- w+ G/ ]" U# O. r9 ~9 c
void RCC_Configuration(void)0 Z& D. T3 g) I2 h! o2 O
{
; g" ], @5 T: f, ?
RCC_DeInit();
; y& r# X- _1 N9 o
RCC_HSEConfig(RCC_HSE_ON);
" m% r; J* Q- @+ {! _1 H9 b$ u( |
HSEStartUpStatus = RCC_WaitForHSEStartUp();) b  ]( H( F, P
if(HSEStartUpStatus == SUCCESS)5 @3 a9 g% ], s2 G
{
4 L# v7 }1 Z/ g: Y
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  C7 x: i/ v/ m1 |. T/ T- A4 D
FLASH_SetLatency(FLASH_Latency_2);+ E0 v  }0 \$ `6 P* Q0 Y
RCC_HCLKConfig(RCC_SYSCLK_Div1);/ h+ T' u# h: P$ q
RCC_PCLK2Config(RCC_HCLK_Div1);
1 f; X; `0 v& Y2 g! e" b4 u9 ]$ c
RCC_PCLK1Config(RCC_HCLK_Div2);! Y! S3 S8 g' ]
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
0 ]3 x$ q. I) ?& h6 `
RCC_PLLCmd(ENABLE);
$ o5 {# ]+ ]1 m0 z8 v
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)' f/ u* E1 z+ S
{7 w/ A) H* `3 G
}- \0 E9 ]( Y7 }/ u5 O' a
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
: @6 w( T1 a1 w2 C( F
while(RCC_GetSYSCLKSource() != 0x08)
- g" ~: T* D# Z/ X2 C) M+ _# ]
{& T7 I1 ?& K" W0 w8 e
}
* A6 C1 {3 D1 f  [4 x- m8 p
}
5 n) H! g0 q/ Y( p/ m
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
6 x' x7 x* b# v# X0 x3 \
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
  k3 A4 E3 e2 I1 ~2 A1 i# A- }
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);8 v/ [& W2 Z9 ^$ n/ w
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
9 d1 C7 \* @- t" C! h2 p% M& A4 o
}6 E+ F' `+ ?& t+ N- c
void GPIO_Configuration(void)
& W# x" i. c3 x% N, |* n
{* s& w; u/ R; |& B7 T+ }
GPIO_InitTypeDef GPIO_InitStructure;! s/ x; g2 \2 s- R* U" U
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;/ B! H+ U, v! x6 z3 e
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;% e( V* b5 t/ i8 B3 y3 l
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
' h9 D1 l. a- B3 g# o7 w
GPIO_Init(GPIOA, &GPIO_InitStructure);
! D( T' V  l. Z& g! g
}- J, c1 |) x; E* H% p: L4 Y/ A
$ N1 E5 `+ f7 u; h" L3 V
void NVIC_Configuration(void)
1 p' Z; Q) R8 c
{# K. n! X+ k; n" ?5 H
#ifdef VECT_TAB_RAM
4 [& O, ]7 @( Q- |# ]0 p! @5 z  ]
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
; `' T9 I$ A* K% [0 p9 R  D
#else /* VECT_TAB_FLASH */
4 o" y" t( a- g0 q/ H
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);; C, p# O  B0 P4 W
#endif" Y4 k9 f  C: s
}( X2 K! ^4 ?- W9 v0 q
void Delay(vu32 nCount)+ S& P& V- B5 b  M& G
{6 j+ _& i0 N& Z& ~9 K
for(; nCount != 0; nCount--);
% H6 N( p9 Q& {  o! _
}: g! T  W+ u' X3 H' [, s1 v
输出电压为什么不是0~3.3V呢?   o' {2 Z% v4 ]' Q

/ i& Y: I8 l) U# C9 A& P1(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095.
* O7 w- L% _# x7 G/ m8 [$ z5 ]! A5 |6 r7 y/ r9 ^. F) [
2DAC_OutputBuffer - 输出缓存 使能再试试% T& i$ \. p7 q

2 H4 M8 f) C7 U" y+ e1、关于STM32F103REDAC0 H7 b" m# R& J% [
, k+ ^. N) m! T  a% Q1 {* ~/ u
问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢?
! C* j" H6 G/ U. e: K6 ?, \8 |+ U& d2 @# Z# O: n2 v; \* ^
答:2个,这个你可以到引脚图上面看到。
) R! |6 [+ p* l, z$ q2、STM32F107DAC例程都用TIMx更新启动DMA2; C; e, n- z/ C! y7 V" N

$ z6 B3 T8 P( P+ O" v* P- r# y问:STM32F107DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DACDHRxx寄存器里面?该如何设置呢?5 o# Y2 `& T( y9 Y( V9 i8 s/ O

" |9 C1 C: F/ N答:不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.' E9 E) u; x6 S8 h
' G5 e6 N7 ?$ l
3、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?
( `% ~9 o. u5 @! b2 s* C3 H$ P! ?问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?
& O( Z% y2 d6 @) L5 q答:一共有16个痛多的ADC,外置式是什么类型连接的?
9 o5 J& }# c; k% S8 \4 k: H0 w
0 f# r. l  b( ^, n1 E
答:外置式ADC型号是AD749016通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢!
4 A" P) ~, L0 N& \. Q
: g# @" N! G) f  M0 V6 G! H答:用其他3IO做片选就可以5 h, C! R/ o/ y
( e( X1 g0 z  \$ ~& o1 f9 f0 n$ X
6STM32F2 ADC
! g5 u, Z$ F, S" a% s5 C问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是315285684112144480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?
, ]2 F8 X; h: F3 ~3 v; W; j+ u, w! a9 c
. p6 @$ u* a: T6 e2 v
答:<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问题集锦

! S! L  n5 Y7 J* M  f, o1 B; H
mark
zdh451 回答时间:2012-5-8 16:38:05

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

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

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

DAC问题一,是改成下面这样吗?, g7 u, [5 i8 K& t1 c/ l/ S. y
u16 Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056, ' ]: ~; o5 @6 S0 |+ `
                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,  & ?9 A, X3 A3 P# H/ y
                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647}; ' F  K% Z. A" \( v; r5 I1 L
u32 DualSine12bit[32]; & i; B# I+ l8 K( G  {9 n$ M  A! `# S+ g# U
u8 Idx = 0;
: Q! p. ^+ X$ ^+ s  D! \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 m- |9 L8 O( i" `2 @0 e% K 用STM32F103zet6自带AD测量一个电压,用6位半电表测得该电压稳定可靠。/ b% Q4 t9 r) T0 H1 a
请教几个问题:
/ o$ k$ `/ _& x7 N) j; Z5 e0 d/ J(1)为什么只要单片机重新复位或者断电再上电以后测得的AD值与复位之前测得的AD值差距比较大?1 h: ~- C! R& K9 H! y
(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 手机版