咳咳,这一篇来玩一下STM32的ADC(Analog to Digital Converter),也就是可以把输入的模拟量转换为数字量,这样就可以做个电压表了,再加上一些辅助电路,就能够自己做一个万用表了,非常完美。(嗯,这篇我们只做数字电压表~就是这么懒)
从这一篇开始,对STM32内部结构和寄存器的介绍会更加详细一点,要开始深入了解了,感兴趣的朋友还可以对照前几篇自个儿深入了解一下,嘿嘿~ . ~
ADC介绍
打开STM32F103C8T6的数据手册,第一页就对其拥有的外设进行了简单的列举介绍,找到ADC的相关介绍:
从介绍中可以知道:
- STM32F103C8T6有2个12位的A/D转换器,支持16个通道,转换时间最小可达1us;
- A/D转换电压范围是0到3.6V,这个非常重要,不要把超过范围的电压接入电压采集引脚,轻则导致转换结果超出范围,读数不准,严重可能会烧坏引脚;因此在使用ADC进行电压转换的时候,要根据采集的电压范围进行相应的分压设计;
- 2个ADC可以同步采集,并且可由定时器控制,还具有内部温度传感器;
- 其它说明等用到的时候再看。
ADC内部结构
在STM32手册中,找到ADC章节,其内部结构图如下(看不清的话请点击放大):
有几个需要关注的部分:
- 正中间就是STM32的A/D模块的核心部分——ADC,模数转换器;
- 左侧上面的红框中:
- VREF+与VREF-是ADC的参考电压,这个电压的要求是精度高且稳定,由于笔者的最小系统板用的是STM32F103C8T6,引脚数是48,而64引脚及以下的芯片VREF是在内部连接到VDDA,仅有100脚以上的芯片才会将VREF引到外部引脚;
- VDDA和VSSA是ADC的供电电源,在笔者的最小系统板上通过电感电容组成LC滤波电路,与供电VDD连接,提供一个较为稳定的3.3V电源:
- 左侧下面的红框中就是外部电压的输入引脚了(常规的输入引脚),而VDD为3.3V供电电压,因此VREF电压为3.3V,即AD采样转换的电压范围为0~3.3V,而ADC为12位,故采样结果 0 - 4095 对应电压 0 - 3.3V;
- 在右侧的红框中是ADC所使用的时钟,在进入ADC之前有一个预分频器,而在第二篇中的时钟分析里可知,ADC挂载在APB2总线上,因此APB2总线时钟信号(72MHz)经过这个预分频器最后进入ADC,提供时钟信号,这里注意进入ADC的时钟不能超过14MHz,因此在72MHz的APB2总线时钟下,预分频系数只能设置为8分频或6分频;
- 在图中还可以看出,ADC还可以用定时器进行控制,并可以触发中断,在这里暂时不用这些功能。
ADC寄存器
了解了ADC的内部结构之后,就要开始对其寄存器进行分析,那么就会问了,我们用的是库开发,为什么还要去看寄存器呢;这里简单说明一下,库开发是为了方便程序的开发,也是建立在寄存器控制之上的,如果不了解相关的寄存器的话,可能会不知道用哪些库函数,并且作为单片机开发,了解其寄存器对后续程序移植等等都有很大的好处。当然,在刚开始看寄存器的时候难免会晕,熟悉了就好了(づ ̄ v ̄)づ
建议大家在开发单片机程序时,用这么个流程:确定相关外设后,先看板子的电路图,确定硬件电路的关系,然后在手册中找对应的外设章节进行了解,然后查看相关寄存器的配置说明,并结合手册中的功能说明进行分析,最后确定程序设计思路,然后就是写程序,最后就到了最重要的Debug,也就是改bug……
1、ADC status register (ADC_SR)
ADC_SR为ADC的状态标志寄存器,提供AD转换中的一些标志:
- Bit 31:15:保留位,不需要进行设置,但是必须保持清0;
- Bit 4 STRT:普通通道AD转换开始标志位,转换开始后由硬件置1,结束后由软件清0;
- Bit 3 JSTRT:注入通道AD转换开始标志位,同上;
- Bit 2 JEOC:注入通道AD转换完成标志位,转换完成时硬件置1,由软件清0;
- Bit 1 EOC:通道AD转换完成标志位,转换完成时硬件置1,由软件清0;
- Bit 0 AWD:模拟看门狗功能,当AD转换值超过设定的电压范围时置1,由软件清0;
所谓由软件清0就是在程序中要向该位写入0。
这里Bit 1 EOC可以用于判断AD转换是否完成,若完成就可以读取AD转换的数据了。
2、ADC control register 1 (ADC_CR1)
ADC_CR1是ADC的控制寄存器1,用于对ADC进行设置:
- Bit 31:24:保留位,不需要进行设置,但是必须保持清0;
- Bit 23 AWDEN:普通通道模拟看门狗使能,置1使能,清0禁用;
- ……
- Bit 19:16 DUALMOD[3:0]:设置2个ADC的使用方式:
- 0000 - 独立模式,2个ADC不同时工作;
- …
- ……
- Bit 11 DISCEN:普通通道非连续模式设置,置1使能非连续模式,清0禁用;
- Bit 8 SCAN:当需要采集多路电压数据时,可以使用SCAN模式,扫描模式,置1使能,清0禁用,这里我们不需要使用禁用就可以;
- ……
- Bit 5 EOCIE:转换完成触发中断使能位,置1使能,清0禁用,这里我们不需要使用禁用就可以;
- ……
由于我们只进行一路ADC的采集,只需要用到一个ADC,因此设置成独立模式即可。
3、ADC control register 2 (ADC_CR2)
ADC_CR2是ADC的控制寄存器2,用于对ADC进行设置:
- Bit 31:24:保留位,不需要进行设置,但是必须保持清0;
- Bit 23 TSVREFE:温度传感器使能;
- Bit 22 SWSTART:普通通道转换开始