2-3 mHZ arasında kare dalga

Başlatan . Kağan, 16 Kasım 2021, 09:53:51

. Kağan

Bir projem için 2-3 mHZ arasında kare dalga (0 ile 1-5V arası) üretip bu dalganın duty cycle oranını 10-90 arasında ayarlayabilmem gerekiyor. İşlemci kullanarak pwm ile 65.535hz değerinin üstüne çıkamıyorum. AD9833 kullandığımda bu frekansa ulaşabilsem de bu defa AD9833 te duty cycle ayarı yapamıyorum.
Sadece bahsettiğim frekanslarda kare dalga üretip duty cycle değerini ayarlayabileceğim bir yöntem ya da komponent varmı acaba? Şimdiden teşekkürler.

Ekleme: Eğer yukarda bahsettiğim frekanslarda bu çok zor yada mümkün değil ise işlemci ile kontrol edebileceğim 1-1,5 MHZ arası genlik ayarı yapılabilen bir teknik yada komponent önerirmisiniz?

elektro77

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

mehmet

#2
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

elektro77

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

. Kağan

#4

elektro77

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Gerekli olan sinyal değerini lütfen Hz cinsinden yazınız. Kavram kargaşası meydana geliyor ve hangisinin istendiği çok açık değil (bana göre)
Sinyal şayet Mhz yani Mega Hertz ise 1Mhz=1.000.000 Hz dir.
Sinyal şayet mHz ise ki bunu ben miliHz olarak algılıyorum.  1 mHz= 1/1000 Hz (0,001 hz) dir.

1,5mHz =0,0015 Hz olacaktırki böyle bir şey isteyebileceğinize pek inanmadım doğrusu.
Bu sinyalin peryodu T=1/0,0015=666,66 sn olacaktır.

Bir kez daha düşünün ve doğrusunu yeniden yazın lütfen.

Ete

ete

İstenen şeyin 0-1,5Mhz (1500Khz- 1500000Hz) frekans aralığı olduğunu düşünerek bu işin yüksek hızlı bir işlemci ile yapılabileceğini düşünüyorum.
12F1822-16F1827-16F1825 gibi işlemcilerden birisini kullanarak dahaili OSC sini 16Mhz olarak kullanıp PLL yide aktif ederseniz işlemci frekansı 64Mhz'e ulaşır.
Bu çalışma frekansı ile HPWM modülünü kullanarak 1,5Mhz lik bir sinyali CCP1 çıkışından alabilir üstelik bu sinyalin duty değerini 0-100 aralığında değiştirebilirsiniz.
Ne yazıkki sinyalin duty çözünürlüğü 7 bit olacaktır ve duty register değeri 0-43 aralığında değişecek buna karşılık da %0-100 aralığında bir sinyal genliği elde edeceksiniz.
Bunları yapmak için;
PR2=10  
T2CON=%00000100 
CCP1CON=%00001100
register değerleri kullanılmalıdır.
Bu aşamadan sonra geriye duty değerini işlemciye vermek kalır ki onuda;
       X=DUTY
       CCP1CON.4=X.0
       CCP1CON.5=X.1
       CCPR1L=X>>2
komutları ile yapıyoruz. Burada yer alan DUTY değeri 0-43 arasında bir değer almalıdır.
Dediğim gibi işlemci 64 Mhz de çalışırsa bu frekansı alabilirsiniz.

Ete


. Kağan

Alıntı yapılan: ete - 16 Kasım 2021, 11:57:20Gerekli olan sinyal değerini lütfen Hz cinsinden yazınız. Kavram kargaşası meydana geliyor ve hangisinin istendiği çok açık değil (bana göre)
Sinyal şayet Mhz yani Mega Hertz ise 1Mhz=1.000.000 Hz dir.
Sinyal şayet mHz ise ki bunu ben miliHz olarak algılıyorum.  1 mHz= 1/1000 Hz (0,001 hz) dir.

1,5mHz =0,0015 Hz olacaktırki böyle bir şey isteyebileceğinize pek inanmadım doğrusu.
Bu sinyalin peryodu T=1/0,0015=666,66 sn olacaktır.

Bir kez daha düşünün ve doğrusunu yeniden yazın lütfen.

Ete


Haklısınız.
mili ve mega karışıyor.

1.000.000 - 2.000.000 Hz arasında demek daha doğru. 

. Kağan

#9
Alıntı yapılan: ete - 16 Kasım 2021, 12:17:50İstenen şeyin 0-1,5Mhz (1500Khz- 1500000Hz) frekans aralığı olduğunu düşünerek bu işin yüksek hızlı bir işlemci ile yapılabileceğini düşünüyorum.
12F1822-16F1827-16F1825 gibi işlemcilerden birisini kullanarak dahaili OSC sini 16Mhz olarak kullanıp PLL yide aktif ederseniz işlemci frekansı 64Mhz'e ulaşır.
Bu çalışma frekansı ile HPWM modülünü kullanarak 1,5Mhz lik bir sinyali CCP1 çıkışından alabilir üstelik bu sinyalin duty değerini 0-100 aralığında değiştirebilirsiniz.
Ne yazıkki sinyalin duty çözünürlüğü 7 bit olacaktır ve duty register değeri 0-43 aralığında değişecek buna karşılık da %0-100 aralığında bir sinyal genliği elde edeceksiniz.
Bunları yapmak için;
PR2=10  
T2CON=%00000100 
CCP1CON=%00001100
register değerleri kullanılmalıdır.
Bu aşamadan sonra geriye duty değerini işlemciye vermek kalır ki onuda;
       X=DUTY
       CCP1CON.4=X.0
       CCP1CON.5=X.1
       CCPR1L=X>>2
