OpenEdv-开源电子网

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

请教下原子大哥及各位大侠STM32F2 HAL库多通道ADC+DMA方式,多通道数据出错的问题

[复制链接]

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2014-7-11
在线时间
9 小时
发表于 2016-4-28 17:01:59 | 显示全部楼层 |阅读模式
15金钱
本帖最后由 丝带机 于 2016-4-28 17:06 编辑

我再调试ADC采样时,使用ADC1 +DMA多通道方式接受PC0-2上的电压值,发现只有channel12的数据比较正常,而channel10和channel11的值都不对,误差很大,想请教下大家我代码的问题出在哪儿的,我代码如下:uint16_t After_filter[3];
static void ADC_Cfg(void)
{
    ADC_ChannelConfTypeDef sConfig;
        
    /*##-1- Configure the ADC peripheral #######################################*/
    AdcHandle.Instance                   = ADC1;
    AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV8;
    AdcHandle.Init.Resolution            = ADC_RESOLUTION12b;
    AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
    AdcHandle.Init.ScanConvMode          = ENABLE;                     
    AdcHandle.Init.EOCSelection          = EOC_SINGLE_CONV;//EOC_SINGLE_CONV;
    AdcHandle.Init.ContinuousConvMode    = ENABLE;                       
    AdcHandle.Init.NbrOfConversion       = 3;                           
    AdcHandle.Init.DiscontinuousConvMode = ENABLE;//DISABLE;                     
    AdcHandle.Init.NbrOfDiscConversion   = 3;                           
    AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIGCONV_T1_CC1;//ADC_EXTERNALTRIGCONV_T1_CC1;  
    AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
    AdcHandle.Init.DMAContinuousRequests = ENABLE;
    HAL_ADC_Init(&AdcHandle);
  
    ADC_RegularChannelConfig(&AdcHandle, ADC_CHANNEL_10, 1, ADC_SAMPLETIME_480CYCLES);
    ADC_RegularChannelConfig(&AdcHandle, ADC_CHANNEL_11, 2, ADC_SAMPLETIME_480CYCLES);
    ADC_RegularChannelConfig(&AdcHandle, ADC_CHANNEL_12, 3, ADC_SAMPLETIME_480CYCLES);
        
    ADC_DMA_Cfg();
        
    HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&After_filter, 3);
}

static void ADC_DMA_Cfg(void)
{
    DMAx_CLK_ENABLE();

    ADC_DmaHandle.Instance = DMA2_Stream0;
    ADC_DmaHandle.Init.Channel  = DMA_CHANNEL_0;
    ADC_DmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY;
    ADC_DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE;
    ADC_DmaHandle.Init.MemInc = DMA_MINC_ENABLE;
    ADC_DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    ADC_DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    ADC_DmaHandle.Init.Mode = DMA_CIRCULAR;
    ADC_DmaHandle.Init.Priority = DMA_PRIORITY_HIGH;
    ADC_DmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    ADC_DmaHandle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
    ADC_DmaHandle.Init.MemBurst = DMA_MBURST_SINGLE;
    ADC_DmaHandle.Init.PeriphBurst = DMA_PBURST_SINGLE;
        
    HAL_DMA_Init(&ADC_DmaHandle);
        
    __HAL_LINKDMA(&AdcHandle, DMA_Handle, ADC_DmaHandle);

    HAL_NVIC_SetPriority(ADCx_DMA_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(ADCx_DMA_IRQn);
}

static void ADC_RegularChannelConfig(ADC_HandleTypeDef *AdcHandle, uint32_t Channel, uint32_t Rank, uint32_t SamplingTime)
{
    ADC_ChannelConfTypeDef sConfig;
        
    sConfig.Channel      = Channel;
    sConfig.Rank         = Rank;
    sConfig.SamplingTime = SamplingTime;

    HAL_ADC_ConfigChannel(AdcHandle, &sConfig);
}


void ADC_Init(void)
{
    ADC_GPIO_Cfg();
    ADC_Cfg();
}


void ADCx_DMA_IRQHandler(void)
{
        memset(After_filter, 0, sizeof(After_filter));
        HAL_DMA_IRQHandler(AdcHandle.DMA_Handle);
//        nvdfilterAd();
}

我在中断里面获取After_filter buf中的数据发现只有After_filter[3]的值是正常的,其他两个数据误差很大,不知道是怎么回事。

最佳答案

查看完整内容[请看2#楼]

原子大哥,这个问题解决了,代码是没问题的,是我在测试的时候,不同状态的电压值搞混淆了,所以瞎折腾了半天,谢谢帮顶了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2014-7-11
在线时间
9 小时
 楼主| 发表于 2016-4-28 17:02:00 | 显示全部楼层

原子大哥,这个问题解决了,代码是没问题的,是我在测试的时候,不同状态的电压值搞混淆了,所以瞎折腾了半天,谢谢帮顶了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-5-1 11:51:38 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-10-17
在线时间
3 小时
发表于 2016-10-17 11:01:39 | 显示全部楼层
哈哈对hal库不是很理解直接拿您这个用下。
回复

使用道具 举报

0

主题

25

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-6
在线时间
43 小时
发表于 2018-1-25 10:34:59 | 显示全部楼层
我也用到 ADC 加 DMA 多路采样  了,程序也是这么写的,可是程序陷在HAL_ADC_Start_DMA(&hadcx,(u32*)ADC_ConvertedValue,2);不出来,死在里边了。请大侠指点。
事在人为,顺势而为。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 01:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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