STM32 CubeMX学习实验10:ADC多通道采集和内部温度传感器读取

一、工程配置

开启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负担。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值