分享

单片机如何通过ADC模块采集模拟信号?

 山峰云绕 2020-03-14


   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的使用非常普遍,也非常重要,各种模拟量的采集离不开它,所以作为从事单片机开发的工程师,是必须掌握这些知识点。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多