打印
[STM32F1]

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

[复制链接]
3045|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ADC, TI, ST, DM, DMA
tim2触发adc ,结果dma传输到ram中,再将ram数据发送到上位机  在上位机中显示出曲线来。但是每次显示,刚开始的几个数据不对,百思不得其解啊  
void ADC_Configuration(void)
{
        ADC_InitTypeDef ADC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

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

        RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ÅäÖÃʱÖÓ(12MHz),ÔÚRCCÀïÃ滹ӦÅäÖÃAPB2=AHBʱÖÓ72MHz£¬

        switch(dev.ADinfo.AD_CHN)
    {
        case 0x01:
            ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_1Cycles5);  
            break;
        case 0x02:
            ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_1Cycles5);  
            break;
        case 0x03:
            ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_1Cycles5);  
            ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 2, ADC_SampleTime_1Cycles5);  
            break;
    }
        ADC_Cmd(ADC1,ENABLE);
        ADC_DMACmd(ADC1,ENABLE);

        //        ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);

        ADC_ResetCalibration(ADC1);
        while(ADC_GetResetCalibrationStatus(ADC1));
        ADC_StartCalibration(ADC1);                                          //Start Calibration register
        while(ADC_GetCalibrationStatus(ADC1));                        
        ADC_ExternalTrigConvCmd(ADC1, ENABLE);                       
}
void DMA_Configuration(void)
{
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)membuf1;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 256;
        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_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);

        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);

        DMA_Cmd(DMA1_Channel1, ENABLE);

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

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

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

        //        TIM_Cmd(TIM2, ENABLE);

        TIM_InternalClockConfig(TIM2);
        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
        TIM_UpdateDisableConfig(TIM2, DISABLE);

}
沙发
mmuuss586| | 2014-2-5 20:22 | 只看该作者
偏低吧?

使用特权

评论回复
板凳
854619267|  楼主 | 2014-2-5 20:26 | 只看该作者
对50hz交流电整流后采样,上位机显示的曲线是这样的   很明显刚开始的几个数据有问题

使用特权

评论回复
地板
854619267|  楼主 | 2014-2-5 20:27 | 只看该作者
mmuuss586 发表于 2014-2-5 20:22
偏低吧?

不是偏低 很高,然后又很低

使用特权

评论回复
5
明月小厨| | 2014-2-6 10:05 | 只看该作者
用排除法查查看;确定问题如上,是ADC的问题;

使用特权

评论回复
6
854619267|  楼主 | 2014-2-6 23:44 | 只看该作者
明月小厨 发表于 2014-2-6 10:05
用排除法查查看;确定问题如上,是ADC的问题;

哪有可能有问题呢  求教 我想不出来

使用特权

评论回复
7
香水橙| | 2014-2-7 09:47 | 只看该作者
贴个电路图看看,会不会是电路上的问题?

使用特权

评论回复
8
明月小厨| | 2014-2-7 17:19 | 只看该作者
一个环节一个环节查,先看看ADC的结果靠不靠谱,然后用固定的数据送串口,看接收的结果;这样一查就知道,哪里有问题了。
分割——排除;

使用特权

评论回复
9
weiyuliang| | 2014-4-3 11:02 | 只看该作者
是你先用一个标准信号源试一下嘛,

使用特权

评论回复
10
_编程浪子| | 2014-4-3 11:05 | 只看该作者
weiyuliang 发表于 2014-4-3 11:02
是你先用一个标准信号源试一下嘛,

;P

使用特权

评论回复
11
weiyuliang| | 2014-4-6 09:54 | 只看该作者
_编程浪子 发表于 2014-4-3 11:05

:funk:
我的意思是 先确认各个通道采集的数据是正确的,比如通道0接3.3V 通道1接0V 通道3接1.65V,然后观察一下各个通道的数据是否正确,
这样也会比鄙视?

使用特权

评论回复
12
闻平童鞋| | 2014-4-6 17:15 | 只看该作者
给个直流源 测测ADC 然后再看是不是传输问题

使用特权

评论回复
13
johngray| | 2014-4-6 17:35 | 只看该作者
我估计还是传输问题了

使用特权

评论回复
14
_编程浪子| | 2014-4-7 10:58 | 只看该作者
weiyuliang 发表于 2014-4-6 09:54
我的意思是 先确认各个通道采集的数据是正确的,比如通道0接3.3V 通道1接0V 通道3接1.65V,然后观 ...

以为你会建议他买个信号发生器呢。。。

使用特权

评论回复
15
lei129210| | 2014-4-7 11:07 | 只看该作者
如果是传输问题,仿真看看缓存器里面的数据和上面的数据是否一致就知道了啊。这里真的不错,别人都是在教你分析问题的方式,这比一上来就告诉问题所在要好。好好吸取别人的建议。这对你以后的工作帮助会很大。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

12

帖子

0

粉丝