komutları ile yapıyoruz. Burada yer alan DUTY değeri 0-43 arasında bir değer almalıdır.
Dediğim gibi işlemci 64 Mhz de çalışırsa bu frekansı alabilirsiniz.

Ete



Hocam anladım ve çok teşekkür ederim bilgi için.

register ayarı ve duty cycle değerini nasıl değiştireceğimi anlatım. Fakat frekansı değiştirmek için işlemcinin osc frekansını yada Tmr2 mı değiştirmemiz gerekecek? Tmr2 de verdiğimiz PR2=10 değeri bir değişkene atanarak çalışma esnasında değiştirilebilirmi? Duty ve frekans değerini başka bir işlemciden 12F1822-16F1827 nin rx ile almayı ve işlemeyi planlıyorum.

ete

FRekansı etkileyen iki ana parametre var. Bunlardan birisi bölme oranı ki bu sanırım 1Mhz -1,5Mhz aralığında sabit kalacaktır. Diğeri ise PR2 değeridir.
Şimdi 1Mhz lik sinyal değerlerine bakacak olursak
PR2=15 olarak gözüküyor. Bölme oranı yine 1/1. Bu durumda 15 ten geriye doğru 10'a gelirseniz frekans da 1 Mhz den 1,5Mhz e doğru değişim gösterecektir.
Ancak Duty register değeri frekansa göre farklılık gösterecektir. Bu nedenle en doğrusu Duty değerini % (yüzde) olarak hesaplayıp oradan Duty değerini elde etmek gerekir.

Bunlar için formüllerimiz şöyle olmalı,
Frekans=1000/[(PR2+1)*4*(1/OSC Frekansı_MHz)*PR2_Bölücüdeğeri]
Bölme oranı 1/1 olacağı için formülü kısaltabiliriz.
Frekans=1000/[(PR2+1)*4*(1/OSCFrekansı_MHz)],    (örnek hesap F=1000/(15+1)*4*(1/64)=1000 Khz). yani 1 Mhz.
Duty=(PR2+1) * %Duty/25  , örnek hesap Duty=(10+1)*50/25=22
SOnuçta Frekans formülünden PR2 hesaplanabilir oradan da Diğer formülü kullanıp Duty değeri hesaplanabilir.
Ete




. Kağan

#11
Şimdi rx aşamasında https://etepic.com/index.php?topic=3988.0 konusunu inceledim. İlgili rx konusunda anlattıklarınıza göre en aşağıdaki ana kodu toparladım. Şimdi
FRQ  VAR BYTE   'FREKANS AYARLAMADA KULLANILACAK PR2 DEĞERİ
DUTY VAR BYTE  'GENLİK AYARLAMADA KULLANILACAK DUTY DEĞERİ


BASLA:

  PR2=FRQ  
       T2CON=%00000100 
       CCP1CON=%00001100
       
  X=DUTY
       CCP1CON.4=X.0
       CCP1CON.5=X.1
       CCPR1L=X>>2

kısmını yerieştirmeye çalışacağım. Bununla birlikte aşağıdaki kodun (32 MHz internel osc ile çalışması gereken) çalışıp çalışmadığını bilmiyorum.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2021 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 16.11.2021                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;----[16F1827 Hardware Configuration]-------------------------------------------
ASM
cfg1 = _FOSC_INTOSC           ; INTOSC oscillator: I/O function on CLKIN pin
cfg1&= _WDTE_OFF              ; WDT disabled
cfg1&= _PWRTE_OFF             ; PWRT disabled
cfg1&= _MCLRE_ON              ; MCLR/VPP pin function is MCLR
cfg1&= _CP_OFF                ; Program memory code protection is disabled
cfg1&= _CPD_OFF               ; Data memory code protection is disabled
cfg1&= _BOREN_OFF             ; Brown-out Reset disabled
cfg1&= _CLKOUTEN_OFF          ; CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin
cfg1&= _IESO_ON               ; Internal/External Switchover mode is enabled
cfg1&= _FCMEN_ON              ; Fail-Safe Clock Monitor is enabled
  __CONFIG _CONFIG1, cfg1

cfg2 = _WRT_OFF               ; Write protection off
cfg2&= _PLLEN_ON             ; 4x PLL ENABLED
cfg2&= _STVREN_ON             ; Stack Overflow or Underflow will cause a Reset
cfg2&= _BORV_19               ; Brown-out Reset Voltage (Vbor), low trip point selected.
cfg2&= _LVP_OFF               ; High-voltage on MCLR/VPP must be used for programming
  __CONFIG _CONFIG2, cfg2

