AD转换框图
ADC采样原理
ADC主要参数
1、分辨率
2、相对精度
3、转换速度
4、采样间隔时间
5、采样的电压范围
ADC框图
双重ADC和三重ADC
ADC_HandleTypeDed结构体
ADC_InitTypeDef结构体
HAL库配置ADC电压采集-单通道采集
这里只需要重定义一下ADC的回调函数即可,然后将ADC采集到的16bit数据赋给自己定义的变量即可
/**
* @brief 转换完成中断回调函数(非阻塞模式)
* @param AdcHandle : ADC句柄
* @retval 无
*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
/*获取采集结果*/
ADC_ConvertedValue =HAL_ADC_GetValue(hadc);
}
主函数中只需要进行一个数值转换,将读取到的16bit数据转换成电压值,然后通过串口发送显示
main.c
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
uint8_t buff[128]={0};
float ADC_Vol;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
HAL_ADC_Start_IT(&hadc1);//开启ADC中断
while (1)
{
ADC_Vol=(float)ADC_ConvertedValue/4096*3.3;//读取转换的AD值
printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue);
printf("\r\n the current AD value = %f V \r\n",ADC_Vol);
HAL_Delay(500);
}
}
HAL库配置ADC电压采集-多通道采集
我们这里选择多通道采集PC2_GPIO口的电平
将ADC1、ADC2、ADC3的通道12全部打开
然后打开ADC1的DMA2,这里只需要打开ADC1的DMA,ADC2和ADC3的数据都是通过ADC1的DMA来发送
其他均使用默认配置即可,ADC2和ADC3的配置是默认跟随ADC1的配置的,不用更改
多通道采集,只需要使能三个ADC以及ADC1的DMA传输功能即可
这里只需要修改主函数,其他使用默认配置即可
main.c
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_ADC2_Init();
MX_ADC3_Init();
MX_USART1_UART_Init();
HAL_ADC_Start(&hadc3); //ADC开启顺序,必须按照这个顺序,否则会出错
HAL_ADC_Start(&hadc2);
HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)ADC123_Buff,3000);
while (1)
{
//ADC1
printf("ADC1_L:%f V \r\n",(float)(uint16_t)ADC123_Buff[0]*(3.3/4096));
//ADC2
printf("ADC2_H:%f V \r\n",(float)(uint16_t)(ADC123_Buff[0]>>16)*(3.3/4096));
//ADC3
printf("ADC3_L:%f V \r\n",(float)(uint16_t)ADC123_Buff[1]*(3.3/4096));
//ADC1
printf("ADC1_H:%f V \r\n",(float)(uint16_t)(ADC123_Buff[1]>>16)*(3.3/4096));
//ADC2
printf("ADC2_L:%f V \r\n",(float)(uint16_t)ADC123_Buff[2]*(3.3/4096));
//ADC3
printf("ADC3_H:%f V \r\n",(float)(uint16_t)(ADC123_Buff[2]>>16)*(3.3/4096));
printf("\r\n");
HAL_Delay(500);
}
}
实验结果