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

关于STM32的ADC/DAC问题集锦

[复制链接]
zengwh 发布时间:2012-5-8 10:48
1STM32DAC转换是什么开始的呢?3 C1 O6 z2 g) u7 \3 i- w
问:STM32DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢?
% _- p" H/ |$ _
4 u3 ^9 @( ~1 M- ?& f答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。% F" W& d9 |" y8 g" L, u- K( X, g

" n, p3 M" ~9 a, K- n+ }% B2STM32DAC输出电压
+ C9 i7 B( `2 q; l! C4 @" H. \' [0 k& @4 j( V( z: F
问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下:
& p; c: h0 e* ^) C3 ~6 c
#include "stm32f10x_lib.h"
; K+ n( o/ Z" h( Z! D
#define DAC_DHR8R1_Address 0x40007410
, F0 `4 W5 x8 B
DAC_InitTypeDef DAC_InitStructure;9 X1 `  ?9 I% ^
DMA_InitTypeDef DMA_InitStructure;
0 `0 U) a  E. R  Y5 |0 X6 p

/ T1 \) [9 T3 {8 r) L: ~' |
ErrorStatus HSEStartUpStatus;) ^) ^) u2 ]  F+ e. J  V1 _
uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};3 }! Z% n9 [* o! l3 o8 \

  k" ^4 J% q9 a0 I5 P2 A
void RCC_Configuration(void);
1 ?, ?6 M. ?/ ~& f* C2 R
void GPIO_Configuration(void);
3 h: O- r  F2 |0 n8 K7 |
void NVIC_Configuration(void);
% t3 j8 x. Z( C" }7 ^
void Delay(vu32 nCount);
  w/ D4 i/ @8 ]& w2 a+ f

! S" {1 D% Q- x
int main(void)0 Y6 ~$ R$ D0 ~( ^- K0 E
{$ C8 S. S  U, b; I% A6 Q
#ifdef DEBUG
7 b8 s& l- B! ]  I: e: `
debug();
$ y8 |% e) ?2 y# t- J" E
#endif1 ]" W' n4 B3 l& a" |8 L& _) C

8 `# b; ?9 x# g
RCC_Configuration();/ X& E% K& m  s2 }+ B. J& S9 `
) \( e* a0 Z9 n
GPIO_Configuration();
: y3 z4 j$ z7 Z6 S. h. o: O
, w$ M' `! u5 A. g
NVIC_Configuration();
& E4 b! O; F% j

# B9 m; |4 U9 l$ T! `( j. \
TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update);
/ \$ ~0 {, U! O3 q; Y
TIM_SetAutoreload(TIM6, 0xFF);
0 y  q) {2 c$ O
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);& f3 w' T& i+ K6 _5 B; O! {
9 x, |, }& E, h. J
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;( N" i# G+ K. u! V3 ]" O9 ]
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;; q$ n$ ]* G+ o  H5 z7 i
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;- Z5 l7 H' [- O$ V
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
5 w5 B$ t- u$ |  N7 o2 T

