1、ADC简介
1.1 模式
ADC–模数转换器,将模拟量转换成数字量,以STM32F103为例,包含3个12位ADC,即将0-3.3V范围内的电压,用0-4095表示,二者是线性对应关系。即
实际电压 = (读取的ADC值/4096) * 3.3
STM32F系列ADC有多达18个通道,包括16个外部通道和2个内部通道,各个通道的AD可以以单次模式、连续模式、扫描模式、间断模式执行。
单次模式:只执行一次转换就停止转换
连续模式:一次转换结束后继续开始下次转换
扫描模式:按顺序对所有开启的通道转换
间断模式:一次可以不完成全部通道的转换
1.2 ADC参考电压
对于64及更小的封装,没有VREF+引脚端,在芯片内部被接到ADC电源VDDA。对于100引脚与144引脚的封装,需要对VREF进行设定,比如将VREF+接到3.3V,当然,如果追求更高的精度,可以连接一个独立的外部电压到VREF+引脚端,但要注意电压范围为2.4V—VDDA。
1.3 转换速率
ADC采样时间 = (采样周期+12.5周期)
1/ADC时钟频率
*
例如设置ADC时钟为12MHz,Sampling Time 为1.5Cycles,则采样时间为:(1.5+12.5)*1/12 = 1.167us
2、使用轮询模式
2.1 单通道
1、配置系统时钟为72M,ADC时钟为12M
2、ADC配置
3、生成工程,添加你的代码
/* USER CODE BEGIN PD */
//首先声明一个全局变量用于存放AD结果
u32 adc_value;
/* USER CODE END PD */
//初始化后加入ADC校准函数,进行一次校准
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_Delay(200);
//主循环中加入下列语句可以不断得到AD值
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,50);
adc_value = HAL_ADC_GetValue(&hadc1);
如图所示为ADC转换结果:
2.2 多通道
1、同2.1进行系统配置
2、设置ADC参数(以双通道为例)
3、加入你的代码
//声明一个全局变量用于存放ADC转换数据
u32 ad_value[2];
//主函数中使用下列代码得到两个通道的单次转换结果
int i;
for(i=0;i<2;i++)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,50);
ad_value[i]=HAL_ADC_GetValue(&hadc1);
}
3、使用DMA
1、ADC配置
2、增加DMA通道
3、加入你的代码
//DMA双通道,ad_value为定义的数据缓存数组,2为通道数(当设置DMA数据长度为word时)
HAL_ADC_Start_DMA(&hadc1,ad_value,2);
//UI显示(只为显示数据),使用开源GUI--ugui,OLED
UG_FontSelect(&FONT_12X16);
UG_SetBackcolor(C_WHITE);
UG_SetForecolor(C_BLACK);
UG_PutString(0,0,"ADCIN1");
UG_PutString(0,30,"ADCIN2");
UG_PutNum(80,0,ad_value[0],4,C_WHITE,C_BLACK);
UG_PutNum(80,30,ad_value[1],4,C_WHITE,C_BLACK);
4、使用中断
5、优化你的数据