stm32f030采用轮询方法采集ADC多通道数据

参考链接:关于STM32F0系列多路ADC单独采样数据相同问题的处理
文中博主已经详细说明了采集ADC多通道数据的方法,但是代码有一处BUG,运行时容易造成死循环。

查看STM32F030参考手册

12.12.8章节ADC 通道选择寄存器 (ADC_CHSELR)

代码中涉及配置到CHSELR寄存器前,必须要确保ADC_CR寄存器的位2:ADSTART=0 时 ( 确定无进行中的转换 ) 才允许改写这些位。
在这里插入图片描述

12.12.3ADC 控制寄存器 (ADC_CR)

位 4 ADSTP: ADC 停止转换命令:该位写1停止ADC转换,使得ADSTART位为0,从而确保ADC通道能成功切换。
在这里插入图片描述

改正代码如下:


void adc_init(void){
	ADC_InitTypeDef     ADC_InitStructure;
	GPIO_InitTypeDef    GPIO_InitStructure;
	/* GPIOC Periph clock enable */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);   //打开GPIO时钟
	/* ADC1 Peripheral clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE); //打开ADC1时钟
	
	/*Initialize GPIO 对应ADC_Channel_10到ADC_Channel_13*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;       //模拟输入模式
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;  //悬空
	GPIO_Init(GPIOC, &GPIO_InitStructure);             //初始化IO
	
	/* ADCs DeInit */  
	ADC_DeInit(ADC1);                                  
	/* Initialize ADC structure */
	ADC_StructInit(&ADC_InitStructure);
	/* Configure the ADC1 in continuous mode withe a resolution equal to 12 bits  */
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;    //12位精度
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; 			//单次转换 每次转换需要start
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;   //软件触发
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                        //右对齐
	ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;             //Backward
	ADC_Init(ADC1, &ADC_InitStructure); 
//	ADC_OverrunModeCmd(ADC1, ENABLE);     //使能数据覆盖模式
	ADC_ChannelConfig(ADC1, ADC_Channel_11 , ADC_SampleTime_239_5Cycles);         //通道选择
	/* ADC Calibration */
	ADC_GetCalibrationFactor(ADC1);                                               //ADC校准
	/* Enable the ADC peripheral */
	ADC_Cmd(ADC1, ENABLE);                                                        //打开ADC
	/* Wait the ADRDY flag */
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));                              //等待ADC准备完成
	/* ADC1 regular Software Start Conv */ 
//	ADC_StartOfConversion(ADC1);   //单次转换需要每次启动
}

/**
  * @brief  Returns the last ADCx conversion result voltage data for ADC channel.  
* @param  ADC_Channel_x:ADC通道号
  * @retval The Data conversion average value(v).
  */
