就是一个比较器,负输入端选择内部的1.19V基准,从P3.7输入比较电压。 |
Y_G_G 发表于 2023-7-20 00:17 STC8H的比较器比PWM好懂多了; /*********比较器初始化函数****************/ Void CMPint(Void) { CMPCR2 = OX00;//清零 CMPCR2 &=0xBF; //1011 1111, 开启0.1us滤波 CMPCR2 |= 0x3F;//0001 1111, 比较器结果经过63个去抖时钟后输出 CMPCR1 = 0x00; //清零 CMPCR1 |= 0x10; //0001 0000,开启比较器下降沿中断(根据需要修改) CMPCR1 &= 0XF7; //1111 0111,P3.7为CMP+输入脚 CMPCR1 &= 0xFB; //1111 1011,内部1.19V为CMP-输入脚 CMPCR1 &= 0xFD; //1111 1101,禁止比较器输出(根据需要是否输出) CMPCR1 |= 0x80; //开启比较器模块 } 此函数在main主函数中作初始化函数,去抖可根据自己需要修改。 需要执行的任务放在比较器中断函数内 /******比较器中断函数,级别在初始化中设置为最高级3*********/ void CMP_Isr() interrupt 21 { CMPCR1 &= 0xBF;//1011 1111,使CMPIF=0,清中断标志 想要执行的任务;//要简洁明了,不要占用过多步骤,如多可执行一个标志位,由标志位触发执行相关复杂任务。 } |
谈到比较,必须有两个量。一个是标准,一个是对象。 标准取什么?可以外部分搭建,也可以从内部获取。即然CPU嵌入了比较器,设计者必会给出一个内部的标准。建议你使用。 比较的对象:电池,必须将它映射到标准附近,否则如何比较呢?最简单的方法就是用电阻分压至标准附近。 但这会浪费电池的能量。 节能:如果不需要时时刻刻检测,可以加控制开关,只在检测时接入分压电阻(不是主题,不在此讨论细节)。 如果必须时时刻刻检测,可以加大电阻的阻值。或其它更高级的方案(不在此讨论)。 |
![]() |
STC的比较器就跟它的PWM一样,数据手册洋洋洒洒一大堆,你啃半天都不一定知道它在说什么 电池供电还是用带ADC的单片机好一点,可以精确处理,也可以知道电池的实际电压 关键是STC带ADC的单片机并没有比不带ADC的单片机贵多少,有的型号甚至是更便宜 |
不如将电池电压送到ADC,得到电压值,然后根据电压值判断,这样的好处是,比较的电压门限可以设置,比较灵活。 |