基于STM32的電阻、電容測量(NE555芯片RC振蕩法)

前言

做的一個關于電阻和電容的測量電路,都是比較通用的。經過實際測試,電容測量電路還是可以的,電阻測量電路有一個缺點就是,隨著測量時長的推移,在小電阻的測量時,比如0-100歐姆測量時,檢測到的RC震蕩頻率會增加, 所以小電阻需要校正一下,否則小電阻容易出現較大的偏差。大電阻的話測量精度還是可以的。


一、電路圖

具體的電阻電容選值已經標好了,這個電阻電容的選值對應的測量范圍為電阻10-1M歐姆,電容1-220nf左右。輸出F口的作用主要在于通過兩個自鎖開關切換電阻或者電容的測量,只用占用單片機的一個IO口,這個IO口進行外部中斷。

1.電阻測量公式

FR為我們測量到的頻率
在實際電路中,R12和R13均被設置為1.5K。由于單片機內部被設定為每隔一秒鐘檢測一次脈沖的個數,故在極限狀況下可以測的大范圍的電阻。若需要改進優化范圍,可以改變R13和R12電阻的大小,使其產生不同的諧振狀態,從而實現不同范圍的需求。


二、代碼實現

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); 
} 


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賦值。

完整代碼可進群免費領?。。。?/a>

嵌入式物聯網的學習之路非常漫長,不少人因為學習路線不對或者學習內容不夠專業而錯失高薪offer。不過別擔心,我為大家整理了一份150多G的學習資源,基本上涵蓋了嵌入式物聯網學習的所有內容。點擊下方鏈接,0元領取學習資源,讓你的學習之路更加順暢!記得點贊、關注、收藏、轉發哦!

the end

評論(0)