文章目录

  • 前言
  • 一、电路图
    • 1.电阻测量公式
    • 2.电容测量公式
  • 二、代码实现
    • 1.外部中断代码
    • 2.定时器中断处理数据
  • 总结

前言

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


一、电路图


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

1.电阻测量公式


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

2.电容测量公式


同样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;                 //子优先级1NVIC_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;                                                  //测得的脉冲值数量,也就是FRif(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到1000RX=RZ-1500;RX=RX>>1;                                                      //对应的除以2if(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,则此次测得的结果都为0if(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振荡法)相关推荐

  1. 基于STM32超声波风速风向测量仪

    目录 一.功能描述 二.视频展示 三.原理图 四.部分代码 五.论文 六.资料清单 资料下载地址:基于STM32超声波风速风向测量仪 一.功能描述 通过超声波风速风向传感器检测风速风向并在液晶屏幕上显 ...

  2. STM32项目设计:基于STM32的风向风速测量仪

    目录 一.项目功能概述 二.材料选择 三.程序设计 四.实物 资料下载地址:基于STM32风向风速检测设计 一.项目功能概述 1.通过风向.风速传感器获取当前风向.风速 2.通过DHT11获取温湿度 ...

  3. 基于stm32的MAX31865铂电阻PT100测温全套资料

    基于stm32的MAX31865铂电阻PT100测温全套资料(原理图+教程+程序+演示视频) 资料编号:009 本项目可以通过PT100测温,测温范围为:-200-420℃,采用1.8寸OLED显示 ...

  4. 基于stm32单片机智能WIFI加湿器水质温湿度测量

    基于stm32单片机智能WIFI加湿器水质温湿度测量(原理图+程序+参考论文) 资料编号:021 可通过手机连接wifi 远程控制加湿器的开关,并且可以通过手机查看温湿度,可检测是否有水,缺水报警,和 ...

  5. stm32 工业按键检测_基于STM32芯片的能谱仪设计

    随着对天然辐射场中低能量γ谱学及其应用的深入研究,γ能谱仪不仅在固体矿产勘探.油气普查.水文和工程地质调查等工业生产及科学研究方面,甚至在民用的环境辐射场调查.建材与建筑装饰材料放射性检测方面,都得到 ...

  6. 基于STM32的数模转换芯片AD5328驱动程序

    一个项目中需要输出4路0~5V模拟量,主控芯片为STM32F103单片机,选用了AD5328作为DAC输出: AD5328是ADI的一款DAC芯片,可输出8路模拟量,SPI通讯,自己根据AD5328数 ...

  7. 单芯片电容测量方案PCAP01原理

    1 前言 对于电容传感器的测量来说,传统的电路方式有其无法克服的局限性.复杂的模拟电路设计,难以扩展的电容测量范围,都会给开发带来非常大的阻力. 德国acam公司专利的PICOCAP?测量原理则给电容 ...

  8. 基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+

    ## **基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块(阿里云 或ONENET或局域网)+DHT11温湿度采集+MQ系列 烟雾及可燃气体+ ...

  9. 基于STM32单片机的智能家居测量系统设计

    当今的家庭生活面临着各种环境和健康问题,周围的生活参数存在潜在的隐患,包括室温.气体中有害物质的浓度等.在新时代,人们越来越关注健康及其相关因素.随着微电子技术的应用,电器的普及,以及单片机和传感器性 ...

最新文章

  1. 理解oracle的共享连接和专用连接
  2. FileZilla Server 搭建FTP服务器
  3. 150秒内诊断脑瘤!最新医学影像AI在《Nature Medicine》发表
  4. Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
  5. mysql执行sql流程_MySQL架构与SQL执行流程
  6. jQuery之父:JavaScript的开发之路
  7. java putall实现,Java JsonObject.putAll方法代码示例
  8. RocketMQ报错 service not available now, maybe disk full, CL: 0.95 CQ: 0.95 INDEX: 0.95, maybe
  9. c语言课程性质,c语言课程的特性
  10. php基础之时间函数(date(), time(), microtime())
  11. 刹车盘的噪音测试软件,某车型盘式制动器尖叫噪声分析及改进
  12. pval(pval胶水可以粘塑料吗)
  13. 在线绘制2维/3维函数图像、求导网站
  14. 我的世界服务器配置文件
  15. 视频会议新格局确立 云计算开启技术叠加时代
  16. 关于C语言中随机函数的使用详解
  17. 你想要的继承知识点都在这里
  18. C程序设计语言(The C Programming Language)读书笔记
  19. 【MySQL】(四)DBMS
  20. 华南理工大学计算机专业课程表,华南理工大学2017.92018.7学年度第二学期课程表.DOC...

热门文章

  1. 网件交换机基本配置命令合集
  2. java程序cpu突然飚高_高频面试题:Java程序占用 CPU 过高怎么排查
  3. 高血糖的饮食注意事项
  4. HCIP考试考哪三门你知道么?
  5. ArcGIS编辑绘制图斑又慢又难?这些高效的处理技巧你值得拥有!
  6. Facebook数据中心实践分析,OCP主要工作成果介绍
  7. 阿里重投内容电商,VR技术会成为马云的杀手锏吗?
  8. 【学习笔记】数学小厦
  9. 红芯商业计划书曝光:明年要实现3000万利润 2021年冲刺IPO
  10. 尚硅谷 网上书城 代码 Book