https://m./answer/6803809490698256648/?app=news_article&app_id=13&share_ansid=6803809490698256648 作为单片机开发的工程师都知道,ADC采集是非常常用,而且也是很基础的一个外设。常常被工程师用于采集模拟信号。 那么很多初学者一般怎么在使用ADC应用时,怎么编写代码呢?我将以STM32F103RCT6单片机,作为本文参考芯片,此芯片有3个12位的ADC,我选择其中一个ADC,实现采集电池供电电压功能的过程。 第一步,配置对应的引脚, ADC功能属于IO端口的复用,所以需要选择对应的IO进行初始化(此处前提条件硬件设计端口分配正确) 如上图所示,我们选用pc0引脚作为采集端口,先需要使能GPIOC的时钟,然后根据设计手册对GPIOC->CRL寄存器描述,对应PC0地址位置赋值为0,配置为模拟输入。如下图所示 第二步,配置ADC初始化函数 STM32F103RCT6有3个ADC,可以选择其中的任何一个作为采集ADC,但通道是已经规定好了,不能更改。 根据如上图的官方技术手册所示,PC0是ADC的第10个通道,所以在配置参数时候,我们选择ADC1,并将ADC1->SQR3寄存器设置为10通道。 如下图所示,首先需要对ADC的时钟进行使能,接着配置ADC控制寄存器,配置ADC通道,规则等,配置我已对每个寄存器配置赋值进行备注说明。 第三步,ADC扫描函数,获取ADC采集的电压值。 电池电压采集,因为电池电压信号是一个变化较慢的模拟量,所以为了获得采集数据的稳定性,减少误差和误判,需要对1000次采集的数据求平均值。 再结合电路中匹配的分压电阻,200K+100K分压,所以计算部分如下图所示,最终计算出Bat_Vol的电压值,单位是mV。 延伸说明1 ,ADC与DMA结合使用采集数据,每次ADC转换完成的数据,直接转到DMA的设定的地址当中,单片机只需要对设定地址的变量进行操作,在ADC初始化当中需要对ADC1->CR1,ADC1->CR2两个寄存器进行操作,如下图所示: 同时还需要配置对应的DMA初始化函数和ADC处理函数,此函数不再这里表述。大家可以查阅技术资料,试着去完成剩余的代码。 2,外挂ADC芯片,有些项目中,为了能够实现高精度的模拟信号采集,单片机会使用外部的ADC芯片。如ADS1294等芯片。此芯片为24位高精度ADC芯片,采用spi通信接口,实现过程比单片机ADC芯片稍显复杂。 总结 在单片机系统当中,ADC的使用非常普遍,也非常重要,各种模拟量的采集离不开它,所以作为从事单片机开发的工程师,是必须掌握这些知识点。 |
|
来自: 山峰云绕 > 《单片机电子电路及代码》