基于STM32的电阻、电容测量(NE555芯片RC振荡法)

这篇具有很好参考价值的文章主要介绍了基于STM32的电阻、电容测量(NE555芯片RC振荡法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

做的一个关于电阻和电容的测量电路,都是比较通用的。经过实际测试,电容测量电路还是可以的,电阻测量电路有一个缺点就是,随着测量时长的推移,在小电阻的测量时,比如0-100欧姆测量时,检测到的RC震荡频率会增加, 所以小电阻需要校正一下,否则小电阻容易出现较大的偏差。大电阻的话测量精度还是可以的。


一、电路图

基于STM32的电阻、电容测量(NE555芯片RC振荡法)
具体的电阻电容选值已经标好了,这个电阻电容的选值对应的测量范围为电阻10-1M欧姆,电容1-220nf左右。输出F口的作用主要在于通过两个自锁开关切换电阻或者电容的测量,只用占用单片机的一个IO口,这个IO口进行外部中断。

1.电阻测量公式

基于STM32的电阻、电容测量(NE555芯片RC振荡法)
FR为我们测量到的频率
在实际电路中,R12和R13均被设置为1.5K。由于单片机内部被设定为每隔一秒钟检测一次脉冲的个数,故在极限状况下可以测的大范围的电阻。若需要改进优化范围,可以改变R13和R12电阻的大小,使其产生不同的谐振状态,从而实现不同范围的需求。

2.电容测量公式

基于STM32的电阻、电容测量(NE555芯片RC振荡法)
同样FC为测的电容频率

二、代码实现

1.外部中断代码

#include "exti.h"
#include "key.h"
#include "delay.h"
#include "stm32f10x_exti.h" 
long Pulsenum;	//脉冲个数 
void EXTIX_Init(void)//外部中断初始化函数
{
  EXTI_InitTypeDef EXTI_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);
  EXTI_InitStructure.EXTI_Line=EXTI_Line15;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);	  	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;			//使能按键所在的外部中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;	//抢占优先级2, 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;					//子优先级1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure); 
}
void EXTI15_10_IRQHandler(void)
{
  Pulsenum++;
  EXTI_ClearITPendingBit(EXTI_Line15); 
}

外部中断主要是为了采集电阻电容端口对应的频率,此处的话是用PA15作为中断触发口。

2.定时器中断处理数据

代码如下(示例):

#include "timer.h"
#include "led.h"
#include "usart.h"
#include "adc.h"
#include "exti.h"
#include "main.h"
//电阻--------------------------------
unsigned long  Z1=14026950.00;
float RZ=0;
unsigned long   RX=0;
unsigned long   RX2=0;
unsigned long   RX3=0;
unsigned long   RX4=0;
unsigned long   RX5=0;
unsigned long   RX6=0;
unsigned long   RX7=0;
unsigned long   RX8=0;
unsigned long   RX9=0;
unsigned long   R=0;
//电容--------------------------------
float CZ=0;
float CX=0;
unsigned long   x;
void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	TIM_TimeBaseStructure.TIM_Period = arr;
	TIM_TimeBaseStructure.TIM_Prescaler =psc;  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
	TIM_ITConfig(TIM3, TIM_IT_Update|TIM_IT_Trigger,ENABLE);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
	NVIC_Init(&NVIC_InitStructure);  
	TIM_Cmd(TIM3, ENABLE);  							 
}
void TIM3_IRQHandler(void)   //TIM3中断
{
	static u16 count;
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
	{
		/*电阻采集*/
		count++;
    if(count >= 1000)
	  {
			count = 0;
			x = Pulsenum;                                                  //测得的脉冲值数量,也就是FR
			if(mode==3)
			{
				if(x<=8)Z1=14006950.00;
				else if(x>8&&x<30)Z1=14726950.00;
				else if(x>30&&x<300)Z1=14526950.00;
				else if(x>300&&x<1000)Z1=14867950.00;
				else if(x>1000&&x<5000)Z1=14467950.00;
			  RZ=(Z1/x);                                                     //测量100到1000
			  RX=RZ-1500;
			  RX=RX>>1;                                                      //对应的除以2
        if(RX>=1490)
        {
          RX=RX-1490;
        }else
        {
			    RX=0;
        }
			  if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;}//如果测得的频率为0,则此次测得的结果都为0
        if(RX>2000000){RX=2000000;}                                    //如果电阻测得的结果大于1M欧姆,则结果就等于1M欧姆
			  RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;                //求平均提高精度
			  RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX; //依次赋值
				Pulsenum = 0;
			}
			/*电容采集*/
			else if(mode==4)
			{
				CZ=708317/x-7;
				if(CZ>9999999)CZ=9999999;  //限制最高值
				Pulsenum = 0;
			}
		}
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
	}
}

从上往下看,在电阻参数设置一栏里面,定义了RX-RX9还有R,这个主要是为了提高电阻测量的精度。在实际的测试过程中电阻需要测量八次才能得到一个稳定的电阻值,也就是8s左右得到稳定的电阻值。Z1是我们设置好的一个参数。通过调节这个参数可以改变我们的精度。电容参数设置也是一样,x是我们每秒检测到的一个频率值。通过外部中断里面的pulse赋值。

在定时器三中断里面有一个count计数,此处定时器设置的频率为1KHz,因此count计数到1000的时候自动归零,也代表过了一秒钟,所以进行一次脉冲数的赋值给x。mode是我们设置的检测模式,此处当模式为3的时候进行电阻的测量,模式为4的时候进行电容的测量。

