打印
[STM32F2]

STM32F207 ADC3读取数据出错

[复制链接]
2557|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CYP2005|  楼主 | 2015-3-5 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
故障现象:连续循环扫描8个通道,发现读取的数据1和3通道数据相同,2通道和4通道数据相同,硬件上1通道和3通道,2通道和4通道是独立的,如果1通道读的是300的话,3通道读也是300(3是没电压的),如果3通道读的是300的话,1通道读也是300(1是没电压的),这是什么情况啊?同一个芯片上还使用了ADC1,也是独立连续循环扫描模式,通道都正常,ADC3配置哪里出错呢?
ADC3口配置如下:
void ADC3_Configuration(void)
{
        //GPIO_InitTypeDef GPIO_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
  DMA_InitTypeDef DMA_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE);// ADC3的时钟信号
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //DMA,F口的时钟信号
//  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //DMA,F口的时钟信号


/* ADC3 configuration ------------------------------------------------------*/
        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//ADC模块独立工作模式
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;//  //ADC采样周期8分频
  //ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles; //采样周期
  ADC_CommonInit(&ADC_CommonInitStructure);

        //DMA_DeInit(DMA2_Stream0);
        DMA_InitStructure.DMA_Channel=DMA_Channel_2;
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC3_DR_ADDRESS;//ADC1接口寄存器首地址 外设地址
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3_Value;//定义寄存器基址//ADC结果地址
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//定义DMA传输模式从外设到内存
  DMA_InitStructure.DMA_BufferSize = 80;// 13*10  //设置DMA在传输时缓冲区的长度 word/
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA的外设递增模式/
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设置DMA的内存递增模式/
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;////DMA外设数据大小,16位半字
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;////DMA存储器数据大小,16位半字
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的传输模式:连续不断的循环模式/
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA的优先级别/
        DMA_InitStructure.DMA_FIFOMode= DMA_FIFOMode_Disable; //直接传输模式无效  
  DMA_InitStructure.DMA_FIFOThreshold= DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst= DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst= DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);/* Enable DMA1 channel1 */
  
//  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//ADC采样精度
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;//采用扫描模式,因为多路
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续扫描模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;;//无外部触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 8;//  通道个数8
  ADC_Init(ADC3, &ADC_InitStructure);
        //ADC_ContinuousModeCmd(ADC2,ENABLE);
       
  /* ADC1 regular channel configuration */
  ADC_RegularChannelConfig(ADC3, ADC_Channel_4, 1, ADC_SampleTime_15Cycles);
        ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 2, ADC_SampleTime_15Cycles);
        ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 3, ADC_SampleTime_15Cycles);
        ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 4, ADC_SampleTime_15Cycles);
        ADC_RegularChannelConfig(ADC3, ADC_Channel_8, 5, ADC_SampleTime_15Cycles);
        ADC_RegularChannelConfig(ADC3, ADC_Channel_9, 6, ADC_SampleTime_15Cycles);
        ADC_RegularChannelConfig(ADC3, ADC_Channel_14, 7, ADC_SampleTime_15Cycles);
        ADC_RegularChannelConfig(ADC3, ADC_Channel_15, 8, ADC_SampleTime_15Cycles);
       
  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
  ADC_DMACmd(ADC3, ENABLE); /* Enable ADC3 DMA */   
  ADC_Cmd(ADC3, ENABLE);/* Enable ADC3 */
  ADC_SoftwareStartConv(ADC3);/* Start ADC3 Software Conversion */
}
沙发
mmuuss586| | 2015-3-5 19:04 | 只看该作者
#define ADC1_DR_Address    ((uint32_t)0x4001244C)
#define ADCN 128                                                 //每通道采16次
#define ADCM 16                                                 //为16个通道

vu16 AD_ConvertedValue[ADCN][ADCM];         //用来存放ADC转换结果,也是DMA的目标地址
vu16 After_filter[ADCM];                 //用来存放求平均值之后的结果

