痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 18618|回復: 90

簡易電感量測---- 野人獻曝經驗談

  [複製鏈接]
發表於 2012-11-7 21:48:09 | 顯示全部樓層 |閱讀模式
本帖最後由 antlu 於 2012-11-8 11:29 AM 編輯

Lmeter.jpg

這是網路的 LC 表中的 電感量測部分,我因為之前買 LC 表的時候選擇了 "只有電容表",因為這樣的範圍比較大,也因為沒有電感的量測,每每遇到電感的時候就沒辦法了,除非 用眼睛看"色碼"!! 這個電容電感的量測電路網路上許多人都有製作過,有人用 PIC  有人用89C2051 我則是用 STC89C52RC 原因是因為 ISP 下載程式方便,在這製作的過程中一路跌跌撞撞,感謝 痞酷網的先進 指導 鼓勵...

  經驗談:
  1. 這個電路後來才知道 叫做 "富蘭克林震盪電路" 他利用前方的 L 和 C 的並聯諧振,把諧振的信號送給 STC89C52RC P3^4(T0) 計算頻率.
  2. 諧振電容 1000P 要很準確,防止溫度飄移,因為, 電感的容量是靠 "標準電容器 1000P" 與"未知"電感諧振而產生頻率,再利用這個頻率去推算出"電感"的感量來, L=1/(頻率平方* 2PI平方*電容量)
  3. 一開始發現 LCM1602 顯示的頻率,會因為電感的變化呈現 "非線性"的變化,後來經過 先進們的指導,使用示波器發現 震盪頻率是"線性的",只是 程式出了問題所造成(程式是實驗板附贈的),也才了解 12M的 STC89C52RC 是12T的 MCU 他的計頻最高是 Fosc/24 約 500khz, 還有精準的中断計時需要使用 模式2 -- 8位元自動重裝的方式,這個修改把 "非線性的變化"解決了!!!
4. 第一次用 STC89C52RC 來做高階計算 "諧振公式" ,因為"開根號"的問題需要解決! 還好用 C語言比較好解決. 另外,網路上有人把"頻率顯示出來"居然超過 65536, 也因為 先進們的教導,才把這個"疑惑"解決了!!
5. 電感一定要用 82uH嗎? 其實可以不需要!! 因為那只是一個基本共振的元件,網路上的程式 我沒有去了解!!(有的提供 程式碼我也看不懂),我只用 公式去推導,當然,網路上有人用許多技巧去把 OFFSET 去除,我的經驗&能力不足所以就"土法煉鋼"...
6. 網路上的LC表 又是用開關,又是用 磁簧繼電器來控制,會讓人不知所以然,其實他就是要切換 "電感" "電容"的動作, "外測電感"是要跟電感"串聯", 而"外測電容"是要跟電容"並聯". 當"電感"開路的時候就無法震盪,...
7. PIC 電路有外接 10K電阻,有的電路接 6.8K 到MCU的 T0(P3^4) 一接上就無法顯示...

電感01 [800].JPG

電感02 [800].JPG

電感04 [800].JPG

電感06 [800].JPG

電感07 [800].JPG

8. 程式因為用 C 寫的 SPRINTF 這指令會造成增加 1~2K的容量,需要再瘦身!! 這樣對 LCM 1602 的程式顯示上會更順暢!!
  分享相關程式,有興趣請告知!!

再補充部分:
A. 此次使用的 石英震盪 11.0592 與一般的12M 有些微差異,正常 12M 經過除頻會得到 1uS的時間,但是我為了方便 STC下載所以都使用 RS232的傳輸用晶振頻率(上次買了 100個)所以時間中断上面設成
  TMOD |= 0x20;          //使用模式2,8位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=(256-230);              //針對 11.0592 给定初值,这里使用定时器最大值从0开始计数一直到256溢出自動重載
TL1=(256-230);
EA=1;            //总中断打开
ET1=1;           //定时器中断打开
TR1=1;           //定时器开关打开

B. 電路圖上面 排組共9腳 pin 40 & pin 31 接在一起,請注意!!
C. 此一電路若是把 LM311 輸出斷開,外接頻率 就可以當做 0~500KHZ的玩具級計頻器(但是沒有絕對準!)
D. 相關的程式已經在 http://bbs.pigoo.com/thread-41653-1-1.html PO出,請參考!!

評分

17

查看全部評分