x的值越小,代表测量的电阻阻值越大。一般我调试的时候会进行划分区间段的调试,这样能够尽可能地提升测量的精度。通过keil的软件仿真观测不同阻值对应不同x值,从而改变Z1的大小,Z1越大,阻值就越大。Z1越小,阻值就越小。通过改变Z1的大小,从而获得某个区间段更优的数据。在if(RX>=1490)里面,这个1490的值是不确定的,是要根据你测量小电阻的时候来。假设如果10欧姆的电阻测量起来以后显示20欧姆的话,请把多余的这部分带入到上面的公式里面,修改1490的大小,如果大于真实电阻值的话,就把这个1490略微增大点,如果小于真实电阻值的话,就把1490稍微减小一点。

电容采集这边的话就是改变708317这个值,你可以用小电容定标,也可以用大电容定标,这都是没问题的,通过改变这个值获得更高精度的电容测量值。前提是测量的电容都是无极性电容

基于STM32的电阻、电容测量(NE555芯片RC振荡法)
在主函数中,只需要调用着两个数值即可,即可获得想要的电阻电容值。


总结

码字不易,希望大家三连支持一下!!你们的支持就是我分享的动力!文章来源地址https://www.toymoban.com/news/detail-440363.html

到了这里,关于基于STM32的电阻、电容测量(NE555芯片RC振荡法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电容并联放电电阻的RC 电路时间常数计算,一阶线性常系数微分方程

    就是在谁都知道的RC 电路里的电容旁边并联一个放电电阻,计算它对时间常数的影响,参考下面的示意图: 电路的输入电压是电源电压V,在R0 和R1 之间连接着一个单片机引脚,所以想计算上电后单片机引脚上电压的变化,也就是输出电压Uo。电容C 通过R0 和R1 充电,R2 放电。

    2024年02月07日
    浏览(42)
  • 51单片机简易电阻电感电容RLC测量仪仿真设计

    51单片机简易电阻电感电容RLC测量仪仿真( proteus仿真+程序+讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0040 单片机最小系统,或者称为 最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统

    2024年02月04日
    浏览(58)
  • Stm32_标准库_期末设计_温度测量&光照测量&手机与芯片通信实现信息的更新

    期末设计预期的效果是整个系统能对环境温度、环境的光照情况进行测量及显示,并且能对时间及日期进行显示。时间与日期的控制不再打算用按键进行修改,取而代之用蓝牙模块实现手机与蓝牙模块之间单向通信,即手机向蓝牙模块发送当前的时间或日期,蓝牙模块接受数

    2024年02月07日
    浏览(30)
  • 基于51单片机的555定时器测电容proteus仿真

    一、555定时器构成多谐振荡器 由555定时器构成的多谐振荡器如下图所示,   工作原理:电路没有稳态,只有两个暂稳态,也不需要外加触发信号,利用电源VCC通过R1和R2向电容器C充电,使Uc逐渐升高,升到2VCC/3时,Uo跳变到低电平,放电端D导通,这时,电容器C通过电阻R2和

    2024年02月06日
    浏览(36)
  • NE555波形发生器手把手教程之NE555内部结构(一)

    工程链接:https://pan.baidu.com/s/1T-9bdnO1IrWUsjmRTl12zQ  提取码:py66   参数 供应电压:4.5-18V 供应电流:10-15mA 输出电流:225mA (max) 上升/下降时间:100 ns [3]  引脚位 ne555的结构图 Pin 1 (接地) :地线(或共同接地) ,通常被连接到电路共同接地 [3]  。 Pin 2 (触发点) :这个脚位是触

    2024年02月05日
    浏览(78)
  • NE555 & 工作模式介绍

    💖 作者简介:大家好,我是 泽奀 。全栈领域新星创作者🏆  作者周榜: 78  👑    📝 个人主页:weixin_52632755的博客_泽奀_CSDN博客 💬 本系列:【电子】系列_泽奀的博客-CSDN博客 🎉 欢迎 点赞➕评论➕收藏 ==  养成习惯 😋 💬 总结:希望你看完之后,能对你有所帮助,不

    2023年04月22日
    浏览(32)
  • 如何使用NE555产生方波

    NE555在很多电路设计中都会用到,常用来实现施密特触发器,单稳态触发器和多谐振荡器 常用的NE555是这种八脚的,大家可以看下引脚定义 首先我们来看下NE555的内部构造: C1和C2是两个运放比较器,内部的这三个电阻阻值都是一样的,都是5K欧姆,后面的这一个是SR锁存器,

    2024年02月02日
    浏览(29)
  • NE555 Motor LED Chaser

    这个是从YouTube上搬运来的,如图所示 所需材料 #1# 10k resistor ×1 #2# 10k variable resistor ×1 #3# 10uf capacitor ×1 #4# 3mm blue led ×4 #5# 3mm yellow led ×4 #6# 3mm red led ×4 #7# 3mm green led ×4 #8# 3mm white led ×4 #9# ne555 ic ×1 #10# cd4017 ic ×1 #11# dc motor ×1 #12# 3.7v battery ×2 #13# gear ×1 原理图

    2023年04月13日
    浏览(29)
  • 基于 STM32 的温度测量与控制系统设计

    本文介绍了如何基于 STM32 微控制器设计一款温度测量与控制系统。首先,我们将简要介绍 STM32 微控制器的特点和能力。 接下来,我们将详细讨论温度传感器的选择与接口。然后,我们将介绍如何使用 STM32 提供的开发工具和相关库来进行温度测量和控制的代码设计和实现。最

    2024年02月02日
    浏览(35)
  • STM32--基于STM32F103的MAX30102心率血氧测量

    本文介绍基于STM32F103ZET6+MAX30102心率血氧测量+0.96寸OLED(7针)显示(完整程序代码见文末链接) 一、简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。 MA

    2024年01月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包