ADC数模转换HAL库(先记着

ADC简介

ADC数模转换运用场景:比如麦克风说出来的数据是模拟量的数据,CPU只能读懂01数字量的信息,我们需要把模拟量的信息转换为数字量,这个叫ADC数模转换。
///分割线/

数模转换四步骤

在这里插入图片描述

数模转换四步骤

:输入模拟量的电压,然后进行采样数据,采样数据的时候要保持电平,再量化出采集的信息再进行数字编码
转换的时间是不能大于采样时间的。
//分割线

ADC转换通道

ADC模拟输入通道分为规则组注入组
规则组:规则组是根据逐个顺序进行转换的,比如说程序正常转换,什么都不做就是规则组。
注入组:注入组像中断一样,规则组正在进行转换时临时对某些通道进行转换。
/分割线

ADC存储方式

:ADC转换结果的存储方式有两种,左对齐和右对齐
//分割线
小计算,一个12位的ADC参考电压5V检测到的模拟量最小值(转换精度)该怎么算
公式:1/2的N次方
5/2的12次方 = 0.0012V

分割线

ADC转换HAL转换使用

ADCHAL库的使用方式

ADC在HAL库里的使用方式有两种,查询方式,中断方式,DMA方式
查询方式: 启动ADC,等待EOC转换结束标志符,读取寄存器
中断方式: 启动ADC使能中断,EOC自动触发,在中断读取转换结果
DMA方式: 日后再更,学习链接
https://www.bilibili.com/video/BV1mT4y1E7fS?spm_id_from=333.337.search-card.all.click&vd_source=032f92351cbd3c1087d63e8511161389
/分割线

ADC读取方式

ADC读取方式可以分为单次读取还有连续读取

ADC查询方式使用

uint8_t str_buff[64]; //缓冲区
uint16_t ADC_values = 0, ADC_volt = 0;
void usart_info(void)
{
    sprintf((char *)str_buff,"采样值;%d , 电压值: %d.%d%dV\r\n",ADC_values,ADC_volt/100,(ADC_volt%100)/10,ADC_volt%10);
    HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),1000);

}

/**
 * @brief ADC读取电压
 * 
 */
void ADC_out(void)
{
    HAL_ADC_Start(&hadc1);//启动ADC
    LED_ON();
    if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)//ADC是否启动然后查询转换标准,后面是等待时间
    {
        ADC_values = HAL_ADC_GetValue(&hadc1);//获取ADC取样数据
        ADC_volt = ADC_values * 330 / 4096;//ADC采样计算
    }
    usart_info();
    LED_OFF();
    HAL_ADC_Stop(&hadc1);
	
}

//用到的函数
HAL_ADC_Start(&hadc1);//启动ADC
HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK//HADC是否启动查询adc标准位
HAL_ADC_GetValue(&hadc1);读取采样数据
HAL_ADC_Stop(&hadc1);//停止ADC

使用的方式是查询方式,adc转换是12位,STM32芯片是3.3v,330/4096。
对于查询方式,启动ADC,转换过程,读出转换结果

ADCSTM32mx设置查询方式

在这里插入图片描述
//分割线

ADC中断方式使用

void usart_info(void)
{
    sprintf((char *)str_buff,"采集样%d , 电压值: %d.%d%dV\r\n",ADC_values,ADC_volt/100,(ADC_volt%100)/10,ADC_volt%10);
    HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),1000);

}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc ->Instance == ADC1)
{

  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
  ADC_values = HAL_ADC_GetValue(&hadc1);
  ADC_volt = ADC_values * 330 / 4096;
  usart_info();
  HAL_ADC_Stop_IT(&hadc1);	
}

}

//在主函数死循环里启动读取
  while (1)
  {
	  

	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
	HAL_ADC_Start_IT(&hadc1);
	HAL_Delay(500);
	
	  

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

ADC设置中断方式

需要在回调函数里进行设置,原理和查询方式一样

void usart_info(void)
{
    sprintf((char *)str_buff,"采集样%d , 电压值: %d.%d%dV\r\n",ADC_values,ADC_volt/100,(ADC_volt%100)/10,ADC_volt%10);
    HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),1000);

}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc ->Instance == ADC1)
{

  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
  ADC_values = HAL_ADC_GetValue(&hadc1);
  ADC_volt = ADC_values * 330 / 4096;
  usart_info();
  HAL_ADC_Stop_IT(&hadc1);	
}

}



///主函数的WHILE
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  

	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
	HAL_ADC_Start_IT(&hadc1);
	HAL_Delay(5000);
	
	  

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

日后再学到新知识在这更新,参考视频和文档
文档:https://blog.csdn.net/weixin_51102592/article/details/118965539
https://blog.csdn.net/qq_40883804/article/details/103282937
https://blog.csdn.net/weixin_51102592/article/details/119040127
https://blog.csdn.net/weixin_43559366/article/details/107183101
https://blog.csdn.net/as480133937/article/details/99627062
视频:https://www.bilibili.com/video/BV1ar4y1v7MT?spm_id_from=333.337.search-card.all.click&vd_source=032f92351cbd3c1087d63e8511161389

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值