發表於 2012-11-7 23:21:37 | 顯示全部樓層
哈,皇天不負苦心人,終於被你 “搞”出來了,帥哦!
發表於 2012-11-7 23:35:28 | 顯示全部樓層
DIY精神無價 讚!!!
發表於 2012-11-7 23:50:04 | 顯示全部樓層
antlu大做電路的衝勁,實在令人佩服。(跟我的個性一樣)
 樓主| 發表於 2012-11-8 00:03:01 | 顯示全部樓層
cremaker 發表於 2012-11-7 11:21 PM static/image/common/back.gif
哈,皇天不負苦心人,終於被你 “搞”出來了,帥哦!

cremaker大:
   "搞"是大陸用語!! 沒關係!! 老鄧說 黑貓白貓會抓老鼠就是好貓,不會抓老鼠,當個"弄臣(娛樂大家)"也不錯!!
 樓主| 發表於 2012-11-8 00:04:33 | 顯示全部樓層
單晶片微電腦 發表於 2012-11-7 11:50 PM static/image/common/back.gif
antlu大做電路的衝勁,實在令人佩服。(跟我的個性一樣)

單晶片微電腦大:
   沒有您的教導就沒有這篇的發出,再次感謝您!!
發表於 2012-11-8 00:15:48 | 顯示全部樓層
想試試做看看>但是C程式語言不會>>>
發表於 2012-11-8 00:17:48 | 顯示全部樓層
那我感謝學校的老師好了。
 樓主| 發表於 2012-11-8 00:23:40 | 顯示全部樓層
王伯 發表於 2012-11-8 12:15 AM static/image/common/back.gif
想試試做看看>但是C程式語言不會>>>

可以提供 HEX檔!!
發表於 2012-11-8 00:46:01 | 顯示全部樓層
好厲害喔:sam18
發表於 2012-11-8 12:34:11 | 顯示全部樓層
厲害厲害.
終於出關了
 樓主| 發表於 2012-11-8 14:26:47 | 顯示全部樓層
xiaolaba 發表於 2012-11-8 12:34 PM static/image/common/back.gif
厲害厲害.
終於出關了

xiaolaba 大:
   您的大作 ESR 表 我已經心儀很久了!! 想要用 8952作!! 但是 還不會 A/D 轉換的程式!!
發表於 2012-11-8 14:41:23 | 顯示全部樓層
手邊很多這種電容,不知道是否合用
DSC04815.JPG
發表於 2012-11-8 18:38:23 | 顯示全部樓層
雄爸爸 發表於 2012-11-8 02:41 PM static/image/common/back.gif
手邊很多這種電容,不知道是否合用

看起來不錯,好物...

請問 是寫 750pf 嗎 ?
發表於 2012-11-8 18:41:01 | 顯示全部樓層
antlu 發表於 2012-11-8 02:26 PM static/image/common/back.gif
xiaolaba 大:
   您的大作 ESR 表 我已經心儀很久了!! 想要用 8952作!! 但是 還不會 A/D 轉換的程式!! ...

喔...如果要做51板的就多努力
不過忘記了51有沒有A/D
A/D 用法 也是和TIMER一樣產不多
因為每家MCU的設計人才都是那幾家始祖出來的 (或者是參考的).
 樓主| 發表於 2012-11-8 19:49:46 | 顯示全部樓層
雄爸爸 發表於 2012-11-8 02:41 PM static/image/common/back.gif
手邊很多這種電容,不知道是否合用

雄爸:
   太威了!!這個電容器應該可以,因為只要把"公式"改一下就可以了!! 頻率更穩定了!! 因為是 2%的!! 給我2個好嗎? 求求你!!
 樓主| 發表於 2012-11-8 19:51:33 | 顯示全部樓層
xiaolaba 發表於 2012-11-8 06:41 PM static/image/common/back.gif
喔...如果要做51板的就多努力
不過忘記了51有沒有A/D
A/D 用法 也是和TIMER一樣產不多

先把 4字7段顯示的版本搞定!! 這樣會更平民化!!
發表於 2012-11-8 19:57:51 | 顯示全部樓層
antlu 發表於 2012-11-8 07:49 PM static/image/common/back.gif
雄爸:
   太威了!!這個電容器應該可以,因為只要把"公式"改一下就可以了!! 頻率更穩定了!! 因為是 2%的!!  ...

當初發現這個東西就知道是個好物
所以也就全部掃空了
手邊數量很多
找個時間過來拿吧
 樓主| 發表於 2012-11-8 20:59:18 | 顯示全部樓層
雄爸爸 發表於 2012-11-8 07:57 PM static/image/common/back.gif
當初發現這個東西就知道是個好物
所以也就全部掃空了
手邊數量很多

