【AT32F421测评】+ COMP比较器使用
[复制链接]
本帖最后由 dmzdmz666666 于 2021-4-30 23:33 编辑
本章测评我将进行对AT32F421内部比较器的测试,AT32F421内部有一个低功耗的比较器,可以作为独立器件(有IO口作为输入输出口),也可以和定时器进行联调.比较器的输入还可以使用内部的参照电压,这样就比较方便.同时,比较器支持可编程的迟滞,消隐输出,还可以控制工作的速度和功耗.
在这里,我将测试比较器的模拟信号调理功能,分别用内部参照电压和外部IO口(PA4)输入作为比较器的负极端,用PA1作为比较器的正极输入,用PA0作为比较器输出.
这里是参考官方提供的BSP中AT_START_F421中的COMP中的COMP_Out示例.
首先,在HARDWARE文件夹中新建COMP.c 及其对应的h头文件。然后在FWLIB中添加at32f4xx_comp.c、如下图所示
第二步,在COMP.c编写COMP_Configuration函数,首先跟之前的外设使用一样,配置GPIO和对应的时钟,我们将PA1和PA4配置为模拟输入输出模式,将PA0复用为COMP_OUT,部分配置如下图所示,
接下来,进行比较器的配置,首先,通过以下语句来使能比较器的时钟
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_SYSCFGCOMP, ENABLE);
如果要将内部参照电压作为比较器负极输入,添加以下代码,同时AT32F421还支持1/4、2/4 、3/4倍参照电压输入
COMP_InitStructure.COMP_INMInput = COMP_INMInput_VREFINT;
如果要将IO外部电压作为比较器负极输入,添加以下代码,这里我选择PA4作为负极端,添加以下代码
COMP_InitStructure.COMP_INMInput = COMP_INMInput_IN1;//PA4
这里要说明一点,内部输入和外部输入只能二选一。
因为AT32F421比较器的输出不仅可以从IO口输入,还可以输入到定时器,但作为模拟信号调理,我这里配置为不输出到其他外设,见以下代码
COMP_InitStructure.COMP_Output = COMP_Output_None;
同时在实际测试过程中,我发现在模拟信号调理时,开启迟滞功能和不开启输出效果差距很多(当然了,可能是我的信号源问题)
COMP_InitStructure.COMP_Hysteresis = COMP_Hysteresis_High;
上面这句是开启高度迟滞,
COMP_InitStructure.COMP_Hysteresis =COMP_Hysteresis_No
上面这句是不开启迟滞
接下来,我会对比这两者的区别
具体的代码请参考我的附件,最后在main函数里调用COMP_Configuration();就可以使用比较器功能。
接下来,我将用示波器,信号发生器和万用表来进行测试比较器的实际效果。
我先用单片机内部参照电压作为比较器负极输入,同时不开启迟滞,可以观察到,在正极输入1KHZ的0-3.3V的正弦波时,比较器将输出0-3.3V的方波,正好可以证明其是轨到轨的,因为可以输出的高电平是工作电压;同时,通过示波器的光标进行测量,可以看到比较器是时1.2V时进行翻转的,因为通过之前的实验和数据手册展示,单片机的内部参照电压为1.2V左右,实验现象符合预期,就是当正极小于1.2V时,比较器输出低电平,高于1.2V,输出高电平.
但是将波形放大,会发现比较器在1.2V附近会反复比较,翻转,造成了实际波形的上升沿有多种波形重合,造成这种现象的原因,我以为一方面可能是我输入的波形不是理想的,存在一些毛刺,另一方面是单片机自身的原因,因为参照电压不是一个恒定值,它也是会变化的,同时比较器自身也是会存在一定的误差.
为了减少这种反复比较的波形产生,我开启了比较器的高度迟滞,果然,波形变的干净了不少
最后我测试了一下外部IO口作为比较器的负极输入端,我在PA4上输入电压2.000V,实际效果如下
通过改变外部输入电压的值,可以改变输出方波的占空比,接下来,通过一个gif来进行展示,
|