模拟电压比较器 VC 用于比较两个输入模拟电压的大小,并根据比较结果输出高/低电平。当“+”输入端电压高于“-”输入端电压时,电压比较器输出为高电平;当“+”输入端电压低于“-”输入端电压时,电压比较器输出为低电平。
内部集成的模拟电压比较器 VC 具有以下特性:
支持电压比较功能;
支持内部 64 阶 VCC 分压(使用分压来源电压需要大于 1.8V)
支持 8 个外部输入端口和片内 BGR 输出的参考电压作为电压比较器的输入;
支持三种软件可配置的中断触发方式:高电平触发/上升沿触发/下降沿触发;
电压比较器的输出可以作为 Base Timer 和 LPTimer 门控端口的输入;
电压比较器的输出可以作为 Advanced Timer 的刹车输入或者捕获输入;
支持在超低功耗模式下工作,电压比较器的中断输出可以将芯片从超低功耗模式下唤醒;
提供软件可配置的滤波时间以增强芯片的抗干扰能力。
电压比较器框架图
该图很明确的指出了每个比较器的输入端可以使用哪些。
滤波功能需要实际的开发中去慢慢调整了。
例子给了三个,分别是上升沿、下降沿和电平触发。大同小异,只讲一个下降沿的就差不多了。
vc_detect_falling_irq
- Gpio_SetFunc_VC1_OUT_P32(); //配置VC输出口
-
- //配置IO为模拟IO口
- Gpio_SetAnalog(3, 3, TRUE);
-
- genChannel = VcChannel1; //配置VC输入通道
-
- stcVcGeneralCfg.bDivEn = FALSE; // 6位DAC不使能
- stcVcGeneralCfg.enDivVref = VcDivVrefAvcc; //分压的参考电压为VCC
- stcVcGeneralCfg.u8DivVal = 0x3F; //分压值为1
-
- stcVcChannelCfg.enVcChannel = genChannel; // VC通道设置
- stcVcChannelCfg.enVcCmpDly = VcDelayoff; //迟滞配置
- stcVcChannelCfg.enVcBiasCurrent = VcBias300na;
- stcVcChannelCfg.enVcFilterTime = VcFilter28800us;
- stcVcChannelCfg.enVcInPin_P = VcInPCh3; //P33
- stcVcChannelCfg.enVcInPin_N = AiBg1p2;
- stcVcChannelCfg.enVcOutConfig = VcOutDisable;
- stcVcChannelCfg.enVcIrqSel = VcIrqFall;
- stcVcChannelCfg.pfnAnalogCmpCb = VcIrqCallback;
-
- Vc_GeneralInit(&stcVcGeneralCfg);
-
- Vc_ChannelInit(genChannel, &stcVcChannelCfg);
-
- Vc_EnableFilter(genChannel);
-
- if (Ok != Vc_ConfigIrq(stcVcChannelCfg.enVcChannel, stcVcChannelCfg.enVcIrqSel)) {
- return 1;
- }
-
- if (Ok != Vc_EnableIrq(stcVcChannelCfg.enVcChannel)) {
- return 1;
- }
-
- if (Ok != Vc_EnableChannel(stcVcChannelCfg.enVcChannel)) {
- return 1;
- }
用一个变阻器链接到P33,作为比较器的P端,N端配置为1.2V基准电压,也就是当改变变阻器阻值造成下降时会触发中断。
- void VcIrqCallback(void)
- {
- boolean_t bPortVal;
-
- Vc_DisableIrq(genChannel);
-
- bPortVal = Gpio_GetIO(TEST_PORT, TEST_PIN);
- Gpio_SetIO(TEST_PORT, TEST_PIN, bPortVal ^ 1u);
- gu32Cnt++;
- }
在中断中翻转LED1。