第六章 ADC转换
6.1模数转换器(ADC)概述
ADC:Analog to Digital Converter
将时间和幅值连续的模拟量转化为时间和幅值离散的数字量,A/D转换一般要经过采样、保持、量化、编码4个过程。
A/D转换的几个技术指标
量程:指ADC所能输入模拟信号的类型和电压范围,即参考电压。信号类型包括单极性和双极性。
转换位数:量化过程中的量化位数n。A/D转换后的输出结果用n位二进制来表示。例如:10位ADC的输出值就是0~1023。
分辨率:ADC能够分辨的模拟信号最小变化量。
分辨率 = 量程/2^n
转换时间:ADC完成一次完整的A/D转换所需要的时间,包括采样、保持、量化、编码4个过程
6.2查询方式和中断方式的HAL库函数应用
1.查询方式,阻塞式A/D转换
Uint16_t ADC_Value = 0;
HAL_ADC_Start(&hadc); //启动ADC
if(HAL_OK == HAL_ADC_PollForConversion(&hadc,10))
//中断读取返回结果
{
ADC_Value = HAL_ADC_GetValue(&hadc);//将读取的值存放在ADC_Value中
//ADC_Value就是我们得到的采样值
}
2.中断方式,非阻塞式A/D转换
Uint16_t ADC_Value = 0;
HAL_ADC_Start_IT(&hadc); //启动ADC
Void HAL_ADC_ConvCpltCallback(ADC_Handle TypeDef* hadc1)
//中断回调函数读取返回结果
{
ADC_Value = HAL_ADC_GetValue(&hadc);//将读取的值存放在ADC_Value中
//ADC_Value就是我们得到的采样值
}
例:
[1]将ADC_ IN0 设置为12位ADC,右对齐,启用中断;
[2]分别用查询和中断这2种方式,每隔0.5秒采样一次ADC的数 据;
[3]将每次读取到的ADC采样值转换为对应电压值,发送到上位机;.
[4] LED1作为采样指示灯,在ADC转换过程中点亮,其余时间熄灭。
CubeMX配置
查询方式代码:
uint16_t ADC_Value = 0,ADC_Volt = 0;
uint8_t str_buff[64];
void UR1_send()
{
sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt/100,(ADC_Volt%100)/10,ADC_Volt%10);
HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
void ADC0_Get_Value(void)//查询方式
{
HAL_ADC_Start(&hadc1);
LED_up(0x01);//打开LED1
if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
{
ADC_Value = HAL_ADC_GetValue(&hadc1); //ADC_Value是采样值
ADC_Volt = ADC_Value*330/4096; //4096 = 2^12;12是12位的ADC,330表示3.3v,如果是mv则采用3300
//将采样值转化为电压
}
UR1_send(); //调用串口发送函数
LED_off(0x01);//关闭LED1
HAL_ADC_Stop(&hadc1); //停止ADC采样
}
//在主函数内调用该函数即可ADC0_Get_Value();
中断方式代码:
uint16_t ADC_Value = 0,ADC_Volt = 0;
uint8_t str_buff[64];
void UR1_send()
{
sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt/100,(ADC_Volt%100)/10,ADC_Volt%10);
HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
//找到中断回调函数,在回调函数内写代码
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
if(hadc->Instance == ADC1)
{
ADC_Value = HAL_ADC_GetValue(&hadc1); //ADC_Value是采样值
ADC_Volt = ADC_Value*330/4096; //4096 = 2^12;12是12位的ADC,330表示3.3v,如果是mv则采用3300
UR1_send();//调用串口发送函数
LED_off(0x01);
}
}
//主函数
while(1)
{
LED_up(0x01);
HAL_ADC_Start_IT(&hadc1); //启动ADC模数转换
HAL_Delay(500);
}
版权声明:本文为qq_52670281原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。