
1、STM32的DAC转换是什么开始的呢?8 B- u# f' K. N C( G/ Q: Q 问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? 3 A* l9 L R5 i0 G2 w/ _% S+ }6 A! s 答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。1 [' f" `. ~% l0 p& e1 h' i , t% O; T$ g( @: M9 [# \ 2、STM32的DAC输出电压5 j8 ~* ~1 g: j) B 3 n. B- t: T8 p) V( P* e 问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下: #include "stm32f10x_lib.h"% i! v2 d8 D% @3 E: s2 P | #define DAC_DHR8R1_Address 0x40007410 DAC_InitTypeDef DAC_InitStructure; DMA_InitTypeDef DMA_InitStructure; # B5 R7 ~6 f/ J- c ErrorStatus HSEStartUpStatus; uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};# o1 @0 B5 y2 T8 t" c void RCC_Configuration(void);. J0 ^8 F Z' R) i- [4 O void GPIO_Configuration(void); void NVIC_Configuration(void);6 v# Y9 ?/ q+ @4 @! N void Delay(vu32 nCount); int main(void)0 ~+ u/ \6 t P- p B {0 n1 z# Y# `7 F7 i #ifdef DEBUG debug();5 \, z/ u6 r9 N #endif Q. g* A2 w; p RCC_Configuration();! \4 _3 q, z; d3 ^ GPIO_Configuration();8 B& V x# T1 U1 I" }$ } NVIC_Configuration(); TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update);+ p( r8 T ]& ~+ u TIM_SetAutoreload(TIM6, 0xFF); TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;0 T3 `; I4 r1 z8 F DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure);- N* W' g7 U( U. L; D DMA_DeInit(DMA2_Channel3);7 N; T t3 e5 u5 t/ R$ W DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;8 k1 n+ E, A/ C& m. t DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;( M6 M! y& ?( \( ]$ u DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 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); DAC_Cmd(DAC_Channel_1, ENABLE); 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 TIM_Cmd(TIM6, ENABLE);- f% B/ U9 R0 K' u' g/ r' [# J 7 z9 X1 ]2 q0 c" h( ]" l while (1) {. f d' f8 `1 c% r9 N8 B } }" 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(); RCC_HSEConfig(RCC_HSE_ON);3 j: v3 P+ R* b4 Z5 L HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) {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); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)# H% c& g& I' [& w+ [ {# `3 k. N* x* O0 v" Q' ?' L- w3 P3 ` } RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08): v, @% @3 q7 ?0 o# k { }3 \: e% S# K( t }& f: |/ ^2 Z* k RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);$ F# d7 H) c* Z4 H" I3 u }# k$ F) d! w q- B5 E* _ void NVIC_Configuration(void) { #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 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif }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$ ? } 输出电压为什么不是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:DAC_OutputBuffer - 输出缓存 使能再试试 1、关于STM32F103RE的DAC 问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢? : k( X: P3 L" ?1 Z% Q7 K* v6 _ 答:有2个,这个你可以到引脚图上面看到。 2、STM32F107的DAC例程都用TIMx更新启动DMA2 问:STM32F107的DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DAC的DHRxx寄存器里面?该如何设置呢?: ~7 O- M7 @+ d1 I 答:不用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型号是AD7490的 16通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢! 答:用其他3个IO做片选就可以) I- n) N9 H- V( L. x3 U 3 n7 l( a. W6 d- r! ^' J0 r& u 6、STM32F2 ADC/ G% j3 x/ o0 C 问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是3、15、28、56、84、112、144、480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗? . 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 |
RE:关于STM32的ADC/DAC问题集锦
mark
回复:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
u16 Sine12bit[32] = {2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
u32 DualSine12bit[32]; & Y' O( _2 {9 _. d& F" s7 S( \
u8 Idx = 0; # ]# D1 `6 }( _& o5 q' T+ G. o
for (Idx= 0; Idx
回复:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
用STM32F103zet6自带AD测量一个电压,用6位半电表测得该电压稳定可靠。$ }4 k/ m3 }' }7 E# S; }4 k) g
请教几个问题:
(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值偏差比较大,求解原因?
回复:关于STM32的ADC/DAC问题集锦