5 c7 y  c2 p1 s
DMA_DeInit(DMA2_Channel3);
5 _8 ]4 m, D) o- v/ m0 s& `- q
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address;
8 J. t2 `1 @! V+ Z
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit;
7 m' i2 c( l$ a
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;( ?1 R, o4 }' O9 S8 J
DMA_InitStructure.DMA_BufferSize = 6;# O# W$ o0 j# W- Y
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
/ M7 [( a& o0 [
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;3 P* D+ K! B* q$ s1 G
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
2 e1 |+ p# G8 O/ Y* [
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;6 `1 ?6 q  j. R* ?
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
$ I, @) n9 H4 l
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
" q6 _" w7 ~8 D- `! B* y
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
! [0 Q: c6 V0 C7 Z% J
DMA_Init(DMA2_Channel3, &DMA_InitStructure);3 e$ m" q, Q% k- W

* P% n; D& \! _$ D, S% N
DMA_Cmd(DMA2_Channel3, ENABLE);
+ H: G$ x1 L1 N% e' m% H

- \* c# u6 ?5 Q6 c  d0 H
DAC_Cmd(DAC_Channel_1, ENABLE);
* v4 ^, ^8 A* m" P0 H

- m6 v! H& h/ p
DAC_DMACmd(DAC_Channel_1, ENABLE);
$ C2 \; z, v; J7 n7 i  ~2 O3 n) R) v

" t1 f, a4 E0 Z( y/ ?3 p) M3 m. W4 V4 Y
TIM_Cmd(TIM6, ENABLE);# A- H) c6 w  n$ j- E, x  U
) u2 ~6 x. U. M0 A8 ~5 U
while (1)
* C& `4 D6 Z$ {# I4 c
{
% G) o4 r* S3 B7 W
}. r* q6 x7 `% u( \' ~9 Y
}4 y2 Y! m; H2 u- U! {
void RCC_Configuration(void)
1 Z8 R" x  j' c. S% N2 y8 T
{0 R' _1 f( Z/ k' Y: o2 Y: m7 p
RCC_DeInit();* D. Y1 ?# W, [! y. H* y) n9 X) [
RCC_HSEConfig(RCC_HSE_ON);: G( V' L+ |5 ^8 M: R  z
HSEStartUpStatus = RCC_WaitForHSEStartUp();
  q3 y# M  D7 T! t# M  S: v! B
if(HSEStartUpStatus == SUCCESS)4 h. D) n: J  E% @4 \. U
{3 |9 |( ]0 G% U2 f1 @
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
5 [( r+ j  V3 R2 A. T. i, ~: T
FLASH_SetLatency(FLASH_Latency_2);
, @( n$ H, x2 j4 I& q
RCC_HCLKConfig(RCC_SYSCLK_Div1);0 g! {5 P* b* S. F( r& \2 B
RCC_PCLK2Config(RCC_HCLK_Div1);- ~7 ~% d: q9 x: D
RCC_PCLK1Config(RCC_HCLK_Div2);! r! J# u* u4 m3 g: T5 y1 P6 e
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
0 \: [1 E6 M/ F9 k9 ]: S; x$ f
RCC_PLLCmd(ENABLE);( ?% F. M0 v/ M+ T
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)7 J8 w) X. V! w1 I0 u
{( @9 y; z4 s5 F1 `
}: {$ o/ z- A' m2 q
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);: E1 K3 d. O5 V$ y
while(RCC_GetSYSCLKSource() != 0x08)$ A! \' i7 n% A! R. O% S: b7 y
{
( f0 g$ }, ]0 w0 C# T) ]. _
}9 h% ~; J: M, i) j
}# }6 o- }( n1 R# x% `
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
6 d  A' W% q, W; E' X( w
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
5 L/ U# t) H3 H) ?
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);& l! m9 \! O/ a
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);9 r" t! d, I2 N, S; U
}8 }& B6 A* e9 N. I; {' T% n$ J: J
void GPIO_Configuration(void)
# p+ g0 G0 O( {! t5 v0 \
{: M3 C6 ^* @* p& L& d3 ^
GPIO_InitTypeDef GPIO_InitStructure;
! Z: J8 ^' `1 T& ?3 o" L7 `
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;0 C- z, W$ W6 S7 X
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; M; m& D9 t. i) i) w
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;4 T3 d3 N9 H/ }( @' Z
GPIO_Init(GPIOA, &GPIO_InitStructure);
/ G+ U, m& Q- n* A3 ~& n
}1 \. g+ q* M) z

) z  \8 I5 Z  U5 L4 L
void NVIC_Configuration(void)
) _  ]4 V: z0 R% e( O
{) J" e3 t3 p+ C5 Q
#ifdef VECT_TAB_RAM
* Q$ v4 x4 B) b- o3 u( m) _
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
8 Q$ z7 a5 k; ~( I
#else /* VECT_TAB_FLASH */% M6 |5 s- `) w7 R2 J5 _# a, c$ w* Q
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
) }$ X* g, u% d
#endif
* H4 r, V' g. E5 ?1 a  q! B
}; s7 G$ h1 @: _
void Delay(vu32 nCount)
1 ~$ {2 z/ X( D
{
2 ]4 s8 A$ M7 x3 @9 }  ^2 o
for(; nCount != 0; nCount--);
  ?: D+ }" m/ Y2 U3 Y
}
: J) S4 m/ h+ ?1 q
输出电压为什么不是0~3.3V呢? 8 @+ f) E# Y6 O; s0 k  X7 A
1 \4 N& i8 S  `6 K( E8 L& k
1(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095.
1 x& ~: _) Z/ B0 Z
1 I0 _5 _$ \% O2 P0 s( X2DAC_OutputBuffer - 输出缓存 使能再试试
) Y( B; D' |$ X& q0 P7 }4 ]" M- C
1、关于STM32F103REDAC
9 {0 w! `3 h' f  U
% T8 R* `: Z& Q" c  [问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢?
; ?0 q; R6 g8 y% B, s3 I
  D+ r( C' D+ A7 C' M6 ~" ^答:2个,这个你可以到引脚图上面看到。
% j8 m2 H9 T1 E2、STM32F107DAC例程都用TIMx更新启动DMA27 {9 {( k% a5 _9 J
" p- h0 Z3 P7 z& A; B
问:STM32F107DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DACDHRxx寄存器里面?该如何设置呢?5 L0 s' p4 u& l( `7 p" X: @
( M, X; K/ j7 q$ g$ B0 L" L  k
答:不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.& q) N& a: {/ y
+ ?& t2 T8 x: u) U* K; X4 e7 Z9 M
3、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?
6 X, a4 @2 t+ `) j+ m问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?' o) H; L7 ^. d  \) P7 a" w- x
答:一共有16个痛多的ADC,外置式是什么类型连接的?
& y0 |) n5 L8 F" j8 @1 S2 m6 f9 r& D2 I
答:外置式ADC型号是AD749016通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢!. o; l) c8 ^3 C4 R( b9 K2 U

. }; \: ?! x7 W0 i3 E4 Y答:用其他3IO做片选就可以2 E' c- E" O2 `# Q
7 }; R5 K$ g0 t& V8 J
6STM32F2 ADC
; i8 e; u* u3 o$ b问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是315285684112144480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?0 S# h8 |; f) g9 O6 d8 o7 Z) F4 B

8 d$ o1 R" j8 t# H, G2 U! A4 c; F2 x" X
答:<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问题集锦


$ E7 {5 P* j6 b' J2 Z7 Rmark
zdh451 回答时间:2012-5-8 16:38:05

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

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

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

DAC问题一,是改成下面这样吗?  a- U) `- ^3 w9 Z% s3 Q7 K
u16 Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
" Q# q) j4 _. M% _; y6 u1 `2 X  U                      3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,  
( d5 `# \3 f" R, x- y8 H                      599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647}; " K8 p4 d8 m5 m
u32 DualSine12bit[32]; 1 Y  h# G" {9 g5 K
u8 Idx = 0; . d" U6 q3 M5 |, m, n/ s
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问题
9 C# g0 ?' L4 @& O% W3 M 用STM32F103zet6自带AD测量一个电压,用6位半电表测得该电压稳定可靠。
2 m. P! r' e+ S9 t# o% y- y请教几个问题:+ V& k& T5 ~$ G1 X7 F& I, r
(1)为什么只要单片机重新复位或者断电再上电以后测得的AD值与复位之前测得的AD值差距比较大?
) }* C  w: P" X  n7 I(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 手机版