这个代码的原理是利用RC电路的充电时间常数来测量电容值。具体步骤如下:
初始化和配置:
关闭所有模拟输入 (ANSEL = 0; ANSELH = 0
)。
配置ADC模块以读取电压 (ANSEL |= 0X01; TRISA0 = 1; ADCON0 = 0xC1; ADCON1 = 0x80
)。
配置TMR1定时器用于测量时间 (T1CON = 0b00100001
,开启定时器)。
电容放电:
设置RA1引脚为高电平 (RA1 = 1
),将电容放电。
延时100ms (delay_ms( 100 )
)确保电容完全放电。
开始充电:
设置RA1引脚为低电平 (RA1 = 0
),停止放电并开始充电。
复位TMR1计数器 (TMR1H = 0; TMR1L = 0
),并启动定时器。
测量充电时间:
在一个循环中不断读取ADC值 (GO = 1; while ( GO ) ;
),直到ADC值达到0.632 * Vdd(即adval > 637)。
0.632 * Vdd是RC电路的时间常数τ(tau)对应的电压,这时的时间rctime即为电容充电到该电压所需的时间。
计算和显示结果:
停止定时器 (T1CON = 0
)。
计算总时间(包括定时器溢出的次数)并显示在LCD上 (sprintf( xianshi, "T:%d us", (int) ( (times * 65536 + rctime) * 4) )
)。
中断处理:
void interrupt high_isr( void )
)并增加times
计数,以记录定时器溢出的次数。通过测量RC电路充电到0.632 * Vdd所需的时间,可以利用公式[ τ = RC ](τ是时间常数,R是已知电阻,C是待测电容)计算出电容值。代码中通过测量τ,并结合已知的电阻值,就可以计算出电容值。
cpphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!