void ADC1_Configuration(void)
{
        ADC_InitTypeDef ADC_InitStructure;       
        GPIO_InitTypeDef GPIO_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
       
        /* Enable DMA1 clock */
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1 ,ENABLE);
       
        //PC2--PC3 PA0--PA7 PC4--PC5  PB0--PB1
        //PA0/1/2 作为模拟通道输入引脚
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4| GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        //PB0--1 作为模拟通道输入引脚
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
        GPIO_Init(GPIOC, &GPIO_InitStructure);       

        DMA_DeInit(DMA1_Channel1);                                                                                                                                                                                                         //将DMA的通道1寄存器重设为缺省值
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;                                                                         //DMA外设ADC基地址
        //DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_ConvertedValue;                                                 //DMA内存基地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                                                                                         //内存作为数据传输的目的地
        DMA_InitStructure.DMA_BufferSize = ADCN*ADCM;                                                                                                                         //DMA通道的DMA缓存的大小
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                                                 //外设地址寄存器不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                                                 //内存地址寄存器递增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                                 //数据宽度为16位
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                 //工作在循环缓存模式
        DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                 //DMA通道x没有设置为内存到内存传输
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);                                 //根据DMA_InitStruct中指定的参数初始化DMA的通道
       
        DMA_Cmd(DMA1_Channel1, ENABLE);

        ADC_DeInit(ADC1);                                                                                                                                         //将外设 ADC1 的全部寄存器重设为缺省值

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;         //ADC工作模式:独立模式
        ADC_InitStructure.ADC_ScanConvMode =ENABLE;                                 //模数转换工作在扫描模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;         //模数转换工作在连续转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发转换关闭
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;         //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = ADCM;                                                         //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);                                                                                 //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器

        //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
        //ADC1,ADC通道x,规则采样顺序值为y,采样时间为239.5周期
        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,                 ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2,                ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3,                 ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4,                 ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5,                 ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6,                 ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7,                 ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8,                 ADC_SampleTime_239Cycles5 );
       
        ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 9,                 ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 10,         ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 11,         ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 12,         ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 13,         ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 14,         ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 15,         ADC_SampleTime_239Cycles5 );
        ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 16,         ADC_SampleTime_239Cycles5 );
       
          /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);

        ADC_Cmd(ADC1, ENABLE);                                                                                                 //使能指定的ADC1
        ADC_ResetCalibration(ADC1);                                                                         //复位指定的ADC1的校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));         //获取ADC1复位校准寄存器的状态,设置状态则等待
        ADC_StartCalibration(ADC1);                                                                                //开始校准
        while(ADC_GetCalibrationStatus(ADC1));                                 //获取指定ADC1的校准程序,设置状态则等待
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                                //使能ADC的软件转换启动功能
       
        /* Test on DMA1 channel1 transfer complete flag */
  while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  /* Clear DMA1 channel1 transfer complete flag */
  DMA_ClearFlag(DMA1_FLAG_TC1);
}

使用特权

评论回复
板凳
mmuuss586| | 2015-3-5 19:05 | 只看该作者

上面是我F1开了16个通道的AD的参考程序,仅供参考;

使用特权

评论回复
地板
小浣熊| | 2015-3-5 20:16 | 只看该作者
进来看看,表示不懂额 帮忙顶下!!!

使用特权

评论回复
5
CYP2005|  楼主 | 2015-3-6 08:55 | 只看该作者
ADC1我用了正常的(在这个项目里面),因为ADC1口不够用,加了ADC3口的,想不到出现这样的情况,也不清楚跟ADC1有什么不同?

使用特权

评论回复
6
MOn51| | 2015-3-6 09:39 | 只看该作者
你的IO脚定义好了吗?

使用特权

评论回复
7
CYP2005|  楼主 | 2015-3-6 09:43 | 只看该作者

IO脚都定义好

使用特权

评论回复
8
CYP2005|  楼主 | 2015-3-6 09:45 | 只看该作者
IO脚都定义:PF3~PF10

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