一、工程配置
开启ADC1的三个通道(IN0-PA0、IN13-PC3、temperature温度转换),因为要轮询转换三个通道,需要使能扫描转换模式,配置各通道的参数,这里一次是CH0、CH13、温度转换,代码中依次转换,记住自己的配置。
二、编写代码
可以在生成的代码(adc.c)中查看所分配的通道顺序和转换时间
在main中一次读取各通道的值,将其输出到串口调试助手即可观察到三个通道的ADC信息
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_ADC1_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
uint16_t adc[3];
for(uint8_t i=0;i<3;i++)
{
HAL_ADC_Start(&hadc1);//开启转换
HAL_ADC_PollForConversion(&hadc1,10);//等待转换完成,超时时间10ms
adc[i]=HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
HAL_Delay(10);
float temp;
temp=adc[2]*(3.3/4096);//先转换成电压
temp=(temp-0.76)/0.0025+25;//转换成温度
printf("%d,%d,%f\r\n",adc[0],adc[1],temp);
}
/* USER CODE END 3 */
}
上述代码中,前两个通道分别对应IN0和IN13,直接输出即可。第三个通道adc[2]对应是单片机内部温度传感器,需要通过公式将其转换成实际温度值。代码中仅做了简单的采集和输出,ADC值跳动较大,可以通过取平均值等滤波将数据变平滑。
二、上位机查看信息
通过上位机绘制曲线可以直观看到各通道的ADC值变化,红色对应IN0,绿色对应IN13,蓝色对应的是已经转换过的内部温度值,只使用了一个电位计,绿色曲线是直接用手摸产生的变化。
通过轮询方式可以实现ADC多通道采样,但是需要占用很多CPU资源, 非常不友好,下期一起学习如何通过DMA方式进行多通道ADC数据传输,以减轻CPU负担。