
1、STM32的DAC转换是什么开始的呢? 问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? ) ?% `7 v* g0 o4 o; g 答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。2 I+ M7 o- Z# U, z! ` - b" y9 r/ F( x9 K, ~ 2、STM32的DAC输出电压: 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; uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};# u0 m7 z% M! V9 r2 { void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void);8 v- Q* P7 {6 s: k2 Z void Delay(vu32 nCount); int main(void) {( C2 D9 r( L9 f" r: m5 M- B4 q #ifdef DEBUG o! Q" C, S$ l( i% r7 r debug(); #endif RCC_Configuration(); GPIO_Configuration(); 5 v" H5 e ^' e; m NVIC_Configuration(); 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; 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); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 6;% m, S- L5 q9 z W DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 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; 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+ | DMA_Cmd(DMA2_Channel3, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE);7 c0 f/ E$ e, W8 V, ~ DAC_DMACmd(DAC_Channel_1, ENABLE);7 ^3 {; |- Z. @- g4 r 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 { } } void RCC_Configuration(void)0 Z& D. T3 g) I2 h! o2 O { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp();) b ]( H( F, P if(HSEStartUpStatus == SUCCESS)5 @3 a9 g% ], s2 G { 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); RCC_PCLK1Config(RCC_HCLK_Div2);! Y! S3 S8 g' ] RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); 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); while(RCC_GetSYSCLKSource() != 0x08) {& T7 I1 ?& K" W0 w8 e } } RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);8 v/ [& W2 Z9 ^$ n/ w RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); }6 E+ F' `+ ?& t+ N- c void GPIO_Configuration(void) {* 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; GPIO_Init(GPIOA, &GPIO_InitStructure); }- J, c1 |) x; E* H% p: L4 Y/ A $ N1 E5 `+ f7 u; h" L3 V void NVIC_Configuration(void) {# K. n! X+ k; n" ?5 H #ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ 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--); }: g! T W+ u' X3 H' [, s1 v 输出电压为什么不是0~3.3V呢? o' {2 Z% v4 ]' Q 答1:(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095. 6 r7 y/ r9 ^. F) [ 答2:DAC_OutputBuffer - 输出缓存 使能再试试% T& i$ \. p7 q 1、关于STM32F103RE的DAC0 H7 b" m# R& J% [ , k+ ^. N) m! T a% Q1 {* ~/ u 问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢? + U& d2 @# Z# O: n2 v; \* ^ 答:有2个,这个你可以到引脚图上面看到。 2、STM32F107的DAC例程都用TIMx更新启动DMA2; C; e, n- z/ C! y7 V" N 问:STM32F107的DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DAC的DHRxx寄存器里面?该如何设置呢?5 o# Y2 `& T( y9 Y( V9 i8 s/ O 答:不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.' E9 E) u; x6 S8 h ' G5 e6 N7 ?$ l 3、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个? 问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个? 答:一共有16个痛多的ADC,外置式是什么类型连接的? 答:外置式ADC型号是AD7490的 16通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢! 答:用其他3个IO做片选就可以5 h, C! R/ o/ y ( e( X1 g0 z \$ ~& o1 f9 f0 n$ X 6、STM32F2 ADC 问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是3、15、28、56、84、112、144、480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗? 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 |
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, ' ]: ~; 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;
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位半电表测得该电压稳定可靠。/ b% Q4 t9 r) T0 H1 a
请教几个问题:
(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值偏差比较大,求解原因?
回复:关于STM32的ADC/DAC问题集锦