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