野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 853|回复: 0

ADC双重模式通道之间相互影响

[复制链接]
发表于 2024-4-15 16:28:59 | 显示全部楼层 |阅读模式
在程序中使用了ADC1的10、11、12通道,ADC2的13、14、15通道。
问题1、最终测量会使得同一个ADC的各个通道之间的数值相互影响,修改了采样周期也有这个问题
问题2、ADC2通道转换顺序需要按照以下图片所示顺序设置才能使通道和接口对应

通道转换顺序设置

通道转换顺序设置


主函数如下:

int main()
{
        uint8_t i;
        USART_Config();
        printf("双ADC双通道DMA读取\n");
       
        Delay(0XFFFFEE);
        ADC_init();
        while(1)
        {
                for(i=0;i<CHANNEL_NUM;i++)
                {
                        adcConValue = (float)((ADCValue&0xffff)*3.3)/4096;                                         //ADC1 低16位
                        adcConValue[i+CHANNEL_NUM] = (float)((ADCValue>>16)*3.3)/4096; //ADC2 高16位
                }

                printf("ADC1 PC0通道的电压为:%fV\n",adcConValue[0]);
                printf("ADC1 PC1通道的电压为:%fV\n",adcConValue[1]);
                printf("ADC1 PC2通道的电压为:%fV\n",adcConValue[2]);
               
                printf("ADC2 PC3通道的电压为:%fV\n",adcConValue[3]);
                printf("ADC2 PC4通道的电压为:%fV\n",adcConValue[4]);
                printf("ADC2 PC5通道的电压为:%fV\n",adcConValue[5]);
               
                printf("\n");
                Delay(0xffffee);
        };
}


ADC配置如下:

#include "adc.h"

uint32_t ADCValue[CHANNEL_NUM];


static void ADC_mode_config(void)
{
        GPIO_InitTypeDef ADC_GPIO_Initstruct;
        ADC_InitTypeDef  ADC_Initstruct;
        DMA_InitTypeDef  DMA_InitStruct;
       
        RCC_APB2PeriphClockCmd(ADC_GPIO_CLK,ENABLE);
        RCC_APB2PeriphClockCmd(ADC1_CLK,ENABLE);
        RCC_APB2PeriphClockCmd(ADC2_CLK,ENABLE);
        RCC_AHBPeriphClockCmd(ADC_DMA_CLK,ENABLE);
       
        ADC_GPIO_Initstruct.GPIO_Mode = GPIO_Mode_AIN;
       
        ADC_GPIO_Initstruct.GPIO_Pin = ADC1_GPIO_PIN0;
        ADC_GPIO_Initstruct.GPIO_Pin = ADC1_GPIO_PIN1;
        ADC_GPIO_Initstruct.GPIO_Pin = ADC1_GPIO_PIN2;
       
        ADC_GPIO_Initstruct.GPIO_Pin = ADC2_GPIO_PIN1;
        ADC_GPIO_Initstruct.GPIO_Pin = ADC2_GPIO_PIN2;
        ADC_GPIO_Initstruct.GPIO_Pin = ADC2_GPIO_PIN3;
       
        GPIO_Init(ADC_GPIO_PORT,&ADC_GPIO_Initstruct);
       
        DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)(&(ADC1_SOURCE->DR));
        DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)ADCValue;
        DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStruct.DMA_BufferSize = CHANNEL_NUM;
        DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
        DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
        DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStruct.DMA_Priority = DMA_Priority_High;
        DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(ADC_DMA_CHANNEL, &DMA_InitStruct);
        DMA_ClearFlag(ADC_DMA_FLAG_TC);
        DMA_Cmd(ADC_DMA_CHANNEL, ENABLE);
       
        ADC_Initstruct.ADC_Mode = ADC_Mode_RegSimult;   //规则同步
        ADC_Initstruct.ADC_ScanConvMode = ENABLE;                         //扫描针对多通道
        ADC_Initstruct.ADC_ContinuousConvMode = ENABLE;
        ADC_Initstruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  //软件触发 不使用外部触发
        ADC_Initstruct.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_Initstruct.ADC_NbrOfChannel = CHANNEL_NUM;                                 //转换通道数目
        ADC_Init(ADC1_SOURCE,&ADC_Initstruct);
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //配置adc时钟 APB2分频
        ADC_RegularChannelConfig(ADC1_SOURCE,ADC1_CHANNEL0,1,ADC_SampleTime_239Cycles5);  //配置通道 转换顺序、时间
        ADC_RegularChannelConfig(ADC1_SOURCE,ADC1_CHANNEL1,2,ADC_SampleTime_239Cycles5);  //配置通道 转换顺序、时间
        ADC_RegularChannelConfig(ADC1_SOURCE,ADC1_CHANNEL2,3,ADC_SampleTime_239Cycles5);  //配置通道 转换顺序、时间

        ADC_DMACmd(ADC1_SOURCE,ENABLE);//使能ADC_DMA请求

        ADC_Init(ADC2_SOURCE,&ADC_Initstruct);
        ADC_RegularChannelConfig(ADC2_SOURCE,ADC2_CHANNEL1,3,ADC_SampleTime_239Cycles5);  //配置通道 转换顺序、时间
        ADC_RegularChannelConfig(ADC2_SOURCE,ADC2_CHANNEL2,1,ADC_SampleTime_239Cycles5);  //配置通道 转换顺序、时间
        ADC_RegularChannelConfig(ADC2_SOURCE,ADC2_CHANNEL3,2,ADC_SampleTime_239Cycles5);  //配置通道 转换顺序、时间

        ADC_ExternalTrigConvCmd(ADC2_SOURCE,ENABLE); //把ADC2设置为外部触发 ADC1是主,由adc1的多路触发转换器来

        ADC_Cmd(ADC1_SOURCE,ENABLE);                // 初始化ADC 校准寄存器  
        ADC_ResetCalibration(ADC1_SOURCE);        // 等待校准寄存器初始化完成
        while(ADC_GetResetCalibrationStatus(ADC1_SOURCE));       
        ADC_StartCalibration(ADC1_SOURCE);//校准ADC
        while(!ADC_GetCalibrationStatus(ADC1_SOURCE));//等待校准完成
       
        ADC_Cmd(ADC2_SOURCE,ENABLE);
        ADC_ResetCalibration(ADC2_SOURCE);
        while(ADC_GetResetCalibrationStatus(ADC2_SOURCE));       
        ADC_StartCalibration(ADC2_SOURCE);//校准ADC
        while(!ADC_GetCalibrationStatus(ADC2_SOURCE));//等待校准完成
       
        ADC_SoftwareStartConvCmd(ADC1_SOURCE,ENABLE);//开始软件触发转换ADC数据
}

void ADC_init(void)
{
        ADC_mode_config();
}



ADC-DMA多通道读取.rar (4.69 MB, 下载次数: 9)



回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-1 06:58 , Processed in 0.157495 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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