STM32F103系列提供了3个ADC,精度为12位,每个ADC最多有16个通道和2个内部信号源。
STM32F103的ADC是一种逐次逼近型模拟数字转换器。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阈值。ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
中断
中断结束中断
模拟转换结束后,可以产生中断。
中断分三种:
规则通道转换结束中断
诸如转换通道转换结束中断
模拟看门狗中断
其中转换结束中断很好理解,跟我们平时接触的中断一样,有相应的中断标志位和中断使能位,我们还可以更具中断类型写相应配套的中断服务程序。
模拟看门狗中断
当被ADC转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断,前提是我们开启了模拟看门狗中断,其中低阈值和高阈值由ADC_LTR和ADC_HTR设置。
例如,我们设置的高阈值是2.5V,那么模拟电压超过2.5V的时候,就会产生模拟看门狗中断,反之低阈值也一样。
DMA请求
规则和注入通道转换结束后,出了产生中断外,还可以产生DMA请求,把转换好的数据直接储存在内存里面。要注意的是只有ADC1和ADC3可以产生DMA请求。
数据对齐
16位的寄存器只用到了其中12位。
可以使用高12位,数据就是左对齐。
也可以使用低12位,数据就是右对齐。
右对齐:高4位补零,读取的值就是实际值。

左对齐:低4位补零,读取的值就是实际值的16倍。

在实际使用中,最好使用低12位,这样得到的数据就可以直接使用。
转换时间
ADC使用若干个ADC_CLK周期对输入电压采样。
总转换时间如下计算:
T~CONV~ = 采样时间 + 12.5个ADC周期。
当ADCCLK = 14MHz,假设采样时间为1.5个周期。
T~CONV~ = 1.5 + 12.5 = 14周期 = 1μs。
电压转换
模拟电压经过ADC转换后,是一个12位的数字值,如果通过串口以16进制打印出来的话,可读性比较差,那么有时候我们就需要把数字电压转换成模拟电压,也可以跟实际的模拟电压(万用表测)对比,看看转换是否准确。
我们一般再设计原理图的时候会把ADC的输入电压范围设定在:0~3.3V,因为ADC是12位的,那么12位满量程对应就是3.3V,12位满量程(全部是1)对应的数字值是:2^12-1^。数值0对应的就是0V。
如果转换后的数值为X,X对应的模拟电压为Y,那么会有一个等式成立:
2^12-1^/3.3 = X/Y
Y =(3.3 * X )/ 2^12-1^ = 3.3 * X / 4095