感謝!! 下週過去!!
發表於 2012-11-8 22:12:39 | 顯示全部樓層
antlu大,可不可以補一張LM311(7 pin)輸出的脈波示波器圖
電感你自選一個。
發表於 2012-11-8 23:26:40 | 顯示全部樓層
單晶片微電腦 發表於 2012-11-8 10:12 PM static/image/common/back.gif
antlu大,可不可以補一張LM311(7 pin)輸出的脈波示波器圖
電感你自選一個。 ...

正常來說, 就是方波
發表於 2012-11-8 23:27:33 | 顯示全部樓層
antlu 發表於 2012-11-8 07:51 PM static/image/common/back.gif
先把 4字7段顯示的版本搞定!! 這樣會更平民化!!

喔...
還要貧民化喔....
看來是要出產品囉.
恭喜恭喜
 樓主| 發表於 2012-11-8 23:50:05 | 顯示全部樓層
本帖最後由 antlu 於 2012-11-8 11:51 PM 編輯

平民化電感量測!! 先分享照片和程式 線路圖要慢一點!!
L7SG02 [800].JPG

L7SG01 [800].JPG

L7SG05 [800].JPG

L7SG04 [800].JPG

修改一下程式
L7SG03 [800].JPG

L7SG06 [800].JPG

L7SG07 [800].JPG

L7SG08 [800].JPG

