源代码如下 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采样 一路数据正确另一路怎么不对啊
2.对应1558数字量转化为模拟电压正好在1.25V左右,这是个巧合吗?这是AD的基准吧还是什么啊?
回复:双路ADC采样 一路数据正确另一路怎么不对啊
程序设计连续同步采样二路信号电压, 从数据看 第一次都对了。 但第二次以及以后的。 第一路信号是对的(在变化),第二路信号值维持不变(不正确)
回复:双路ADC采样 一路数据正确另一路怎么不对啊
初始化ADC2的时候 初始化ADC1了。
ADC_Init(ADC1, &ADC_ADC01);
RE:双路ADC采样 一路数据正确另一路怎么不对啊