一.未用定时器(未实现1kHZ传输,4通道)

1.CubeMX配置

2.代码

/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint16_t values[4]={0};
float voltage;
/* USER CODE END PV */
  /* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1);
  /* USER CODE END 2 */
   /* USER CODE BEGIN 3 */
		for(uint8_t i=0;i<4;i++)
{
	HAL_ADC_Start(&hadc1);  //开启ADC1
	if(HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY)==HAL_OK)//如果转换完成
	{
	  values[i]=HAL_ADC_GetValue(&hadc1);
		
	  voltage = values[i] * 3.3f / 4095.0f;
		
	char buffer[50];
    sprintf(buffer, "%d:%.3f V\r\n", i,voltage);
    HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer),100);
	}
	HAL_Delay(100);
}
  }
  /* USER CODE END 3 */

  3.实验结果

二.ADC+定时器(1kHZ发1拨数据,2通道,轮询) 

1.CubeMX配置

 2.修改代码

/* USER CODE BEGIN PV */
uint16_t values[2]={0};
float voltage;
/* USER CODE END PV */
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"

/* USER CODE END Includes */
  /* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1) ;
HAL_TIM_Base_Start(&htim3);
  /* USER CODE END 2 */
 /* USER CODE BEGIN 3 */
		for(uint8_t i=0;i<2;i++)
{
	HAL_ADC_Start(&hadc1);  
	if(HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY)==HAL_OK)
	{
	  values[i]=HAL_ADC_GetValue(&hadc1);
		
	  voltage = values[i] * 3.3f / 4095.0f;
		
	char buffer[50];
    sprintf(buffer, "%d:%.3f \r\n", i,voltage);
    HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer),100);
	}
}
  }
  /* USER CODE END 3 */

 三.DMA+ADC+定时器(1KHZ发两拨数据,2通道)

1.CubeMX配置

2.代码

/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint16_t values[2] ;   
char message[50]="";
/* USER CODE END PV */
  /* USER CODE BEGIN 2 */
  HAL_ADCEx_Calibration_Start(&hadc1);
  HAL_TIM_Base_Start(&htim3);
  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)values, 2); 
  /* USER CODE END 2 */
/* USER CODE BEGIN 4 */
  void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc){
	if(hadc==&hadc1){
		sprintf(message,"%.3f %.3f\r\n",values[0]* 3.3f / 4095.0f,values[1]* 3.3f / 4095.0f);
		//HAL_UART_Transmit_DMA(&huart1,(uint8_t*)message,strlen(message));
	}

}
/* USER CODE END 4 */

 问题:数据的传输周期不是1ms而显示2ms.

 加入定时器中断,检查

可见,一次定时器触发只记录一个数据,而传输两个数据需要两次定时器触发的时间,这也就是为什么时间变成了预期的2倍。

解决:

提升波特率为230400

修改TIM3的PSC为 35

结果

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