ENDASM


'*************************************
'// ISLEMCI TANIMLAMALARI 

DEFINE OSC 32         'KRİSTAL FREKANSI
'DEFINE ADC_BITS 10    'kapalı
'DEFINE ADC_CLOCK 1     'kapalı
'DEFINE ADC_SAMPLEUS 15  'kapalı

'*************************************


DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive     *
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1                     *
DEFINE HSER_CLROERR 1 ' Clear overflow automatically                    *
DEFINE HSER_SPBRG 160 ' 2400 Baud @ 4MHz, -0,08%                          *
SPBRGH = 1                                                                  *
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator                      *  RX AYARLARI
                                                                            *
Symbol GIE   =INTCON.7   'genel interruptları açıyor                      *
Symbol PEIE  =INTCON.6   'peripheralinterruptları açıyor                *
Symbol RCIE  =PIE1.5     'USART Recive interrupt enable bit          *
Symbol RCIF  =PIR1.5     'USART Receive interrupt flag bit        *


'**KESME DEĞERLERİ**********'*
    INTCON=%11000000                 
    On_Hardware_Interrupt GoTo INT   
    RCIE=1                           
'*****************************



'********************DEĞİŞKENLER*********************************
OSCCON =%11110010  '4x PLL Is enabled, 1110=8 MHz or 32 MHz HF, 1x = Internal oscillator block    "4x4=32MHz"
CM1CON0=0
CM2CON0=0

FVRCON =0              'voltaj referanslarını iptal ediyoruz                     
DACCON0=0              'dac devre dışı
SRCON0=0               'sr latch kontrol devre dışı      
SRCON1=0               'sr latch kontrol devre dışı 
'MDCON=0                'modülator çıkışı iptal 
TXSTA.5=1
TXSTA.2=1
RCSTA.7=1
RCSTA.4=1

ADCON1 = %10000000 'SAGA YASLANIK sonuç almak için
ADCON0 = 0

TRISA=%00000000
ANSELA=0
PORTA=0
'---------------------
TRISB=%00000010    'PORTLAR CIKIS KONUMUNDA  "RB0" HPWM İÇİN ÇIKIŞ, "RB1" RX İÇİN GIRIS KONUMUNDA
ANSELB=0
PORTB=0
'---------------------
AL   VAR Byte 
AL=0
TEMP VAR Byte 

//////////////////////////////////////////////////////////
Pause 100 ' 100 ms AÇILIŞ GECİKMESİ

FRQ  VAR BYTE   'FREKANS AYARLAMADA KULLANILACAK PR2 DEĞERİ
DUTY VAR BYTE  'GENLİK AYARLAMADA KULLANILACAK DUTY DEĞERİ


BASLA:

  
If AL=14 Then 
Toggle PORTA.0
al=0
endif

If AL=15 Then 
Toggle PORTA.1
al=0
endif       
       
GOTO BASLA       
  
'*******************KESME****************************
INT:
    Context Save
    GIE=0
    HSerIn 5,ATLA, [Wait("DNM"),AL]
ATLA:    
    TEMP=RCREG 
    GIE=1
    Context Restore
End


Ayrıca üstteki kodun kesme kısmını anlamadım ETE hocam.

ete

Bende anlamadım kesme kısmını PBP da o komutlar yok. Bu olsa olsa Proton kodu dur.
Ne yapmaya çalıştığınıda anlamadım. Konu bir frekans elde etmek iken usart konusuna dalmış oluyorsun.
O işlemci öncelikle 16Mhzde çalışmalı PLL açılınca da 64 Mhzde çalışacaktır. 32 Mhz de PLL açılırsa işlemci 128 Mhzde çalışmaya zorlanırki bu seçenekleri dahilinde değil o işlemcinin.Dolayısıyla 16Mhz'i bulman gerekir.

Ete

. Kağan

#13
Şimdi anlatayım hocam.
Nextion hmi ekran kullanıyorum. Bu ekranın tx çıkışından frekans ve duty için değerler gönderiyorum. Pic'in rx bacağından bu değerleri anlık olarak alıp frekans ve duty değerlerini değiştirmek için çalışıyorum.

Frekans konusuna gelince; PLL ENABLED olunca seçilen frekansı 4 ile çarpıyor  diye datasheette okudum sanki. O nedenle 8 mhz seçmeye çalışmıştım.
DEFINE OSC 32        'KRİSTAL FREKANSI
satırını kullanmadan
OSCCON =%11110010  '4x PLL Is enabled, 1110=8 MHz or 32 MHz HF, 1x = Internal oscillator block    "8x4=32MHz"

 sadece bu satır ile frekansı ayarlayabilirmiyim?


ete


Yanlızca bu satırı kullanarak işlemci frekansını ayarlayabilirsin.
7 nolu bit PLL yi aktive ediyor. "1" olmalı.
32Mhz işlemci frekansına ulaşmak istiyor isen OSCCON=%11110000 şeklinde verilmeli.

Ete

Powered by EzPortal