痞酷網_PIGOO

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

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

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

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

謝謝!
12
返回列表 發新帖
樓主: antlu

求助: 震盪電路問題!! 已經解決!! 問題在於 89S52...

  [複製鏈接]
 樓主| 發表於 2012-11-3 19:50:34 | 顯示全部樓層
為了感謝以上大大的協助,我手頭上有 電阻型82uH的電感,需要的請告知可以寄送一隻這樣就可以做"電感計"了!!
 樓主| 發表於 2012-11-3 23:32:57 | 顯示全部樓層
使用頻率計送進 MCU STC89C52RC 的T0 外部計數器中,頻率最高到200K就上不去了(顯示在 2XXKHZ ),後續再向大家報告!!
 樓主| 發表於 2012-11-3 23:48:40 | 顯示全部樓層
確認是程式問題,因為用89S52 也相同!!
發表於 2012-11-4 09:03:07 | 顯示全部樓層
antlu 發表於 2012-11-3 11:48 PM static/image/common/back.gif
確認是程式問題,因為用89S52 也相同!!

有換過石英頻率?24MHz?
 樓主| 發表於 2012-11-4 22:47:54 | 顯示全部樓層
ciko.ciko 發表於 2012-11-4 09:03 AM static/image/common/back.gif
有換過石英頻率?24MHz?

ciko.ciko大:
  為何跟換石英震盪有關係? 不過我也想不通的問題是,為何低頻都可以計算,高頻就不行了!! 我還用CD4069 反向器試圖把波形整好一些!!但是效果不佳?
發表於 2012-11-4 23:45:52 | 顯示全部樓層
這個跟8051頻率響應有關。低頻信號進來,由於8051快過低頻信號,當然就捉的到,
但是換成高頻時,高頻信號速度大過於8051處理的速度,當然就捉不到,即時捉到也是嚴重衰減。
只好石英換成更高頻率的。以8051用12MHz來說,最高只能500kz。
 樓主| 發表於 2012-11-5 00:29:10 | 顯示全部樓層
單晶片微電腦 發表於 2012-11-4 11:45 PM static/image/common/back.gif
這個跟8051頻率響應有關。低頻信號進來,由於8051快過低頻信號,當然就捉的到,
但是換成高頻時,高頻信號 ...

兩位大大:
       感謝教導!!    因沒有實際的接觸,所以都以所謂的"正常應該如此.." 真是"不經一事,不長一智"啊!!
發表於 2012-11-5 08:45:12 | 顯示全部樓層
antlu 發表於 2012-11-4 10:47 PM static/image/common/back.gif
ciko.ciko大:
  為何跟換石英震盪有關係? 不過我也想不通的問題是,為何低頻都可以計算,高頻就不行了!! 我 ...

1.以硬體整型的目的,是因信號波型本身的數位高低準位,無法被正確判斷時,才考慮是否加入.
2.加倍提高石英頻率,可使單晶片工作速率加倍,但同樣的計時副程式執行時間,亦會縮短,必須配合修正,在未修正程式下,讀值可能會剩下1xxk有效 .
 樓主| 發表於 2012-11-5 20:14:27 | 顯示全部樓層
ciko.ciko 發表於 2012-11-5 08:45 AM static/image/common/back.gif
1.以硬體整型的目的,是因信號波型本身的數位高低準位,無法被正確判斷時,才考慮是否加入.
2.加倍提高石英 ...

ciko.ciko 大:
    經過更換 石英震盪之後的結果,同樣的程式 "頻率顯示" 最多"顯示" 205KHZ,
  但是 11.0592晶振 輸入 228KHZ的信號,頻率顯示 207KHZ就不再上升了
  使用 28.22M 晶振 輸入可以達到 480KHZ ,頻率顯示 204KHZ 就不再上了

判斷可能 程式上面出了問題,晶振也有幫助... 另外,比較奇怪的事 電路圖上的 PIC  MCU 他的晶振只有4MHZ 卻可以完成,是否他的是 1t 的MCU呢?

   繼續努力!!
發表於 2012-11-5 20:37:55 | 顯示全部樓層
antlu 發表於 2012-11-5 08:14 PM static/image/common/back.gif
ciko.ciko 大:
    經過更換 石英震盪之後的結果,同樣的程式 "頻率顯示" 最多"顯示" 205KHZ,
  但是 11.0 ...

1.縮短計時器時間,例如以1秒計數外部輸入,改成0.1秒計數,再換算回1秒的計數值.
2.89S51的最高頻率為24MHz.(計數值可加倍),程式時間計時器,須改為原先的一半.
 樓主| 發表於 2012-11-6 02:03:35 | 顯示全部樓層
ciko.ciko 發表於 2012-11-5 08:37 PM static/image/common/back.gif
1.縮短計時器時間,例如以1秒計數外部輸入,改成0.1秒計數,再換算回1秒的計數值.
2.89S51的最高頻率為24MHz ...

ciko.ciko大:
   感謝!! 問題終於解決了!! 有線性了!! 我把內部計時器使用 自動重裝8BIT MODE 2 一跑,電感量就不會有不限性的問題了!! 只是我的定時器測出的頻率與示波器測出的差了 2.56倍 一時偷懶就把公式X2.5倍...

/*-----------------------------------------------
   電感計
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include"1602.h"
#include"delay.h"
//#define HIGH (65536-12250)/256 //10000:9174:7323
//#define LOW  (65536-12250)%256

sbit LED=P1^2;    //定义LED端口
bit OVERFLOWFLAG;
bit TIMERFLAG;
/*------------------------------------------------
                    定时器0初始化子程序
                                        本程序用于计数
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01 | 0x04;          //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响                     
TH0=0x00;              //给定初值
TL0=0x00;         
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
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;           //定时器开关打开
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
unsigned  long int a;
float LV,sq;
char temp[16];      //定义字符显示缓冲数组
Init_Timer0();      //初始化定时器0
Init_Timer1();      //初始化定时器1
LCD_Init();         //初始化液晶屏
DelayMs(10);        //延时用于稳定,可以去掉
LCD_Clear();        //清屏
LCD_Write_String(0,0,"FREQ TEST");//写入第一行信息,主循环中不再更改此信息,所以在while之前写入
while(1)
{
  if(OVERFLOWFLAG)//检测溢出标志,如果溢出表明频率过高,显示溢出信息
    {
         OVERFLOWFLAG=0;//标志清零
     LCD_Write_String(0,1,"overflow >655KHz");
        }
  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);
         LV=(1*1000000000/(sq*39.4))-77;

       
     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;               //打开计时计数标志
         
        }
  }
}

/*------------------------------------------------
                 定时器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;  //标志位清零

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

本版積分規則

關閉

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

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

GMT+8, 2024-11-26 05:45 PM , Processed in 0.165267 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.