初级会员

- 积分
- 99
- 金钱
- 99
- 注册时间
- 2014-7-11
- 在线时间
- 9 小时
|
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#楼]
原子大哥,这个问题解决了,代码是没问题的,是我在测试的时候,不同状态的电压值搞混淆了,所以瞎折腾了半天,谢谢帮顶了
|