
1、STM32的DAC转换是什么开始的呢?( o8 `4 [3 y$ g, k' y# ^ 问:STM32的DAC转换是什么开始的呢?如何利用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 2、STM32的DAC输出电压 : {& Y9 [) U( G! G E, m 问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下:0 V) U M+ v9 T5 { #include "stm32f10x_lib.h" #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; ErrorStatus HSEStartUpStatus; uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};2 ?$ ]4 m) w' Q/ c6 r5 h void RCC_Configuration(void); 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(); #endif RCC_Configuration();1 R4 A4 }- M1 H. R GPIO_Configuration(); NVIC_Configuration(); TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update); TIM_SetAutoreload(TIM6, 0xFF); TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);7 \. Q$ @/ e* | p$ v" \4 | 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); 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; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;- V O6 k+ w* N# s DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;7 o- X# G/ {) H8 a- u2 m% G# F' V DMA_Init(DMA2_Channel3, &DMA_InitStructure); DMA_Cmd(DMA2_Channel3, ENABLE);/ _) m, ^4 U! Y) g! g $ w' w- ~, I( C. H; K: O DAC_Cmd(DAC_Channel_1, ENABLE); ! T, ~+ B7 z! R9 Z& c T DAC_DMACmd(DAC_Channel_1, ENABLE);6 Q/ p7 t3 h; G8 B3 T* L6 g, o0 } TIM_Cmd(TIM6, ENABLE); while (1)5 o8 T, V/ D D2 Y1 e' x { } }! x7 w" o* U0 C! ^" }3 h; x6 f void RCC_Configuration(void) {7 o2 N! O( A9 `0 r- S1 R RCC_DeInit(); A( H. } t" r9 g- Y RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); 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); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);% V' }- C& q2 n3 t RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)9 a3 k$ W4 u8 d: r7 `: y {, N- H2 z$ R( v9 i1 f8 S& J } 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/ ` } RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); 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" @ } void GPIO_Configuration(void) {5 q, P$ r0 N* \1 ` GPIO_InitTypeDef GPIO_InitStructure; 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 } 1 v3 [7 E( O1 O0 J* b void NVIC_Configuration(void) {8 N. O% u& w, }% L% b! L #ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif } 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 } 输出电压为什么不是0~3.3V呢? 7 p1 B y3 P4 L, g, V$ K% ] 答1:(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095. 答2:DAC_OutputBuffer - 输出缓存 使能再试试. O/ j. l9 h+ M8 ^ 1 }6 ^3 _7 E7 I' V3 |) X 1、关于STM32F103RE的DAC1 s( W b! r# ~5 o9 ?0 n( Q 4 d& a, j4 Y: {+ z" w4 E+ L. l 问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢? 答:有2个,这个你可以到引脚图上面看到。 2、STM32F107的DAC例程都用TIMx更新启动DMA22 h B! E- } S, K5 p& t 2 l9 S9 m; S7 t+ E4 [ 问:STM32F107的DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DAC的DHRxx寄存器里面?该如何设置呢? 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吗?如果可以最多可以带多少个? 问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?+ w% q9 U6 P! x5 E 答:一共有16个痛多的ADC,外置式是什么类型连接的? 答:外置式ADC型号是AD7490的 16通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢! 5 e2 Q( {: x" Z* z% c 答:用其他3个IO做片选就可以 4 R& L& G; V, [; f/ ?$ Y 6、STM32F2 ADC 问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是3、15、28、56、84、112、144、480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?% l) Z5 H( _2 @% _5 I9 S 答:<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, 7 j X5 W q+ b0 M1 _2 ]" K- `
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]; ) }& m+ [: ~+ q- k
u8 Idx = 0; 8 J! A9 B9 r! E1 x
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位半电表测得该电压稳定可靠。/ S) a# D' s9 o5 O l
请教几个问题:' Y6 g6 C! E. l$ w( c0 X
(1)为什么只要单片机重新复位或者断电再上电以后测得的AD值与复位之前测得的AD值差距比较大?
(2)上电选择好一个通道校准完AD之后,进行AD测量时测得的值比较稳定,多次测量偏差很小,再重新配置一下之前那个的通道(即再调用一次之前配置那个通道的函数,例如ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_239Cycles5);)得到的AD值与之前的AD值偏差比较大,求解原因?
回复:关于STM32的ADC/DAC问题集锦