求助,8h比较器无法获取结果
想使用比较器做一个低压保护,先测试功能,结果出现了问题。测试方法,使用的是`8h8k64u`芯片编号末尾是`HD`应该是使用新版的比较器。
接线方法`vcc--vref--P37`,预想中比较器+为`P37`,-为`内部1.19V`,结果应为恒等于1。然而实测结果是恒等0,调了好长时间代码,无果,特来求助各位大佬。
#include "config.h"
#include "STC8G_H_Delay.h"
int *BGV;
//关闭所有io
void GPIO_config(void)
{
P0M0 = 0x00; P0M1 = 0xff; P0IE = 0x00;
P1M0 = 0x00; P1M1 = 0xff; P1IE = 0x00;
P2M0 = 0x00; P2M1 = 0xff; P2IE = 0x00;
P3M0 = 0x00; P3M1 = 0xff; P3IE = 0x00;
P4M0 = 0x00; P4M1 = 0xff; P4IE = 0x00;
P5M0 = 0x00; P5M1 = 0xff; P5IE = 0x00;
P6M0 = 0x00; P6M1 = 0xff; P6IE = 0x00;
P7M0 = 0x00; P7M1 = 0xff; P7IE = 0x00;
//10开漏
P1M0 = 0x01; P1M1 = 0xfc;
}
void sleep()
{
_nop_();
_nop_();
PCON=0x02;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//暂时不用ADC
int ADCfun()
{
int i,res,vcc;
//初始化ADC
ADCTIM =0x3f;
ADCCFG=0x2f;
ADC_CONTR=0x8f; //打开adc电源 15通道
delay_ms(1);
res=0;
for(i=0;i<8;i++)
{
ADC_CONTR |=0x40; //启动转换
_nop_();
_nop_();
while(!(ADC_CONTR & 0x20));
ADC_CONTR &=~0x20;
res+=((ADC_RES<<8) | ADC_RESL);
}
res>>=3;
vcc=(int)(4096L * *BGV/res);
ADC_CONTR=0x0f; //关闭adc电源
return vcc;
}
void ADCtest()
{
while(1)
{
ADCfun();
sleep();
}
}
void CMPinit()
{
CMPEXCFG=0x04;
//CMPEXCFG &= ~0x03; //P37 +输入
//CMPEXCFG |=0x04; //1.19V为-输入
CMPCR2=0x00; //
CMPCR2&=~0x80; //正向输出
CMPCR2&=~0x40; //0.1us滤波
CMPCR2|=0x10; //比较器结果滤波输出
CMPCR1=0;
//CMPCR1|=0x30; //边沿中断
}
u8 CMPfun()
{
u8 a=0;
CMPCR1|=0x02; //启动比较器输出
CMPCR1|=0x80; //启动比较器
P11=CMPCR1 &0x01;
a=CMPCR1 &0x01;
CMPCR1&=~0x02; //关闭比较器输出
CMPCR1&=~0x80; //关闭比较器
return a;
}
void CMPtest()
{
CMPinit();
while(1)
{
P10=0;
if(CMPfun()==0)
{
P10=1;
sleep();
}
}
}
/**********************************************/
void main(void)
{
EAXSFR(); /* 扩展寄存器访问使能 */
GPIO_config();
EA = 1;
BGV=(int idata *)0xef;
WKTCL=0xff;
WKTCH=0x87;//1s
CMPtest();
while (1)
{
}
}
针对您提到的8H比较器无法获取预期结果的问题,建议从以下几个方面进行排查和调试:<br><br>1. 硬件连接检查:<br> - 确保VCC、VREF和P37引脚连接正确,且电压稳定。P37作为比较器的正输入端,其电压应与VREF(内部参考电压1.19V)进行比较。<br> - 检查电源电压是否在芯片工作范围内,确保VCC电压足够高,以避免因电源不足导致比较器无法正常工作。<br><br>2. 比较器配置:<br> - 确认比较器的配置是否正确。请检查相关寄存器(如CMPCR1、CMPCR2)的设置,确保比较器已启用,且正负输入端配置无误。<br> - 如果使用内部参考电压作为负输入端,确保内部参考电压已正确启用并稳定。<br><br>3. 代码调试:<br> - 在代码中增加调试信息,输出比较器状态寄存器的值,确认比较器是否正常工作。<br> - 检查BGV指针的初始化是否正确,确保其指向的地址有效。<br><br>4. 芯片版本兼容性:<br> - 确认使用的STC8H8K64U芯片是否为最新版本,不同版本的芯片可能在寄存器配置或功能上存在差异。<br><br>5. 示例代码参考:<br> - 参考官方提供的比较器示例代码,确保配置和初始化流程正确。<br><br>通过以上步骤,应能有效定位并解决比较器无法获取预期结果的问题。如果问题仍未解决,建议进一步查阅芯片手册或联系技术支持。<br><br>[本文内容由国芯人工智能辅助生成,仅供参考] 请直接下载HEX文件测试。
1、获取CMPCR1前加延时
2、注意sleep里有个PCON=0x02;进入主时钟停振/省电模式 梁工 发表于 2025-3-16 13:16
请直接下载HEX文件测试。
直接下载hex文件,比较器可以正常工作 ercircle 发表于 2025-3-16 13:40
1、获取CMPCR1前加延时
2、注意sleep里有个PCON=0x02;进入主时钟停振/省电模式
我加个延时试试,停振模式是故意加的。目标是检测电压过低进入停振模式,1秒检测一次 苏紫方璇 发表于 2025-3-16 13:50
我加个延时试试,停振模式是故意加的。目标是检测电压过低进入停振模式,1秒检测一次 ...
嗯我在擎天柱上测试你贴的代码,加你那个sleep nop可能不太够,加个delay_ms(1)才有反应。 ercircle 发表于 2025-3-16 13:55
嗯我在擎天柱上测试你贴的代码,加你那个sleep nop可能不太够,加个delay_ms(1)才有反应。 ...
感谢,获取CMPCR1前加延时可以了
页:
[1]