基于STM32的電阻、電容測(cè)量(NE555芯片RC振蕩法)
前言
做的一個(gè)關(guān)于電阻和電容的測(cè)量電路,都是比較通用的。經(jīng)過(guò)實(shí)際測(cè)試,電容測(cè)量電路還是可以的,電阻測(cè)量電路有一個(gè)缺點(diǎn)就是,隨著測(cè)量時(shí)長(zhǎng)的推移,在小電阻的測(cè)量時(shí),比如0-100歐姆測(cè)量時(shí),檢測(cè)到的RC震蕩頻率會(huì)增加, 所以小電阻需要校正一下,否則小電阻容易出現(xiàn)較大的偏差。大電阻的話測(cè)量精度還是可以的。
一、電路圖
具體的電阻電容選值已經(jīng)標(biāo)好了,這個(gè)電阻電容的選值對(duì)應(yīng)的測(cè)量范圍為電阻10-1M歐姆,電容1-220nf左右。輸出F口的作用主要在于通過(guò)兩個(gè)自鎖開(kāi)關(guān)切換電阻或者電容的測(cè)量,只用占用單片機(jī)的一個(gè)IO口,這個(gè)IO口進(jìn)行外部中斷。
1.電阻測(cè)量公式
FR為我們測(cè)量到的頻率
在實(shí)際電路中,R12和R13均被設(shè)置為1.5K。由于單片機(jī)內(nèi)部被設(shè)定為每隔一秒鐘檢測(cè)一次脈沖的個(gè)數(shù),故在極限狀況下可以測(cè)的大范圍的電阻。若需要改進(jìn)優(yōu)化范圍,可以改變R13和R12電阻的大小,使其產(chǎn)生不同的諧振狀態(tài),從而實(shí)現(xiàn)不同范圍的需求。
二、代碼實(shí)現(xiàn)
1.外部中斷代碼
#include "exti.h" #include "key.h" #include "delay.h" #include "stm32f10x_exti.h" long Pulsenum; //脈沖個(gè)數(shù) void EXTIX_Init(void)//外部中斷初始化函數(shù) {
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中斷,需要使能AFIO時(shí)鐘 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); //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按鍵所在的外部中斷通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; //搶占優(yōu)先級(jí)2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子優(yōu)先級(jí)1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道 NVIC_Init(&NVIC_InitStructure);
} void EXTI15_10_IRQHandler(void) {
Pulsenum++;
EXTI_ClearITPendingBit(EXTI_Line15);
}
2.定時(shí)器中斷處理數(shù)據(jù)
代碼如下(示例):
#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中斷發(fā)生與否:TIM 中斷源 { /*電阻采集*/ count++; if(count >= 1000)
{
count = 0;
x = Pulsenum; //測(cè)得的脈沖值數(shù)量,也就是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); //測(cè)量100到1000 RX=RZ-1500;
RX=RX>>1; //對(duì)應(yīng)的除以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;}//如果測(cè)得的頻率為0,則此次測(cè)得的結(jié)果都為0 if(RX>2000000){RX=2000000;} //如果電阻測(cè)得的結(jié)果大于1M歐姆,則結(jié)果就等于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 中斷源 }
}
從上往下看,在電阻參數(shù)設(shè)置一欄里面,定義了RX-RX9還有R,這個(gè)主要是為了提高電阻測(cè)量的精度。在實(shí)際的測(cè)試過(guò)程中電阻需要測(cè)量八次才能得到一個(gè)穩(wěn)定的電阻值,也就是8s左右得到穩(wěn)定的電阻值。Z1是我們?cè)O(shè)置好的一個(gè)參數(shù)。通過(guò)調(diào)節(jié)這個(gè)參數(shù)可以改變我們的精度。電容參數(shù)設(shè)置也是一樣,x是我們每秒檢測(cè)到的一個(gè)頻率值。通過(guò)外部中斷里面的pulse賦值。
完整代碼可進(jìn)群免費(fèi)領(lǐng)取!!!
嵌入式物聯(lián)網(wǎng)的學(xué)習(xí)之路非常漫長(zhǎng),不少人因?yàn)閷W(xué)習(xí)路線不對(duì)或者學(xué)習(xí)內(nèi)容不夠?qū)I(yè)而錯(cuò)失高薪offer。不過(guò)別擔(dān)心,我為大家整理了一份150多G的學(xué)習(xí)資源,基本上涵蓋了嵌入式物聯(lián)網(wǎng)學(xué)習(xí)的所有內(nèi)容。點(diǎn)擊下方鏈接,0元領(lǐng)取學(xué)習(xí)資源,讓你的學(xué)習(xí)之路更加順暢!記得點(diǎn)贊、關(guān)注、收藏、轉(zhuǎn)發(fā)哦!
- 贊