float get_ADC_AvrVoltageValue(uint32_t ADC_Channel_x,uint8_t times) {
	float ADC1ConvertedValue = 0.0;
	//停止转换 对应ADC_StopOfConversion(ADC_TypeDef* ADCx)
	ADC1->CR |= (uint32_t)ADC_CR_ADSTP;          
	ADC_ChannelConfig(ADC1, ADC_Channel_x , ADC_SampleTime_239_5Cycles);
	//只选择ADC_Channel_x这个通道有效
	ADC1->CHSELR =ADC_Channel_x;
	//等待准备完成
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY) == RESET);
	//ADC_StartOfConversion(ADC1);
	for(int i=0;i<times;i++){
		/* ADC1 regular Software Start Conv */ 
		ADC_StartOfConversion(ADC1);
		/* Wait EOC flag */
		while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
		/* Get ADC1 converted data */
		ADC1ConvertedValue += ADC_GetConversionValue(ADC1);
	}
	return (float)(ADC1ConvertedValue *3.3)/0xFFF/times;
}

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32是一款基于ARM Cortex-M处理器架构的32位微控制器,它拥有丰富的外设和功能,可以广泛应用于各种应用领域。其中,ADC(模数转换器)是STM32的一个非常重要的模块,用于实现模拟信号的数字化转换。 在STM32中,ADC支持多种数据采集方式,包括轮询方式、DMA方式和中断方式。其中,中断方式相对于其他两种方式而言更加灵活和高效。采用中断方式的ADC采集,可以实现多通道数据的快速采集和处理。 对于多通道ADC采集,我们可以通过配置ADC的多个通道,然后使用中断方式逐个采集这些通道的数据。具体的步骤如下: 1. 配置ADC的多个通道。可以通过设置ADC的通道数和采样时间等参数来配置多个通道的采集。 2. 配置ADC的中断。可以设置ADC的中断控制器,使得ADC采集完每个通道的数据后触发中断,将数据传送给中断服务程序。 3. 编写ADC的中断服务程序。这个程序需要处理ADC的中断请求,并将采集到的数据传送到应用程序中进行处理。 4. 启用ADC的中断。可以通过使能ADC的中断控制器来启用ADC的中断采集功能。 通过以上步骤,我们可以实现对STM32多通道ADC采集功能的配置和使用。中断方式采集的优点在于采集速度快、实时性好,适用于需要高速、高精度数据采集的应用场合。 ### 回答2: STM32 ADC(模数转换器)是一款非常强大的芯片,可以实现多通道中断方式数据采集ADC通常用于将模拟信号转换为数字信号,使其可以被微控制器处理。在STM32中,ADC实现了13位模拟数字转换器,并且支持多通道,可以同时测量多个输入信号。 在多通道数据采集中,我们可以使用中断方式,实现在数据达到我们设定的采样值时,自动进行数据采集。具体步骤如下: 首先,我们需要初始化ADC和GPIO。ADC需要先初始化时钟和DMA,然后将ADC配置为多通道扫描模式。GPIO也需要配置为模拟输入模式。 接下来,我们需要启用中断,并在中断回调函数中进行数据采集、处理和转换。在中断函数中,我们可以使用for循环,逐一读取所有通道的数据。对于每个通道,我们可以对其进行处理和转换,例如将其转换为电压值。 最后,我们可以将处理后的数据保存在数组中,用于后续的处理和分析。我们也可以使用控制台或其他输出设备,将数据输出到屏幕或其他设备中。 总体来说,STM32 ADC多通道中断方式数据采集,需要同时配置ADC和GPIO,并使用循环逐一读取所有通道的数据,并在中断回调函数中进行数据处理和转换。这种方法可以提高数据采集的效率和准确性,并且可以轻松应对多通道数据采集的需求。 ### 回答3: 在STM32开发中,使用ADC进行数据采集是很常见的操作,而在多通道ADC采集时,中断方式可以提高采样效率和响应速度,同时实现多通道的同时采集。 在STM32中,ADC具有多种工作模式,如单通道采样模式、扫描模式、中断模式等。其中,中断模式是实现多通道ADC采集的常用方法。 首先,需要配置ADC的中断服务函数,在启用ADC中断前需要打开中断时钟。在中断服务函数中,需要判断是哪个通道发生了中断请求,并且保存数据。同时,需要设置转换序列和转换速度,以确保能够正确地采集到所需的数据。 在启用ADC之前,还需要配置ADC的采样时间(SMPR),这是设置ADC采样周期的一个重要参数,决定了采样的精度和稳定性。同时,还可以设置采样时间的顺序,以确保顺序正确。 在配置完成后,就可以启用ADC中断和DMA进行数据采集。使用DMA会大大提高数据采集的效率和速度,同时减少CPU的负担,让CPU有更多的时间进行其他的操作。 使用中断方式进行多通道数据采集需要注意一些问题,例如高速采样可能会引起数据丢失和噪声,因此需要合理设置采样时间和采样速度,并进行实时监测和纠错。同时,还需要判断ADC完成了所有的数据转换,以确保数据的有效性和正确性。 总之,使用中断方式进行多通道ADC数据采集是一种实用有效的方法,在STM32开发中得到广泛应用。通过合理配置ADC参数和中断服务函数,能够实现高效的数据采集和处理,为实现各种实时应用场景提供了有力的支持。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值