STM32Cubemx ADC多路通道非DMA

  OLED_Init();
  OLED_Clear();
  HAL_ADCEx_Calibration_Start(&hadc1);    //ADC校准

  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
//	/* 多通道数据采集 + 扫描模式 + 间断模式 */
//		for(uint8_t i=0;i<5;i++)
//		{
//			ADC_value[i] = ADC_X_Get();			//获取ADC采集到的值
//		}
//		volt_value = ADC_value[3]*3.3f/4096; //内部电压转化公式
//		tem_value = (1.43 - ADC_value[4]*3.3f/4096) / 0.0043 + 25;		//内部温度转换公式
//		
//		printf("ADC value 0 : %d \r\n",ADC_value[0]);
//		printf("volt  : %.4f \r\n",volt_value);
//		printf("tem : %.2f \r\n",tem_value);
//		HAL_Delay(1000);
	 for(int i=0;i<3;i++)
	{
		HAL_ADC_Start(&hadc1); //启动adc转换
		HAL_ADC_PollForConversion(&hadc1,50);//等待转换完成,50为最大等待时间,单位为ms
	
		if (HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
		{
			adc_value[i]=HAL_ADC_GetValue(&hadc1);
		}
	
		
		temp =(uint8_t) (1.43 - adc_value[2]*3.3/4096) / 0.0043 + 25;
	
	
	
	}
		OLED_ShowString(1,0,"ADC_X:",5,0);
		OLED_ShowNum(50,0,adc_value[0]/1000,4,1,0);
		OLED_ShowNum(64,0,adc_value[0]/100%10,4,1,0);
		OLED_ShowNum(72,0,adc_value[0]/10%10,4,1,0);
		OLED_ShowNum(84,0,adc_value[0]%10,4,1,0);
		
		OLED_ShowString(1,2,"ADC_Y:",5,0);
		OLED_ShowNum(50,2,adc_value[1]/1000,4,1,0);
		OLED_ShowNum(64,2,adc_value[1]/100%10,4,1,0);
		OLED_ShowNum(72,2,adc_value[1]/10%10,4,1,0);
		OLED_ShowNum(84,2,adc_value[1]%10,4,1,0);

	
	    OLED_ShowString(1,4,"TEMP:",5,0);
		OLED_ShowNum(50,4,temp/10,4,1,0);
		OLED_ShowNum(64,4,temp%10,4,1,0);
		OLED_ShowString(72,4," C",5,0);
		

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现ADC多通道DMA滤波,需要进行以下步骤: 1. 使用STM32CubeMX配置ADCDMASTM32CubeMX中,选择正确的芯片型号,打开“Pinout & Configuration”选项卡,然后配置ADCDMA的参数。在“ADC”选项卡中,选择要使用的通道和采样时间,然后在“DMA”选项卡中,配置DMA通道和传输模式。 2. 设置ADC DMA模式 在代码中,需要将ADC设置为DMA模式。这可以通过在HAL_ADC_Start_DMA函数中设置相应的参数来实现。例如,以下代码将ADC设置为连续DMA模式: HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADCBuffer, ADC_BUFFER_SIZE); 3. 实现数据滤波 在ADC数据传输到缓冲区之后,可以对数据进行滤波处理。可以使用各种滤波算法,例如移动平均、中值滤波等。以下是一个使用移动平均滤波的示例代码: #define N 10 uint32_t FilteredData[ADC_NUM_CHANNELS]; void FilterData(uint32_t* ADCData) { static uint32_t FilterBuffer[ADC_NUM_CHANNELS][N]; static uint32_t FilterIndex[ADC_NUM_CHANNELS] = {0}; uint32_t i, j; for(i=0; i<ADC_NUM_CHANNELS; i++) { FilterBuffer[i][FilterIndex[i]] = ADCData[i]; FilterIndex[i] = (FilterIndex[i]+1) % N; FilteredData[i] = 0; for(j=0; j<N; j++) { FilteredData[i] += FilterBuffer[i][j]; } FilteredData[i] /= N; } } 在此示例中,FilterBuffer是一个二维数组,用于存储ADC数据。FilterIndex是一个数组,用于跟踪每个通道的滤波器缓冲区中的位置。FilteredData是一个数组,用于存储滤波后的数据。 4. 处理滤波后的数据 滤波后的数据现在可以用于您的应用程序。可以将其发送到计算机或其他设备,或者用于控制硬件。以下是一个将滤波后的数据通过串口发送到计算机的示例代码: #define UART_TX_BUFFER_SIZE 256 uint8_t UARTTxBuffer[UART_TX_BUFFER_SIZE]; void SendData(void) { uint32_t i; uint32_t len = 0; for(i=0; i<ADC_NUM_CHANNELS; i++) { len += sprintf((char*)(UARTTxBuffer+len), "%d,", FilteredData[i]); } UARTTxBuffer[len-1] = '\n'; HAL_UART_Transmit(&huart1, UARTTxBuffer, len, 100); } 在此示例中,使用sprintf函数将滤波后的数据转换为字符串,并将其存储在UARTTxBuffer中。然后,使用HAL_UART_Transmit函数将数据发送到计算机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值