OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9362|回复: 8

F407 AD 采样 求助

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-22
在线时间
0 小时
发表于 2014-12-22 20:27:00 | 显示全部楼层 |阅读模式
5金钱
定时器控制采样频率,触发AD,DMA传输到一个数组,传输完成,中断中由串口传出。。。。。。。AD引脚  接开发板上的地和3.3  都是正常显示。。悬空时显示在1V左右。。。  但是接上正弦信号后  信号幅值只有0.8V     但采样的幅值都显示到2点几   3点几V     是怎么回事   从AD1换到AD2    DMA通道也换过   都没用   怎么办


[mw_shl_code=c,true]#include "stm32f4xx.h" void Delay(__IO uint32_t nCount); void Adc_Init(uint32_t Frequency); void COM1Init(u32 BaudRate1); void NVIC_Config(void); void LED_Init(void); __IO uint16_t uhADCxConvertedValue[50000]; // u16 tmp; // const double Vref_ = 3.28; // unsigned int i,i_tmp = 0; // double ADC_Infact_V = 0; float tempt; u32 i; int main(void) { LED_Init(); Adc_Init(50000); NVIC_Config(); COM1Init(115200); while(1){ GPIO_SetBits(GPIOF,GPIO_Pin_10); Delay(0x7FFFFF); GPIO_ResetBits(GPIOF,GPIO_Pin_10); Delay(0x7FFFFF); } } void Delay(__IO uint32_t nCount) { while(nCount--){} } void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟 //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO_ResetBits(GPIOF, GPIO_Pin_10);//GPIOF9,F10设置高,灯灭 } void Adc_Init(uint32_t Frequency) { GPIO_InitTypeDef GPIO_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); //使能ADC2时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);//使能DMA2 /* DMA2 Stream3 channel1 configuration **************************************/ DMA_InitStructure.DMA_Channel = DMA_Channel_1; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC2->DR;//0x0000FFFF DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&uhADCxConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 50000; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream3, &DMA_InitStructure); DMA_ITConfig(DMA2_Stream3, DMA_IT_TC, ENABLE); //DMA2传输完成中断 DMA_ClearITPendingBit(DMA2_Stream3, DMA_IT_TEIF3); //清标志 DMA_ClearITPendingBit(DMA2_Stream3, DMA_IT_TCIF3); //清标志 DMA_Cmd(DMA2_Stream3, ENABLE); //先初始化ADC2通道 IO口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//Pb0 通道8 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,ENABLE); //ADC2复位 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,DISABLE); //复位结束 ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式 ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz ADC_CommonInit(&ADC_CommonInitStructure);//初始化 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换 ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;//禁止触发检测,使用软件触发 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐 ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 ADC_Init(ADC2, &ADC_InitStructure);//ADC初始化 ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_144Cycles ); //ADC2,ADC通道,144个周期,提高采样时间可以提高精确度,转换频率 134K /* Enable DMA request after last transfer (Single-ADC mode) */ ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE); /* Enable ADC2 DMA */ ADC_DMACmd(ADC2, ENABLE); ADC_Cmd(ADC2, ENABLE);//开启AD转换器 /* TIM2 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 1000000/Frequency-1; //PWM 周期 10us 50K TIM_TimeBaseStructure.TIM_Prescaler = 83; //预分频因子 计数频率 84M/84=1M TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_Pulse = 0x04; TIM_OC2Init(TIM2, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); /* TIM2 enable counter */ TIM_Cmd(TIM2, ENABLE); } void COM1Init(u32 BaudRate1) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = BaudRate1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_ClearFlag(USART1, USART_FLAG_TC); USART_Cmd(USART1, ENABLE); } void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组 2 /* Enable the DMA Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void DMA2_Stream3_IRQHandler(void) { if(DMA_GetITStatus(DMA2_Stream3, DMA_IT_TCIF3)) //通道5传输完成中断TC 还有传输 过半中断HT 错误中断TE 全局中断GL { DMA_ClearITPendingBit(DMA2_Stream3, DMA_IT_TCIF3); //清除全部中断标志 for(i=0;i<=49999;i++) { // tmp=uhADCxConvertedValue; // tmp=tmp>>8; // while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); // USART_SendData(USART1 ,tmp ); // //tmp=tmp>>8; // while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); // USART_SendData(USART1 , uhADCxConvertedValue); tempt=(float)uhADCxConvertedValue*(3.3/4096); tempt*=1000; while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); USART_SendData(USART1 , 0x30+(unsigned int)tempt/1000%10); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); USART_SendData(USART1 , '.'); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); USART_SendData(USART1 , 0x30+(unsigned int)tempt/100%10); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); USART_SendData(USART1 , 0x30+(unsigned int)tempt/10%10); // // i_tmp = uhADCxConvertedValue; // ADC_Infact_V = ((double)i_tmp)*Vref_/4095*1000; // i_tmp = (unsigned int)ADC_Infact_V; // // while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); // USART_SendData(USART1 , 0x30+i_tmp/1000%10); // while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); // USART_SendData(USART1 , '.'); // while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); // USART_SendData(USART1 ,0x30+i_tmp/100%10); // while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); // USART_SendData(USART1,0x30+i_tmp/10%10); // while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); // USART_SendData(USART1 , 0x30+i_tmp%10); // while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); // USART_SendData(USART1 , 'V'); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); USART_SendData(USART1 , '\r'); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); USART_SendData(USART1 , '\n'); } } } [/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-22
在线时间
0 小时
 楼主| 发表于 2014-12-22 20:35:49 | 显示全部楼层
顶起。。。。。。。。。来人啊。。。。。。。。。。。。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-12-22 23:15:44 | 显示全部楼层
帮顶....
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2014-12-23 10:48:43 | 显示全部楼层
这个应用的例程,肯定有。
先用电位器给个直流电压,只给0和最大不能说明问题。
另外和硬件有关,前面有调理电路吗?
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-22
在线时间
0 小时
 楼主| 发表于 2014-12-23 14:00:06 | 显示全部楼层
回复【4楼】xuande:
---------------------------------
没有   信号发生器直接   接的开发板引脚
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-22
在线时间
0 小时
 楼主| 发表于 2014-12-23 14:02:13 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原回复【3楼】正点原子:
---------------------------------
原子哥都不帮忙指导一下
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-22
在线时间
0 小时
 楼主| 发表于 2014-12-23 14:46:44 | 显示全部楼层
回复【4楼】xuande:
---------------------------------
刚刚接了一个干电池   也显示正确的   为什么接正弦波就不行啊??!!
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2014-12-23 16:37:50 | 显示全部楼层
正弦波,频率、幅值,什么特征?有负值吗?信号源是什么特征?
STM32不能采集负值。
接个电位器,手动调节一下,看数值变化怎么样。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-12-22
在线时间
0 小时
 楼主| 发表于 2014-12-23 17:07:07 | 显示全部楼层
回复【8楼】xuande:
---------------------------------
正弦波频率 4K  5K    现在400HZ都试过了     峰峰值 只有0.7V  而且  加了直流偏置   已经没有负值了。  显示的幅值还是高达3.3伏,而且还消顶了。。。  采样频率   也调过   50K   40K   现在10K  。。都不行。。刚刚不用DMA模式  直接读AD寄存器的值 传出来  也不对。。。。我感觉是硬件问题了。。但为什么接直流就没问题呢。。。??!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 10:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表