|
1、STM32的DAC转换是什么开始的呢? 问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? ! x6 q( o% x! ^- x5 ^( m ' h+ ?% n3 @* m 答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。9 b7 Y: {* S/ F4 h ( _ X8 q# C7 f4 Z( }, @9 \0 D T 2、STM32的DAC输出电压8 u8 h$ H6 T# a3 k 问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下:/ l G0 U' C. n) S) `- t #include "stm32f10x_lib.h"7 P# ~: n& u5 T: i; I# c2 L" E #define DAC_DHR8R1_Address 0x40007410 DAC_InitTypeDef DAC_InitStructure;& U* C4 Z; S- Y# f H6 Z DMA_InitTypeDef DMA_InitStructure; ErrorStatus HSEStartUpStatus;, N' t* D/ l' S6 ^5 K8 m1 m7 Y9 ~ uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};- s- j% ^$ V$ J0 e- |3 w void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void);+ z# F% q" Z6 }9 g. U void Delay(vu32 nCount);/ `0 g. f, H: ]. y. [ 1 r- _3 [/ ^( r. i7 p0 f/ } int main(void) { #ifdef DEBUG: o) p, }) e: N2 @; _ debug(); #endif RCC_Configuration();& ` n: U: \; F- X& o( j. g GPIO_Configuration();$ l( S' \- ~; _& t: t1 ]' W/ \ * B/ z, Q# T4 S8 L$ Y NVIC_Configuration();* V6 |+ h- e9 l8 O4 {0 g ; A! p5 |. a9 V: q8 I TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update); TIM_SetAutoreload(TIM6, 0xFF);/ A3 U0 Z* @/ c$ P7 j2 U l! n TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); a* R& p* j/ R6 r" v) R( W/ G B$ i DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;! _9 k; D9 ^+ V* p) U3 t( {9 c DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure);; |; J! O) n: K+ f9 Y; ? " q# t, U* M% V+ y6 |: } m 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;3 D' C, ~3 P6 b DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;: ?% d6 b+ Y* j6 w0 Q( N DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;" k' l: t+ ^- o: a1 R DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;( x1 Y9 G9 g' g- I8 }% |; f DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;- p. ~2 s: I+ m8 K! D/ N DMA_Init(DMA2_Channel3, &DMA_InitStructure); DMA_Cmd(DMA2_Channel3, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE);: j r% j' {. A" s , a. `0 \0 `9 l; _3 Y- E0 L DAC_DMACmd(DAC_Channel_1, ENABLE); TIM_Cmd(TIM6, ENABLE); ! ^: Y, L( r- b. O' V' a while (1) { } }$ q- M7 q3 Y! Z# u6 R' ?0 H void RCC_Configuration(void)) e" k% O1 o/ T8 n* A3 \ {1 f2 E* V' h! V7 z. J. V- z RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) {0 W; f; @! d2 V) H) ^! @ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);" {' v2 ~) \8 ?1 \7 q2 A FLASH_SetLatency(FLASH_Latency_2); RCC_HCLKConfig(RCC_SYSCLK_Div1); RCC_PCLK2Config(RCC_HCLK_Div1);; @. X" G- l6 G4 s( ^ RCC_PCLK1Config(RCC_HCLK_Div2);0 M1 u9 O' s0 F: B6 Y9 T RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);9 d3 ~5 i6 Y: L: N# D RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)) A) k) y$ {- a7 | { }6 c. }6 f: W, ]- V* x5 Y RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08) {% n) o$ f9 P7 n } } RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);1 T* e% y1 ~4 b RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);6 J5 y% ]/ Y1 u1 E& h: e RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); }* d& A8 k+ {* G; K% J( l- ? void GPIO_Configuration(void) {$ y3 @9 Y7 f7 J* V% r) G GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;5 ?: d% Y) ~8 z: m2 } GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;1 m- p* V( ^* } GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); }5 D \; J( a; D# j void NVIC_Configuration(void)" E; o5 m1 O8 A+ h9 N; B& g { #ifdef VECT_TAB_RAM% p" \9 f, U8 s4 m9 X3 k NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);/ A& X8 j. ` w9 n #endif }3 Z) L; E5 @$ H1 i void Delay(vu32 nCount) {& G/ A0 O b, h" B: v% g" x$ v for(; nCount != 0; nCount--);/ e# Q% U2 \4 c+ D } 输出电压为什么不是0~3.3V呢? / _3 A7 G2 ~7 r. `6 c5 I 答1:(u32)&Escalator8bit;你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095.+ ~/ ]4 Z! w. ` 1 z5 V+ G# D1 F0 `! @ X 答2:DAC_OutputBuffer - 输出缓存 使能再试试9 F4 [5 ]/ F% f 1、关于STM32F103RE的DAC& T, S# M8 x, d: Y 问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢? * h, F# n% Q2 t 3 g2 Q! n! c: z: g* e. o 答:有2个,这个你可以到引脚图上面看到。 2、STM32F107的DAC例程都用TIMx更新启动DMA2- Z9 x) a) c3 N { 问:STM32F107的DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DAC的DHRxx寄存器里面?该如何设置呢? 答:不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.- S6 C; Z* s& h# t4 v$ l- M' X; @ 3、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个? 问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?* V' B6 O2 S5 X 答:一共有16个痛多的ADC,外置式是什么类型连接的?" {0 N p8 t( _! n$ { 答:外置式ADC型号是AD7490的 16通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢! , V& J9 Y( R8 B) ?7 ~ 答:用其他3个IO做片选就可以 $ n- y" R4 W1 f' D 6、STM32F2 ADC 问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是3、15、28、56、84、112、144、480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?. x9 b/ U% d; V% p* E, {# q9 c 0 B$ O: U3 R$ {& c9 L0 K) o4 F 答:<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, " [9 u8 o" z Z2 `: w
599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647}; & G8 L" ~6 {. e4 z, F
u32 DualSine12bit[32];
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位半电表测得该电压稳定可靠。/ j7 k4 N$ o' n
请教几个问题:
(1)为什么只要单片机重新复位或者断电再上电以后测得的AD值与复位之前测得的AD值差距比较大?; f9 | _- t3 I6 `5 x+ u6 N" ^
(2)上电选择好一个通道校准完AD之后,进行AD测量时测得的值比较稳定,多次测量偏差很小,再重新配置一下之前那个的通道(即再调用一次之前配置那个通道的函数,例如ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_239Cycles5);)得到的AD值与之前的AD值偏差比较大,求解原因?
回复:关于STM32的ADC/DAC问题集锦