本帖最后由 mxkw0514 于 2021-8-15 11:53 编辑
#申请原创# 引言:
接上一次测评:https://bbs.21ic.com/forum.php?mod=viewthread&tid=3137992&page=1&extra=#pid12133510。本次的测评在继承前一篇部分测评内容的基础上, 利用 PIC18F16Q40单片机的ADCC采样外部模拟电压,并对采样后的值进行数字化的低通滤波处理(类似于数字低通滤波器),该篇测评主要包括:
1、测评内容:
第一,围绕PIC18F16Q40单片机的ADCC模块展开,利用ADCC外设进行外部模拟信号采样和数字低通滤波。
第二,展示测量结果。
2、测评心得。
一、测评内容
1.1 MCC基本配置
利用MPLAB编译环境的MCC模块配置PIC18F16Q40单片机的System module、Pin mode、ADCC、UART和DAC,它们的配置如下图所示。首先值得注意的是,Pin mode上有一些引脚是固定引脚,是动不了的,还有一些是特殊功能引脚(选择相应的模块后会显示来),这个可以动,但是有限制范围;其次ADCC模块在配置Computation Feature那一栏,需要设置重复采样的次数(Repeat)和数字低通滤波的截至频率(Cut off frequence of LPF)。
图1.1 System module配置
图1.2 Pin module配置
图1.3 ADCC配置
图1.4 UART配置
图1.5 DAC配置
1.2 ADCC采样外部模拟电压
外部模拟电压用函数发生器生成,由于要用到ADCC数字低通滤波的性能,所以特意生成了这样一个波形:在1V的直流电压上叠加了1个0.5V的100KHz的正弦信号(该正弦信号模拟高频噪声),函数发生器的配置如图1.6、1.7所示,该外部模拟电压的波形如图1.6所示。点击MCC的Generate,生成各个模块的初始化函数和相应的功能函数,其中初始化函数会自动出现在源文件中,而哪些特定功能函数要根据自己需要进行添加。接下来讨论程序部分。
图1.6 函数发生器设置(1)
图1.7 函数发生器设置(2)
图1.8 外部模拟信号波形
工程的的main.c文件的程序如下图所示。该程序主要包含两个部分,第一部分是对外部模拟电压的采样【2】,第二部分是对采样的结果进行数字低通滤波处理(这个放在下一个小节讨论)。对模拟电压的采样主要包括两个函数,ADCC_DischargeSampleCapacitor()和ADCC_GetSingleConversion(),ADC采样的通道用函数ADCC_DischargeSampleCapacitor()设置,而模拟电压采样的点数用函数ADCC_GetSingleConversion()来获得,模拟电压=(点数/4096)*参考电压,4096为212,参考电压可以是VDD,也可以是FVR(Fixed Voltage Reference),根据实际需求来选择,如果是VDD,那么这里的参考电压就是3.3V。
#include "mcc_generated_files/mcc.h"
#include "stdio.h"
#include "lay.h"
uint16_t volatile adcVal;
uint16_t volatile adcFilterVal;
int DAC_BCD;
int DACx16;
void main(void)
{
SYSTEM_Initialize();//系统初始化函数:时钟、UART、ADCC、DAC模块初始化
INTERRUPT_GlobalInterruptHighEnable();//中断使能
while (1)
{
/*将输入的模拟电压转化为数字电压,并对数字电压进行滤波,
* 滤除高频噪声。 模拟电压的输入端为ANA0,输入引脚为RA0*/
ADCC_DischargeSampleCapacitor();//设置ADC采样通道
adcVal = ADCC_GetSingleConversion(channel_ANA0);//模数转换
adcFilterVal = ADCC_GetFilterValue();//低通滤波
printf(" adcFilterVal %d \r\n", adcFilterVal);//打印滤波前的采样点数
printf(" adcVal %d \r\n", adcVal);//打印滤波后的采样点数
/*将采样模拟电压所得的12bitADC的点数转化为8bitDAC的点数,
* 并输出模拟电压,输出端为DACOUT2,输出引脚为RA2*/
DAC_BCD = ( adcFilterVal ) * 16;
DAC_BCD = ( adcFilterVal ) / 4096;
DAC_BCD = ( adcFilterVal ) / 16;
printf(" i %d \r\n", DAC_BCD);
DACx16 = BCD_to_HEX(DAC_BCD);//将十进制数转化为16进制数
DAC1_SetOutput(DACx16);//将8bit采样点数进行输出
printf(" DAC16 %d \r\n", DACx16);
delay_ms(5);
}
}
1.3 ADCC进行数字低通滤波
这里的数字滤波不是说在单片机的ADC输入引脚上并联滤波电容,也不是说用运放搭建低通滤波器对输入信号进行预处理,而是指对采样后所得的点数进行滤波,具体的算法【3】如图1.9所示,ADCRS为数字滤波的截止频率,该值越大,那么输出值到达稳定所需的时间就越长,这一点会在下一章进行讨论。简而言之,这里的数字滤波就是:先前累加器的数值(点数)+当前ADC采样的平均值(点数)- (先前累加器的数值/2截至频率),先前ADCC会对模拟电压采样100次(MCC的Repeat),让后对其求取平均值,将该平均值放入累加器,每进行一次低通滤波运算,累加器会进行移位,移除原来的平均值,吸收新的平均值作为先前累加器的数值,并与当前ADC采样的平均值参与下一次低通滤波运算。低通滤波的流程图如图1.10所示。
图1.9 数字低通滤波算法
图1.10 数字低通滤波流程图
二、结果展示
对写好的程序进行编译、下载和运行,用函数发生器的探头夹连接PIC18F16Q40开发板的RA0引脚,用示波器的探头夹连接PIC18F16Q40开发板的RA2引脚,用USB-TTL工具将PIC18F16Q40开发板与电脑进行连接,打开串口调试助手进行调试。测试环境如图2.1所示。
图2.1 测试实物图
运行程序以后,串口调试助手的界面如图2.2所示,动态视频如附件一所示。 adcVal是实时采样点数,adcFilterVal是对采样点数进行滤波后的数值,可以看到adcVal与adcFilterVal都是在变化,虽然DACx16变化比较大(叠加了高频噪声),但是adcFilterVal逐渐趋于稳定值(进行了低通滤波),转化后的电压近似为1V,达到了预期的效果,将经过低通滤波后的采样点数导入Excel表,绘制散点图如图2.3所示,低通滤波所需的时间取决于ADCRS。另外DACx16是将滤波后的数字点数进行模拟电压输出,该值与adcVal大小相同,只不过adcVal是10进制,而DACx16是16进制。输出后的模拟电压的变化视频如附件二所示,这是一个经过低通滤波的动态达到稳定的过程。
图2.2 串口调试助手结果展示图
图2.3 ADCC采样点动态趋于稳定曲线
三、测评心得:
本次测评展示了ADCC模块的的低通滤波功能,该项目的程序见附件三。以我的主观观点,我觉得这是ADCC的核心特性之一,也是ADCC的活力所在,如果没有它,那么它和普通ADC也就没有太大的区别了。ADCC外设可以通过数字滤波减少芯片外围滤波电路的使用,这样一方面既可以减少生产成本,又可以缩小PCB板的面积,可谓是一举两得。ADCC还有其它的功能,只不过没有它在信号处理-低通滤波中的那么耀眼罢了。
参考文献:
【1】Microchip Technology Inc.Getting Started with ADCC for PIC18[DB/OL].(2020)[2021-06-14].https://ww1.microchip.com/downloads/en/Appnotes/TB3263-Getting-Started-with-ADCC-for-PIC18-90003263B.pdf.
【2】Microchip Technology Inc.Getting Started with ADCC for PIC18[DB/OL].(2020)[2021-06-14].https://ww1.microchip.com/downloads/en/Appnotes/TB3263-Getting-Started-with-ADCC-for-PIC18-90003263B.pdf.
【3】Microchip Technology Inc.Using PIC18F26K42's 12-bit ADC² in Low-Pass Filter Mode[DB/OL].(2020)[2021-06-14].https://ww1.microchip.com/downloads/en/Appnotes/AN2749-Using-PIC18F26K42-ADC2-00002749A.pdf.
|