[STM32F1] 求助:ADC开始采集的几个数据不对 这是怎么回事

[复制链接]
 楼主| 854619267 发表于 2014-2-5 20:21 | 显示全部楼层 |阅读模式
ADC, TI, ST, DM, DMA
tim2触发adc ,结果dma传输到ram中,再将ram数据发送到上位机  在上位机中显示出曲线来。但是每次显示,刚开始的几个数据不对,百思不得其解啊  
  1. void ADC_Configuration(void)
  2. {
  3.         ADC_InitTypeDef ADC_InitStructure;
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

  5.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  6. //        ADC_InitStructure.ADC_ScanConvMode = DISABLE; //¹Ø±ÕͨµÀɨÃèģʽ
  7.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //×¢ÒⲻҪʹÓóÖÐø×ª»»Ä£Ê½£¬·ñÔòÖ»Òª´¥·¢Ò»´Î£¬//ºóÐøµÄת»»¾Í»áÓÀ²»Í£Ðª£¨³ý·ÇCONTÇå0£©£¬ÕâÑùµÚÒ»´ÎÒÔºóµÄADC£¬¾Í²»ÊÇÓÉTIM2_CC2À´´¥·¢ÁË
  8.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;
  9.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  10. //  ADC_InitStructure.ADC_NbrOfChannel = 1;
  11.         switch(dev.ADinfo.AD_CHN)
  12.     {
  13.         case 0x01:
  14.         case 0x02:
  15.             ADC_InitStructure.ADC_NbrOfChannel = 1;
  16.             ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  17.             break;
  18.         case 0x03:
  19.             ADC_InitStructure.ADC_NbrOfChannel = 2;
  20.             ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  21.             break;
  22.     }
  23.         ADC_Init(ADC1, &ADC_InitStructure);

  24.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ÅäÖÃʱÖÓ(12MHz),ÔÚRCCÀïÃæ»¹Ó¦ÅäÖÃAPB2=AHBʱÖÓ72MHz£¬

  25.         switch(dev.ADinfo.AD_CHN)
  26.     {
  27.         case 0x01:
  28.             ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_1Cycles5);  
  29.             break;
  30.         case 0x02:
  31.             ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_1Cycles5);  
  32.             break;
  33.         case 0x03:
  34.             ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_1Cycles5);  
  35.             ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 2, ADC_SampleTime_1Cycles5);  
  36.             break;
  37.     }
  38.         ADC_Cmd(ADC1,ENABLE);
  39.         ADC_DMACmd(ADC1,ENABLE);

  40.         //        ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);

  41.         ADC_ResetCalibration(ADC1);
  42.         while(ADC_GetResetCalibrationStatus(ADC1));
  43.         ADC_StartCalibration(ADC1);                                          //Start Calibration register
  44.         while(ADC_GetCalibrationStatus(ADC1));                        
  45.         ADC_ExternalTrigConvCmd(ADC1, ENABLE);                       
  46. }
  1. void DMA_Configuration(void)
  2. {
  3.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  4.         DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  5.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)membuf1;
  6.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  7.         DMA_InitStructure.DMA_BufferSize = 256;
  8.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  9.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  10.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  11.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  12.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  13.         DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  14.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  15.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  16.         DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);

  17.         DMA_Cmd(DMA1_Channel1, ENABLE);

  18. }
  1. void TIM2_Configuration(void)
  2. {
  3.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  4.         TIM_OCInitTypeDef TIM_OCInitStructure;
  5.         /* Enable GPIOA, GPIOC, ADC1 and TIM1 clock */
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//200Hz,   72M/200=360000   
  7. //        TIM_TimeBaseStructure.TIM_Period = 500;//ÉèÖÃ5msÒ»´ÎTIM2±È½ÏµÄÖÜÆÚ
  8.            TIM_TimeBaseStructure.TIM_Period = dev.ADinfo.AD_sample * 10 - 1;  //*100ºó±äΪms

  9.         TIM_TimeBaseStructure.TIM_Prescaler = 720-1;//ϵͳÖ÷Ƶ72M£¬ÕâÀïÏ൱ÓÚ100KµÄ¶¨Ê±Æ÷2ʱÖÓ 100KHz = 10us
  10.         TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  11.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  12.         TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);

  13.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//ÏÂÃæÏêϸ˵Ã÷
  14.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM_OutputState_Disable;
  15.         TIM_OCInitStructure.TIM_Pulse = 5;
  16.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//Èç¹ûÊÇPWM1ҪΪLow£¬PWM2ÔòΪHigh
  17.         TIM_OC2Init(TIM2, & TIM_OCInitStructure);

  18.         //        TIM_Cmd(TIM2, ENABLE);

  19.         TIM_InternalClockConfig(TIM2);
  20.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
  21.         TIM_UpdateDisableConfig(TIM2, DISABLE);

  22. }
