
1、STM32的DAC转换是什么开始的呢?3 C1 O6 z2 g) u7 \3 i- w 问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢? 答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。% F" W& d9 |" y8 g" L, u- K( X, g 2、STM32的DAC输出电压 . \' [0 k& @4 j( V( z: F 问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下: #include "stm32f10x_lib.h" #define DAC_DHR8R1_Address 0x40007410 DAC_InitTypeDef DAC_InitStructure;9 X1 ` ?9 I% ^ DMA_InitTypeDef DMA_InitStructure; ErrorStatus HSEStartUpStatus;) ^) ^) u2 ] F+ e. J V1 _ uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};3 }! Z% n9 [* o! l3 o8 \ void RCC_Configuration(void); void GPIO_Configuration(void); void NVIC_Configuration(void); void Delay(vu32 nCount); int main(void)0 Y6 ~$ R$ D0 ~( ^- K0 E {$ C8 S. S U, b; I% A6 Q #ifdef DEBUG debug(); #endif1 ]" W' n4 B3 l& a" |8 L& _) C RCC_Configuration();/ X& E% K& m s2 }+ B. J& S9 ` ) \( e* a0 Z9 n GPIO_Configuration(); , w$ M' `! u5 A. g NVIC_Configuration(); TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update); TIM_SetAutoreload(TIM6, 0xFF); 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); DMA_DeInit(DMA2_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit; 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; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;3 P* D+ K! B* q$ s1 G DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;6 `1 ?6 q j. R* ? DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA2_Channel3, &DMA_InitStructure);3 e$ m" q, Q% k- W DMA_Cmd(DMA2_Channel3, ENABLE); DAC_Cmd(DAC_Channel_1, ENABLE); DAC_DMACmd(DAC_Channel_1, ENABLE); TIM_Cmd(TIM6, ENABLE);# A- H) c6 w n$ j- E, x U ) u2 ~6 x. U. M0 A8 ~5 U while (1) { }. r* q6 x7 `% u( \' ~9 Y }4 y2 Y! m; H2 u- U! { void RCC_Configuration(void) {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(); if(HSEStartUpStatus == SUCCESS)4 h. D) n: J E% @4 \. U {3 |9 |( ]0 G% U2 f1 @ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); FLASH_SetLatency(FLASH_Latency_2); 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); 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 { }9 h% ~; J: M, i) j }# }6 o- }( n1 R# x% ` RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); 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) {: M3 C6 ^* @* p& L& d3 ^ GPIO_InitTypeDef GPIO_InitStructure; 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); }1 \. g+ q* M) z void NVIC_Configuration(void) {) J" e3 t3 p+ C5 Q #ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */% M6 |5 s- `) w7 R2 J5 _# a, c$ w* Q NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif }; s7 G$ h1 @: _ void Delay(vu32 nCount) { for(; nCount != 0; nCount--); } 输出电压为什么不是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. 答2:DAC_OutputBuffer - 输出缓存 使能再试试 & q0 P7 }4 ]" M- C 1、关于STM32F103RE的DAC 问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢? 答:有2个,这个你可以到引脚图上面看到。 2、STM32F107的DAC例程都用TIMx更新启动DMA27 {9 {( k% a5 _9 J " p- h0 Z3 P7 z& A; B 问:STM32F107的DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DAC的DHRxx寄存器里面?该如何设置呢?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吗?如果可以最多可以带多少个? 问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?' o) H; L7 ^. d \) P7 a" w- x 答:一共有16个痛多的ADC,外置式是什么类型连接的? 8 @1 S2 m6 f9 r& D2 I 答:外置式ADC型号是AD7490的 16通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢!. o; l) c8 ^3 C4 R( b9 K2 U 答:用其他3个IO做片选就可以2 E' c- E" O2 `# Q 7 }; R5 K$ g0 t& V8 J 6、STM32F2 ADC 问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是3、15、28、56、84、112、144、480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?0 S# h8 |; f) g9 O6 d8 o7 Z) F4 B , 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 |
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}; " 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
回复:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
RE:关于STM32的ADC/DAC问题集锦
用STM32F103zet6自带AD测量一个电压,用6位半电表测得该电压稳定可靠。
请教几个问题:+ V& k& T5 ~$ G1 X7 F& I, r
(1)为什么只要单片机重新复位或者断电再上电以后测得的AD值与复位之前测得的AD值差距比较大?
(2)上电选择好一个通道校准完AD之后,进行AD测量时测得的值比较稳定,多次测量偏差很小,再重新配置一下之前那个的通道(即再调用一次之前配置那个通道的函数,例如ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_239Cycles5);)得到的AD值与之前的AD值偏差比较大,求解原因?
回复:关于STM32的ADC/DAC问题集锦