怎么把网站上线,中国几大网络推广公司,新乡网站建设哪家正规,人与狗做的网站谁有如果我们需要比较两个点的电压#xff0c;当A点高于B点的时候我们做一个操作#xff0c;当B点高于A点的时候做另一个操作。
我们除了加一个运放或者比较器#xff0c;还可以直接使用STC内部的一个比较器。 正极输入端可以是P37、P50、P51#xff0c;或者从ADC的十六个通道…如果我们需要比较两个点的电压当A点高于B点的时候我们做一个操作当B点高于A点的时候做另一个操作。
我们除了加一个运放或者比较器还可以直接使用STC内部的一个比较器。 正极输入端可以是P37、P50、P51或者从ADC的十六个通道里选一个但是要开ADC。
负极输入端可以是P36或者内部的1.19V。
中间可以选择模拟滤波和数字滤波。
比较的结果可以选择从P34或者P41输出同时还可以有上升沿和下降沿的中断也可以通过读取CMPRES来查询结果是一个只读位。 接下来直接看库函数。
把这个文件包含进工程里STC32G_Compare.c如果需要中断的话这个STC32G_Compare_Isr.c也包含进去。
用下面的函数对比较器进行初始化。 结构体的成员从上往下依次是
EN使能我们直接给ENABLE。
P_Select正极输入端有四个可以选择。 如果用ADC的话记得把ADC_CONTR这个寄存器里的ADC电源和模拟通道输入给配置了等等示例代码里我会演示。
N_Select负极输入端有两个可以选择。 Outpt_EN输出使能我们给ENABLE。
InvCMPO输出取反这个看具体情况选择ENABLE或者DISABLE。
100nsFilter是否开启模拟滤波一般是开启ENABLE。
OutDelayDuty数字滤波延时的时间周期范围是0~63官方示例代码里是16。
如果我们需要中断的话在NVIC里选择上升沿或者下降沿也可以用位或|来都要。 下面的代码中我使用的ADC通道0作为比较器输入的正极负极就用的内部1.19V。
ADC通道0是P10我接了个光敏电阻它是光照强度越大电压就越小反之越大。所以就是光强到了一定程度电压小于1.19V了比较器输出低电平光强弱到一定程度电压大于1.19V那么比较器输出高电平我在输出端接了个LED这样看的结果就很明显了。
#include STC32G.H
#include STC32G_GPIO.h
#include STC32G_Delay.h
#include STC32G_Compare.hvoid GPIO_Init(void){P1_MODE_IN_HIZ(GPIO_Pin_0);P3_MODE_IO_PU(GPIO_Pin_4);
}void Compare_Init(void){CMP_InitDefine initer;initer.CMP_100nsFilter ENABLE; // 开启100ns模拟滤波initer.CMP_EN ENABLE; // 比较器使能initer.CMP_InvCMPO DISABLE; // 不取反输出initer.CMP_N_Select CMP_N_GAP; // 选择1.19Viniter.CMP_OutDelayDuty 16; // 数字滤波16个时钟周期initer.CMP_Outpt_En ENABLE; // 输出使能initer.CMP_P_Select CMP_P_ADC; // 选择ADC模拟通道CMP_Inilize(initer);ADC_CONTR 0x80; // 1000 0000 开启ADC电源,选择通道0 P10CMPO_S 0; // 选择比较器输出引脚为P34
}void main(void){WTST 0; //设置程序指令延时参数赋值为0可将CPU执行指令的速度设置为最快EAXSFR(); //扩展SFR(XFR)访问使能 CKCON 0; //提高访问XRAM速度GPIO_Init();Compare_Init();while(1){}return ;
}
需要注意的是我们选择比较器输出端引脚以及打开ADC和选择ADC通道都需要去操作寄存器上述代码中我有注释可供小伙伴们参考。