mmuuss586 发表于 2014-2-5 20:22 来自手机 | 显示全部楼层
偏低吧?
 楼主| 854619267 发表于 2014-2-5 20:26 | 显示全部楼层
对50hz交流电整流后采样,上位机显示的曲线是这样的   很明显刚开始的几个数据有问题
F`ED~%_I9CD)57B1HQ64COP.jpg
 楼主| 854619267 发表于 2014-2-5 20:27 | 显示全部楼层
mmuuss586 发表于 2014-2-5 20:22
偏低吧?

不是偏低 很高,然后又很低
明月小厨 发表于 2014-2-6 10:05 | 显示全部楼层
用排除法查查看;确定问题如上,是ADC的问题;
 楼主| 854619267 发表于 2014-2-6 23:44 | 显示全部楼层
明月小厨 发表于 2014-2-6 10:05
用排除法查查看;确定问题如上,是ADC的问题;

哪有可能有问题呢  求教 我想不出来
香水橙 发表于 2014-2-7 09:47 | 显示全部楼层
贴个电路图看看,会不会是电路上的问题?
明月小厨 发表于 2014-2-7 17:19 | 显示全部楼层
一个环节一个环节查,先看看ADC的结果靠不靠谱,然后用固定的数据送串口,看接收的结果;这样一查就知道,哪里有问题了。
分割——排除;
weiyuliang 发表于 2014-4-3 11:02 | 显示全部楼层
是你先用一个标准信号源试一下嘛,
_编程浪子 发表于 2014-4-3 11:05 | 显示全部楼层
weiyuliang 发表于 2014-4-3 11:02
是你先用一个标准信号源试一下嘛,

;P
weiyuliang 发表于 2014-4-6 09:54 | 显示全部楼层
_编程浪子 发表于 2014-4-3 11:05

:funk:
我的意思是 先确认各个通道采集的数据是正确的,比如通道0接3.3V 通道1接0V 通道3接1.65V,然后观察一下各个通道的数据是否正确,
这样也会比鄙视?
闻平童鞋 发表于 2014-4-6 17:15 | 显示全部楼层
给个直流源 测测ADC 然后再看是不是传输问题
johngray 发表于 2014-4-6 17:35 | 显示全部楼层
我估计还是传输问题了
_编程浪子 发表于 2014-4-7 10:58 | 显示全部楼层
weiyuliang 发表于 2014-4-6 09:54
我的意思是 先确认各个通道采集的数据是正确的,比如通道0接3.3V 通道1接0V 通道3接1.65V,然后观 ...

以为你会建议他买个信号发生器呢。。。
lei129210 发表于 2014-4-7 11:07 | 显示全部楼层
如果是传输问题,仿真看看缓存器里面的数据和上面的数据是否一致就知道了啊。这里真的不错,别人都是在教你分析问题的方式,这比一上来就告诉问题所在要好。好好吸取别人的建议。这对你以后的工作帮助会很大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部