/*-----------------------------------------------
   七段顯示 電感計  
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include<intrins.h>
//#include"1602.h"
//#include"delay.h"
//sbit LED=P1^2;    //定义LED端口
bit OVERFLOWFLAG;
bit TIMERFLAG;
unsigned int LVint;
//void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);

#define DataPort P0//P0.0~P0.7 七段顯示的段顯示(共陰極)
#define DrivePort P1//驅動共陰極顯示器
unsigned char code  dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰7段值0~9
//unsigned char code  dofly_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽7段值0~9

unsigned char code dofly_WeiMa[8]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f };//共陰位碼1>>秒, 位碼2>>10秒,位碼3>>分, 位碼4>>10分,
//unsigned char code dofly_WeiMa[8]={ 0x01,0x02,0x04,0x08, 0x01,0x02,0x04,0x08 };//{ 0x01,0x02,0x04,0x08, 0x10,0x20,0x40,0x80 };//共陽位碼1>>秒, 位碼2>>10秒,位碼3>>分, 位碼4>>10分,

unsigned char TempData[4]; //存??示值的全局?量,把段碼的資料存到要顯示的緩衝器上面,利用類似查表的對應方式,送出至顯示器. TempData[ ] 是放置要顯示的7段資料
void Display_Data_Operation(void);
void Display(char n,char Num);
/*------------------------------------------------
                    定时器0初始化子程序
                                        本程序用于计数
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01 | 0x04;          //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响                     
TH0=0x00;              //给定初值
TL0=0x00;         
TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                    定时器1初始化子程序
                                        本程序用于定时
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x20;          //使用模式2,8位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=(256-230);              //给定初值,这里使用定时器最大值从0开始计数一直到256溢出自動重載
TL1=(256-230);
EA=1;            //总中断打开
ET1=1;           //定时器中断打开
TR1=1;           //定时器开关打开
}

/*------------------------------------------------
                 定时器0中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
TH0=00;              //重新给定初值
TL0=00;

OVERFLOWFLAG=1;  //溢出标志

}
/*------------------------------------------------
                 定时器1中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
static unsigned int i;//自動載入模式
i++;
if(i==400)       //100ms 计数时间单位,得出100ms脉冲个数 x10就是1s中脉冲个数,即为频率 Hz
   {
   i=0;
   TR0=0;        //2个定时器关闭
   TR1=0;
   TIMERFLAG=1;  //标志位清零
   }
}




//#include "delay.h"

void DelayUs2x(unsigned char t)
{   
while(--t);
}

void DelayMs(unsigned char t)
{
     
while(t--)
{

     DelayUs2x(245);
         DelayUs2x(245);
}
}



/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
unsigned  long int a;
float LV,sq;
// char temp[16];      //定义字符显示缓冲数组
Init_Timer0();      //初始化定时器0
Init_Timer1();      //初始化定时器1
// LCD_Init();         //初始化液晶屏
// DelayMs(10);        //延时用于稳定,可以去掉
// LCD_Clear();        //清屏
while(1)
{

  if(TIMERFLAG)      //定时100ms到,做数据处理
    {
         a=TL0+TH0*256;//读取计数值
         a=a*25;     //扩大到实际值10
//     sprintf(temp,"FREQ:%08.0f Hz",(float)a);//445080hz
//     LCD_Write_String(0,1,temp);//显示到液晶第二行
         sq=(a/1000)*(a/1000);//這很重要,不能改成 (a*a/1000000)
         LV=(1000000/(sq*39.4*0.001))-77;//630
         LVint=LV;//change to 整數
         Display_Data_Operation();//把 電感值LV轉成顯示
//     sprintf(temp," L=:%06.3f uH ",(float)LV);
//     LCD_Write_String(0,0,temp);//显示到液晶第二行
         
         TR0=1;                     //2个定时器打开
         TR1=1;
         TH0=0;                     //保证计数器初值为0
         TL0=0;
         TIMERFLAG=0;               //打开计时计数标志
         Display(0,4);
        }
  }
}

//--------------------------------------------------------------------------------------------
void Display_Data_Operation(void)//以時間分秒為共同語言, 數字轉換成7段顯示
{
TempData[3]=dofly_DuanMa[LVint/1000];
if(LVint<1000)
   TempData[3]=0;
TempData[2]=dofly_DuanMa[LVint%1000/100];//
if(LVint<100)
  TempData[2]=0;
TempData[1]=dofly_DuanMa[LVint%100/10];//
TempData[0]=dofly_DuanMa[LVint%10];//
Display(0,4);
}       
//--------------------------------------------------------------------------------------------
void Display(char n,char Num)// 把七段顯示出去,假如Startflag==1 則輸出RELAY,已經不管controlBit了 0516
{
      unsigned char i;
      unsigned char j;
      n=0;
          for(i=0;i<Num;i++)
           {
           DataPort= TempData; //
       DrivePort= dofly_WeiMa[i+j];      
                 DelayMs(20); //0513 update
       DataPort=0;
       }
          
}

 樓主| 發表於 2012-11-8 23:53:41 | 顯示全部樓層
本帖最後由 antlu 於 2012-11-9 12:01 AM 編輯
xiaolaba 發表於 2012-11-8 11:27 PM static/image/common/back.gif
喔...
還要貧民化喔....
看來是要出產品囉.


xiaolaba 大:
  愛說笑!! 是"平民化" 不是"貧民化"  共陰4位數 !! 假如有人要5位數把程式改一下就可以!!

Lmeter1108.rar (2.25 KB, 下載次數: 53)

FEQ.rar (4.3 KB, 下載次數: 49)

評分

1

查看全部評分

發表於 2012-11-8 23:56:21 | 顯示全部樓層
antlu 發表於 2012-11-8 11:50 PM static/image/common/back.gif
平民化電感量測!! 先分享照片和程式 線路圖要慢一點!!

oh...

如果先把這段, 在紙上簡化到最簡, 然後才寫程序, 執行碼和速度都應該很有進步的空間
除非你用的C COMPILER 很優化

         a=TL0+TH0*256;//读取计数值
         a=a*25;     //扩大到实际值10
//     sprintf(temp,"FREQ:%08.0f Hz",(float)a);//445080hz
//     LCD_Write_String(0,1,temp);//显示到液晶第二行
         sq=(a/1000)*(a/1000);//這很重要,不能改成 (a*a/1000000)
         LV=(1000000/(sq*39.4*0.001))-77;//630

例如,
a = T0 (16 bit)
a = a * 25
sq = (a/1000)^2, (因為 a x a > 32bit, COMPILER 可能已經 OVERFLOW)

實際的計算就是
sq = (T0 x 25 / 1000) ^2

所以

sq = (T0/40) ^2.....

計算機和COMPILER 的負擔都變小了, 效率和ROM SIZE 自然比較好

不清楚 LV 和 0,001 的那堆常數的詳細關係, 但是還是可以繼續用這個方法優化, 參考看看

評分

1

查看全部評分

發表於 2012-11-9 00:34:47 | 顯示全部樓層
把7段顯示器延時掃描的時間<變短>,應該也會加速顯示的速度。
 樓主| 發表於 2012-11-9 01:12:33 | 顯示全部樓層
xiaolaba 發表於 2012-11-8 11:56 PM static/image/common/back.gif
oh...

如果先把這段, 在紙上簡化到最簡, 然後才寫程序, 執行碼和速度都應該很有進步的空間

xiaolaba大:
   感謝指導!! 這是我第一次把 公式化成C語言,當初真的完全不知道應該如何寫!!  
  把程式PO出來大家可以看到需多問題!! 這樣我也可以從回饋中學到 因為不知道 平方的寫法,所以,就乘上自己了 "^2" 真好 !! 還有 a=T0(16bit) 也是第一次看(學)到!!  a*25 其實是要 a*25.6 為何有這個鼕鼕,我也不明瞭,我是因為用計算機推算的結果差了 25.6 ..
  0.001 是電容 1000p =0.001uF 還好我是用C寫,組合語言我會永遠寫不出來的!! 那些一大堆的 +-*/ 都是因為諧振公式 導出電感值!! 39.4 是(2Pi )^2 , -77 是電感 82uH 的值...
   這次下來或許高手會"笑掉大牙"但是我收穫最多!!!
