标题: STC15F104W单片机利用RC充放电使用IO口测量外部电压 [打印本页]
作者: aking5258 时间: 2018-12-21 15:00
标题: STC15F104W单片机利用RC充放电使用IO口测量外部电压
宏晶科技STC15F系列单片机
用RC充放电实现检测外部电压
对于没有ADC的MCU,而又要测量外部的一个电压时,使用RC充放电的方式是比较容易实现并且低成本的方法。
STC15F系列是1T的MCU,其IO口有OPEN-DRAIN模式,此模式可以很容易用一个IO口配合一个定时器实现RC充放电来测量外部未知电压。如果没有空余的定时器,也可以使用指令循环的方式实现。本例使用定时器。
本范例使用P3.2(INT0)来做RC测量,电路和波形示意图如下:
操作流程:
- 初始化程序将P3.2设置成OPEN-DRAIN模式, 并将P3.2输出0给电容放电。INT0设置成上升沿中断。Timer 0设置成16位自动重装定时器模式,时钟源为12T,允许中断。
- 测量时,先清Timer 0的TH0、TL0,然后将P3.2输出1开始对电容充电,接着设置TR0 = 1来启动Timer 0,然后在INT0中断里设置TR0 = 0来停止计数,并将P3.2输出0对电容放电。读出TH0、TL0的值就是RC充电时间。
由于MCU工作在5V时,IO口读到“1”的门限电压大约为2V,所以要求输入的电压高于2V,本例的测试数据从4~12.4V,测试结果参考后面的附录1。
假设输入电压为Ux,IO口门限电压为2V,则RC充电时间为:
T = - R * C * ln ( 1 – 2 / Ux )
按图示参数,当输入为10V时,RC时间大约为446uS,附录1中实测为447uS。
由于RC时间跟R和C有关,而R的温漂一般较小,但普通电容的温漂较大,所以要使用温漂小并且漏电也小的电容。
由充电公式或曲线图可知,Ux和RC值的关系是非线性的,所以实际项目使用时,要根据自己的实际电路做一些标定,这样可以得到比较准确的值。
本方法适用于对测量精度要求不是很高的场合。
附录1:测量结果和曲线
完整的Word格式文档51黑下载地址:
STC15F104W利用RC充放电使用IO口测量外部电压.DOC
(99.5 KB, 下载次数: 40)
作者: ssk7793 时间: 2018-12-21 18:31
有实物图吗?
作者: a461624201 时间: 2020-4-2 19:56
本帖最后由 a461624201 于 2020-4-2 20:18 编辑
图为5v电压,然后取最大位的时间数,判定为5V.循环指令,一个nop,就是一个指令时间,1us/次,对于STC15F104,
-
1.png
(55.08 KB, 下载次数: 69)
作者: a461624201 时间: 2020-4-2 20:14
这个代码,连接1637后,就会死机, 贴上不使用定时器和中断,循环指令RC测量代码,
while(1){ dianrong_jiao = 0;
delay_ms(5);
sj=0 ;
dianrong_jiao = 1;
while(dianrong_jiao==0){ _nop_(); sj++; }
}
作者: a461624201 时间: 2020-4-2 20:27
其实,无论是定时器中断还是循环nop,另一方面,测量瓷片电容,还是能粗略判断电容的容量的,有种简单电容表的感觉。
作者: a461624201 时间: 2020-4-3 00:08
不用STC15F104中断的,可以接TM1637数码管的while程序。
while (1)
{ P_RC= 0;
Delay1us(5);
B_ADC_OK= 0; //清除ADC结束标志
TH0 = 0; //clear Timer 0
TL0 = 0;
B_Over= 0; //Clear Over flag
P_RC= 1; //RC charge
TR0 = 1;
ET0 = 1; //允许Timer0中断
EA = 1; //允许总中断
while( P_RC==0 ){ };
if( B_Over==0){
TR0 = 0; //关闭定时器
ET0 = 0;
EA = 0;
adc = TH0; //取数据
adc = (adc << 8) + TL0;
B_ADC_OK= 1; //标志ADC结束
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |