小乐子531 发表于 2019-4-3 11:01:32

stm32一个ADC,使用两个通道,可以同时采集吗?不使用DMA

stm32一个ADC,使用两个通道,可以同时采集吗?不使用DMA我使用后,传输的数据全部是后一个通道的值,不知道什么原因?求大神帮忙解决。
应该是存入同一个寄存器,覆盖了才结束标志位,请问怎么解决。

wenyangzeng 发表于 2019-4-3 11:49:14

2个以上ADC采样必须设置成扫描模式:

ADC_InitStructure.ADC_ScanConvMode = ENABLE;

edmundlee 发表于 2019-4-3 12:27:27

一个ADC靠开关选择其中之一的通道采样, 能怎样同时?二个开关同时闭合?子细想想都知道这是不可能的

七哥 发表于 2019-4-3 12:32:52

DMA很好用的。
把DMA开成循环模式,ADC用扫描+持续方式;什么时候想要ADC数据了,直接从数组往出读就可以了。除了有点浪费DMA时间和费点电之外,很省事。
/**
* @briefDMA1 channel1 configuration
* @paramNone
* @retval None
*/
void DMA1_Configuration(void)
{
/* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC1ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 64;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA1 channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
}

/**
* @briefADC1 configuration
* @paramNone
* @retval None
*/
void ADC1_Configuration(void)
{
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
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_InitStructure.ADC_NbrOfChannel = 4;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channels configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 4, ADC_SampleTime_239Cycles5);   
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Tsensor Vref ENABLE */
ADC_TempSensorVrefintCmd(ENABLE);

/* Enable ADC1 reset calibaration register */   
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));

/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));

/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

大陶 发表于 2019-4-3 12:59:05

可以的啊 可以双通道 规则采样 现在第一个通道 后采集第二个通道

一代睡神的崛起 发表于 2019-4-4 13:36:46

datasheet上讲得很详细了,ADC采样存在几种不同的模式,但是同时使能通道采集是没有这种说法的

lida 发表于 2019-4-9 16:49:09

顶下楼主,正在做这块。

yulanhao 发表于 2019-4-9 18:58:55

我也在纠结这个问题 哈哈哈 过两天看看数据手册

shuuei 发表于 2021-2-3 14:02:53

同问题。。。寄存器只有一个。。。目前一个ADC俩通道,发现寄存器中两个通道的值都会显示。
页: [1]
查看完整版本: stm32一个ADC,使用两个通道,可以同时采集吗?不使用DMA