双路ADC采样 一路数据正确另一路怎么不对啊
源代码如下GPIO_InitTypeDef GPIOA_ADC01;
DMA_InitTypeDef DMA_ADC01;
ADC_InitTypeDef ADC_ADC01;
//NVIC_InitTypeDef NVIC_DMA1 ;
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable ADC1 and ADC2 and GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2|RCC_APB2Periph_GPIOA, ENABLE);
//初始化GPIO
/* PA0,PA1*/
GPIOA_ADC01.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIOA_ADC01.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIOA_ADC01);
//初始化DMA
DMA_DeInit(DMA1_Channel1); //设置的时候首先要 复位。 ADC1 采用DMA1, 通道1
DMA_ADC01.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC外设地址+偏移
DMA_ADC01.DMA_MemoryBaseAddr = (uint32_t)&ADC_BBiqValue; //内存地址 会变化
DMA_ADC01.DMA_DIR = DMA_DIR_PeripheralSRC; //方向:外设是源,即从外设读
DMA_ADC01.DMA_BufferSize = BBIQ_DATA_SIZE; //100个数
DMA_ADC01.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设增量模式
DMA_ADC01.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存增量模式 使能的
DMA_ADC01.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word ; // 32位
DMA_ADC01.DMA_MemoryDataSize = DMA_MemoryDataSize_Word ;
DMA_ADC01.DMA_Mode = DMA_Mode_Circular; //循环模式
DMA_ADC01.DMA_Priority = DMA_Priority_High; //优先级
DMA_ADC01.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_ADC01);
DMA_ITConfig(DMA1_Channel1,DMA1_IT_TC1,ENABLE); //使能传输完成中断
/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
//初始化ADC
/* ADC1 configuration */
ADC_DeInit(ADC1); //复位ADC1
ADC_ADC01.ADC_Mode = ADC_Mode_RegSimult; //同步规则模式
ADC_ADC01.ADC_ScanConvMode = ENABLE; // 支持扫描
ADC_ADC01.ADC_ContinuousConvMode = ENABLE; // 连续采样
ADC_ADC01.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不支持触发
ADC_ADC01.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
ADC_ADC01.ADC_NbrOfChannel = 1; //
ADC_Init(ADC1, &ADC_ADC01);
/* ADC2 configuration */
ADC_DeInit(ADC2); //复位ADC2
ADC_ADC01.ADC_Mode = ADC_Mode_RegSimult; //同步规则模式
ADC_ADC01.ADC_ScanConvMode = ENABLE; // 支持扫描
ADC_ADC01.ADC_ContinuousConvMode = ENABLE; // 连续采样
ADC_ADC01.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不支持触发
ADC_ADC01.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
ADC_ADC01.ADC_NbrOfChannel = 1; //
ADC_Init(ADC1, &ADC_ADC01);
/* ADC1 regular channe0和1 configuration */
//一条命令只能设置一个ADC的某个channel 在序列中的位置和时钟
/*
采样时钟为12MHz,
分频比 可以为 1, 7, 13, 28, 41, 55, 71, 239
对应采样时钟为 8MHz, 1.6MHz, 0.89MHz, 420kHz, 290kHz, 216kHz, 168kHz, 50kHz
ADC0 对应IQB, ADC1 对应IQA
不要在2个ADC上转换相同的通道?
*/
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);
ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 DMA */
ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 */
ADC_ResetCalibration(ADC1); /* Enable ADC1 reset calibaration register */
while(ADC_GetResetCalibrationStatus(ADC1)); /* Check the end of ADC1 reset calibration register */
ADC_StartCalibration(ADC1); /* Start ADC1 calibaration */
while(ADC_GetCalibrationStatus(ADC1)); /* Check the end of ADC1 calibration */
/* Enable ADC2 external trigger conversion */
ADC_ExternalTrigConvCmd(ADC2, ENABLE); //ADC2是由ADC1触发的,需要支持外部触发
ADC_Cmd(ADC2, ENABLE); /* Enable ADC2 */
ADC_ResetCalibration(ADC2); /* Enable ADC1 reset calibaration register */
while(ADC_GetResetCalibrationStatus(ADC2)); /* Check the end of ADC1 reset calibration register */
ADC_StartCalibration(ADC2); /* Start ADC1 calibaration */
while(ADC_GetCalibrationStatus(ADC2)); /* Check the end of ADC1 calibration */
数据用串口打印出来,第一路正常;第二路不变。 (应该和第一路差不多是变化的)。 每次测试第二路值都不一样。 这次是1558, 下次可能是就是1660了。似乎第二路只采了一个值,没有采样
1753 1558
1550 1558
1591 1558
1668 1558
1709 1558
1781 1558
1823 1558
1795 1558
1789 1558
1736 1558
1661 1558
1641 1558
1605 1558
1604 1558
1665 1558
1695 1558
1753 1558
回复:双路ADC采样 一路数据正确另一路怎么不对啊
中断函数源代码void DMA1_Channel1_IRQHandler(void)
{
extern __IO uint8_t State_Adc1_TC;
if (DMA_GetITStatus(DMA1_IT_TC1) != RESET)
{
State_Adc1_TC=1;
ADC1->CR2&=~(1
RE:双路ADC采样 一路数据正确另一路怎么不对啊
可能原因:1.采集的电压值已经超过了可以采集的最大电压值(3.3V)2.对应1558数字量转化为模拟电压正好在1.25V左右,这是个巧合吗?这是AD的基准吧还是什么啊?
回复:双路ADC采样 一路数据正确另一路怎么不对啊
串口输出的已经是实际电压了。即*3300/4096。单位为mV程序设计连续同步采样二路信号电压, 从数据看 第一次都对了。但第二次以及以后的。 第一路信号是对的(在变化),第二路信号值维持不变(不正确)
回复:双路ADC采样 一路数据正确另一路怎么不对啊
弄好了。 程序有个bug初始化ADC2的时候 初始化ADC1了。
ADC_Init(ADC1, &ADC_ADC01);
RE:双路ADC采样 一路数据正确另一路怎么不对啊
恭喜恭喜:D
页:
[1]