發表於 2012-11-9 12:29:31 | 顯示全部樓層
本帖最後由 xiaolaba 於 2012-11-9 12:35 PM 編輯
antlu 發表於 2012-11-9 01:12 AM static/image/common/back.gif
xiaolaba大:
   感謝指導!! 這是我第一次把 公式化成C語言,當初真的完全不知道應該如何寫!!  
  把程式PO ...


HUMM。。。。
指導就不敢當,大家一起學習學習吧, 俺也曾經碰到過這個問題. 因為沒有詳細看你的源碼,不過如果出現 25.6 的常數, 可能本來就沒有想要優化計算

你可以看看這個方向,

8bit 或 16 bit counter 收到的脈衝 和 頻率的關係, 假定頻率的變化微小, 則,

frequency (F)  =  pulse count (P) / gate time (T)
例如, T = 1 sec, P = 1000, F = 1000 Hz
例如, T = 1/2 sec, P = 1000, F = 2000 Hz

所以
F = P / T

gate time (T) 就是接收震盪訊號的一個時間片段, 可以隨意, 也可以刻意指定某個數, 例如 0.1 sec, 或者 0.125  sec .....

如果 T <= 1 second, 且為 2 的負整倍數, 2^0, 2^-1, 2^-2, 2^-4.....則,
T = 1, 0.5, 0.25, 0.125... 或
T = 1, 1/2, 1/4, 1/8....

所以 F = P / T = P x (1/T) = P x 1, Px2, Px4, Px8 .....

再用 無符號 右移, 實際就是... x1, x2, x4, x8 .....
F = P << (1/T) = P<<0, P<<1, P<<2  .....

這個運算速度要比除法快很多

但是另外一個問題來了....

如果 T0 是 8 bit, 乘法後 就是 16 BIT
如果 T0 是 16 bit, 乘法後 就是 32 BIT

這個問題就是設計 gate time (T) 的關鍵, 你可以慢慢研究了, 當你寫越多, 就越發現更多解決方法, 不過, 記得寫碼要務必讓自己一年後還能看得懂為要.


另外, C 的貧方和開方, 好像是 pow , sqrt 你看看你的 math.h 有沒有支援就知道了

評分

2

查看全部評分

 樓主| 發表於 2012-11-9 13:57:35 | 顯示全部樓層
xiaolaba 發表於 2012-11-9 12:29 PM static/image/common/back.gif
HUMM。。。。
指導就不敢當,大家一起學習學習吧, 俺也曾經碰到過這個問題. 因為沒有詳細看你的源碼 ...

xiaolaba大:
    感謝!!   不怕被挑毛病,就有機會學到東西. 學C 語言 我應該只有看過幾堂大陸的 C語言教學課程,以及翻過幾本書罷了!! 算是不用功的學生!! 因為 沒有壓力!! 又急於把東西做出來!!(後面排隊的玩具還很多!!) 所以就 走一步算一步!!  當初 在"日語"和"C 語" 之間選擇,最後選擇 C語言,...
   pow 沒聽過 sqrt也是這次從書本裡面找到的...
 樓主| 發表於 2012-11-9 19:09:36 | 顯示全部樓層
本帖最後由 antlu 於 2012-11-9 07:36 PM 編輯



LCM & 7段顯示都可以用!!
把回收場的 儀表面板拆下來(一半顯示) 共陰極,接上轉接板, 就可以了!! 缺點是 亮度不足!! 可能是掃描時間不夠,我沒有加電阻,直接P0給七段.P1給四位數共陰...

L7SGA02 [800].JPG

L7SGA03 [800].JPG

L7SGA04 [800].JPG

L7SGA05 [800].JPG

L7SGA09 [800].JPG


Lmeter7seg.png

若使用 LCM1602 需要重新下載程式,換上 1602的模組就OK了!!
後續慢慢改程式!!

評分

1

查看全部評分

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-5-3 05:27 PM , Processed in 0.106142 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.