AD9833 sinüs sinyal üreteci.

Başlatan onurinci, 02 Kasım 2025, 21:11:41

onurinci

AD9833 modüllerini ebay açık iken almıştım, bir makalede okuduğum bir şeyi deneyip sağlam olduğunu kanıtlanıştım, SPI bağlantıyı kesip enerji verirseniz, modül size 250 Hz Sinüs üretiyor. bir müddet sonra lazım oldu hep Arduino örnekleri var. ben ısınamadım. oturup elimde bol bulunan 12F675'e bir şeyler karaladım, ilk enerji verdiğimde hemen çalıştı 1.4 MHz sinyali tertemiz gördüm. ertesi günü çalışmadığını fark ettim, bir modülüm daha vardı o da çalışmıyordu. Logic analizörü SPI yoluna bağladım veri kusursuz geliyordu. sonuçta 5 enerji verişte bir kere çalışıyordu, nette ararken XC8 ile C ile derlenmiş bir Hex dosyası bulabildim. hemen yükledim hiçbir sorun yoktu bingo her seferinde kusursuz başlama..

benim uydurduğum kod..
' AD9833 Master Clock 1.4 MHz


DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
#LIST_12F675
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG

TRISIO= %00000000 : GPIO= 0 : CMCON= 7 : ANSEL= 0 : ADCON0= 0 : VRCON.7= 0
OPTION_REG.7= 0 : WPU= %00000000
   
'SYMBOL DAT= GPIO.2              ; DDS Pin Serial Data     for DATA   Pin 7
'SYMBOL CLK= GPIO.4              ; DDS Pin W CLK           for CLOCK  Pin 6
'SYMBOL ENA= GPIO.5 : LOW ENA    ; DDS Pin FQ UD           for ENABLE Pin 5

 Pause 200                  ' Let Everything Power Up


DAT  VAR GPIO.2              ; Data Signal is   ON GPI0.0, Pin 
CLK  VAR GPIO.4              ; Clock Signal is  ON GPIO.1, Pin  
ENA  VAR GPIO.5 : LOW ENA    ; Frequency Update ON GPIO.2, Pin  

DEFINE SHIFT_PAUSEUS 2       ; DATA Speed

                            ' Register Start Sending  Train
                            ' CONTROL SET RESET, FREQ0 ACTIVE ,
                            ' Frequency LSB LOW  FREQUENCY WORD ,
                            ' Frequency MSB HIGH FREQUENCY WORD ,
                            ' PHASE REGISTER ,
                            ' PRESET CLEAR RESET .
                                                         
' 1 KHz Sine                             
    SHIFTOUT DAT, CLK, 1, [$21,$00,$60,$42,$43,$95,$C0,$00,$20,$00]

' Last Line $20,$00 Sine , $20,$02 Triangle , $20,$28 Square

    ENA= 1 : PauseUS 10 : ENA= 0   ' Now pulse the Frequency Update Pin
  
Start: ; *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*

      GOTO Start
simulasyon ektedir üst kısımda 16 bitlik kayıtçılardan basit bir SPI izleyici yapmaya çalıştım.


formülü kaynak olarak Analog Devicesin interaktif sayfasından aldım.kesir ve kusur var.
https://tools.analog.com/en/simdds/?fc=12.5M&harmonicDB=-50&mult=1&part=AD9833&rso=111111&sclock=25M&tof=10M&useFilters=0

biraz daha arayınca daha sağlıklı veriler sunan başka bir sayfaya rastladım..https://stompville.co.uk/AD9833.php

sonuçta fikirlere açığım. bu bir radyo alıcısı içinde çalışacağı için data'yı atıp uyutacağım.onu hallederim..yani kısır döngüde işi garantiye almak için sürekli data göndermeyecek. zira japon aşmış bu bariyeri bir kez atıp uyuyor.. iyi çalışmalar diliyorum..

aRci

Bilgisizliğimi çok görmeden birşey sormam gerek burada kararsız bir çalışmadan bahsetmeniz benim aklıma ilk açılışta veri yollarının polarmaları ad9833 de hatalı veri iletişimine sebep olduğunu düşünüyorum mümkünse açılışta tek sefer de değilde birkaç sefer verinizi tekrar gönderin ilk gönderileni algılamayarak kararsız çalışmaya sebep oluyor olabilir.
proteus dosya açamadım sürüm farkından dolayı.

onurinci

haklısınız belki bir kaç kez yollamak işi düzeltecektir.ama neticede bu bir zaaf olacaktır. örnek kodu proton'a çevirdiğinizde. Proton     
SHOut DAT,CLK,MsbFirst_H,[CR0\16,FR00\16,FR01\16,Ph0\16,CR1\16]

16 bitlik sayıları kullandığından daha kullanışlı. ben Picbasic Pro'nun bu Shiftout komutunda bir bug'mu var merak ediyorum.yada ShiftOut komutu yerine BitBang yapı dahamı güvenli.onlarıda merak ediyorum.

aRci

şu testi yapın ilk açılışta pin uclarındaki voltajı ölçmeyi deneyim buradan hangı ucun açılışta polarının ne olfuğunu görmiş olursunuz. genel olarak haberleşme pinleri artı polarda bekler diye biliyorum.ilk açılışa pinlerinize artı polar vererek haberleşmeyi başlatabilirsiniz.

ete

AD9833 data sheet'ini okuyup ne gibi bir sorun olabilir diye bakayım dedim ama data sheet çok detaylı epeyce zaman istiyor. Ancak biraz daha kestirmeden gidip en azından heberleşme datalarının doğrumu yanlışmı verildiğine bir bakayım dedim.
Gördüğüm kadarı ile registerler aslında 16 şar bitlik. Bu data lar verilirken de 16 bit birden verilmesi gerekiyor. Örnekde bunları 8 bitlik data şeklinde veriyorsun. Shiftout komutunun özelliği olarak 16 bitlik değişken kullanılıp "\16" şeklinde bir eklenti ile 16 bitlik veri yollanması sağlanabilir.
Diğer bir sıkıntı çıkartabilecek durum ise önce LSBFirst mü yoksa MSBFirst mü yollanacak bunun tespiti önemlidir. Bir bakışta data sheet de bunun açıklamasını göremedim.
Sizde göremiyorsanız önce SHIFTOUT Data,CLK,0 şeklinde mode verilerek LSBFirst olarak bu bilgiler yollanıp duruma bakılmalıdır. Olmuyor ise bu seferde 0 yer ine1 verilerek MSBFirst olarak yollama yapılmalıdır. He riki mod da CLK low da kalır ve bekler. Data sheet bit aktırımının CLK sinyalinin LOW a düşerken yapıldığını söylüyor. Bu durumda belkide CLK bilgi aktarımından sonra HIGH da beklemeli diye düşünürüm.
Bunu sağlamak için mode parametresi 4 veya 5 şeklinde verilmelidir. 4 verildiğinde LSBFirst gönderim yapılır. 5 verildiğinde ise MSBFirst gönderim yapılmış olur.
Tabiiki frekansın belirli bir değere set edilmesi işine bakmadım. Bunu doğru yaptığınızı düşünüyorum.
Yine sonuç alınmaz ise bu konuda araştırma yapmak uygun olacaktır.
Son bir şey daha ekleyeyim.
DEFINE SHIFT_PAUSEUS 2   komut satırındaki 2 değeri bana çok düşük geliyor. Genelde bu parametre (hızı yavaşlatmak adına 50 veya 100 (us) olarak kullanılır. Bana kalırsa bunuda değer değiştirerek denemekte yarar görüyorum.

Ete

 

onurinci

Hocam selam, Basic Pro'da \16 verilebildiğini bilmiyordum.ben bunu Proton komutu diye

 hatırlıyordum, Datasheet de sanki bir yerde MSB gördüm. emin olamadım , bunun Eval bord'unun

win10 yazılımını indirdim Help dosyasında MSB First yazıyordu. bencede çok hızlı atıyor bundan anlamıyor diye düşünüyorum, denemeler yapıp bilgi vereceğim....iyi günler..

ete

Onur,
Komut formatına bakarsan daha iyi anlarsın.

SHIFTOUT DataPin,ClockPin,Mode,[Var{\Bits}...]

Bits dediği şey kaç bit ise oraya onu yazıyorsun. 16 bit yollamak için oraya 16 yazman yeterli

Ete

onurinci

forum merhaba. ShiftOut komutunun Bits seçeneğini unutmuşum,ETE hocamın ikazı ile o kısımları tekrar düzenledim, sonuç yine aynı belki ben Datasheet'i yanlış yorumluyorum.

' AD9833 Master Clock 1.4 MHz

DEFINE OSC 4
DEFINE OSCCAL_1K 1
#CONFIG
#LIST_12F675
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BODEN_OFF
#ENDCONFIG

TRISIO= %00000000 : GPIO= 0 : CMCON= 7 : ANSEL= 0 : ADCON0= 0 : VRCON.7= 0
OPTION_REG.7= 0 : WPU= %00000000
   
'SYMBOL DAT= GPIO.2              ; DDS Pin Serial Data     for DATA   Pin 7
'SYMBOL CLK= GPIO.4              ; DDS Pin W CLK           for CLOCK  Pin 6
'SYMBOL ENA= GPIO.5 : LOW ENA    ; DDS Pin FQ UD           for ENABLE Pin 5

 Pause 1000                  ' Let Everything Power Up


DAT  VAR GPIO.2              ; Data Signal is   ON GPI0.0, Pin 
CLK  VAR GPIO.4              ; Clock Signal is  ON GPIO.1, Pin  
ENA  VAR GPIO.5 : LOW ENA    ; Frequency Update ON GPIO.2, Pin  

DEFINE SHIFT_PAUSEUS 50      ; DATA Speed

                            ' Register Start Sending  Train
                            ' CONTROL SET RESET, FREQ0 ACTIVE ,
                            ' Frequency LSB LOW  FREQUENCY WORD ,
                            ' Frequency MSB HIGH FREQUENCY WORD ,
                            ' PHASE REGISTER ,
                            ' PRESET CLEAR RESET .
                                                      
' 1.4 MHz Sine                             
'    SHIFTOUT DAT, CLK, 1, [$2100\16]
'    SHIFTOUT DAT, CLK, 1, [$6042\16]
'    SHIFTOUT DAT, CLK, 1, [$4395\16]
'    SHIFTOUT DAT, CLK, 1, [$C000\16]
'    SHIFTOUT DAT, CLK, 1, [$2000\16]

 SHIFTOUT DAT, CLK, 1, [$2100\16,$6042\16,$4395\16,$C000\16,$2000\16]
' Last Line $20,$00 Sine , $20,$02 Triangle , $20,$28 Square

    ENA= 1 : PauseUS 10 : ENA= 0   ' Now pulse the Frequency Update Pin
  
Start: ; *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*

      GOTO Start

bu gün farklı bir gelişme oldu. Japon yazarın Hex dosyası verdiği Blog'da mailime nazikçe dönüş yaptı, XC8 ile yazılmış C dosyasını verdi bu dosyanın Hex'i kusursuz çalışmakta, ama ben C 'den anlamadığım için , eksik yada ters yaptığım yeri bulamıyorum. ( bu arada benim yazılımda çalışıyor açılışta garip bir frekanstan stabil olarak çalışıyor, 5 kez enerjiyi kesip verirsem benim yazdığım formül sağlıklıca çalışıyor. fark ettimki bu çipin içinde reset registerleri falan var.ben sorunumu Asyalı dostum sayesinde hallettim, ama aklım buna takıldı nedennnn ?

XC8 C Source
/*
 *  1.4 MHz SSB Exciter Modulator
 */

// PIC12F675 Configuration Bit Settings

// CONFIG1
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR master clear reset bit disabled
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#include <xc.h>
#include <pic12f675.h>

typedef unsigned char		BYTE;
typedef unsigned short int	WORD;
typedef unsigned long int	DWORD;
typedef enum _BOOL { FALSE = 0, TRUE }	BOOL;

typedef union {
    struct {
		BYTE			:8;
		BYTE			:4;
		BYTE D12		:1;
		BYTE D13		:1;
		BYTE D14		:1;
		BYTE D15		:1;
	};
    struct {
		BYTE 			:1;
		BYTE MODE		:1;
		BYTE 			:1;
		BYTE DIV2		:1;
		BYTE 			:1;
		BYTE OPBITEN	:1;
		BYTE SLEEP12	:1;
		BYTE SLEEP1		:1;
		BYTE RESET		:1;
		BYTE 			:1;
		BYTE PSEL		:1;
		BYTE FSEL		:1;
		BYTE HLB		:1;
		BYTE B28		:1;
		BYTE			:1;
		BYTE			:1;
	};
	WORD wValue;
} AD9833reg_t;

#define AD9833_SYNC		GPIO5
#define AD9833_SCLK		GPIO4
#define AD9833_SDAT		GPIO2

//=================================================================

static void AD9833_Reset(void);
static void AD9833_SetFreq(DWORD dwVal);
static void AD9833_SetPhase(WORD wVal);
static void AD9833_Start(BOOL bSquare);
static void AD9833_Send(WORD wData);

// FOSC There is no need to wait because the
#define DelayUs(x)
#define DelayNs(x)

static AD9833reg_t AD9833;

//=================================================================

// Main
void main(void)
{
	// Port Initialization
	GPIO = 0;
	
	AD9833_SYNC = 1;
	AD9833_SCLK = 1;
	AD9833_SDAT = 0;
    
    ADCON0 = 0x00;       // Internal ADC OFF
    ANSEL  = 0x00;       // All Analog selections pins are assigned as digital I/O
    CMCON  = 0x07;		 // Shut off the Comparator
    VRCON  = 0x00;       // Shut off the Voltage Reference
    TRISIO = 0x08;       // set as output except GP3
    GPIO   = 0x00;       // set all pins Low  

	
	AD9833_Reset();

	// Frequency Settings
	  AD9833_SetFreq(0x0E56042); // 1.4 MHz Calculation Eddystone Orion 5500 ###### Entry Frequency Here ######
	//AD9833_SetFreq(0x51EB852); // 8 MHz
	//AD9833_SetFreq(0x28F5C29); // 4 MHz
	//AD9833_SetFreq(0x147AE14); // 2 MHz
	//AD9833_SetFreq(0x0A3D70A); // 1 MHz    
	//AD9833_SetFreq(0x04A8C15); // 455 KHz
	
	// Start output
	AD9833_Start(FALSE);
	
	for(;;);

	return;
}

//  AD9833 Initialization
static void AD9833_Reset(void)
{
	AD9833.wValue = 0;

	AD9833.B28 = 1;     // Always write 28bit
	AD9833.RESET = 1;
	AD9833.SLEEP1 = 1;  // Internal clock disabled
	AD9833.SLEEP12 = 1; // DAC powered down
	
	AD9833_Send(AD9833.wValue);
}

// AD9833 Frequency Settings
static void AD9833_SetFreq(DWORD dwVal)
{
	AD9833reg_t Reg1, Reg2;

	Reg1.wValue = dwVal & 0x3FFF;
	Reg2.wValue = dwVal >> 14;
	
	// FREQ0/1 Use alternately
	if (AD9833.FSEL == 0)
	{
		// FREQ1 Write to
		AD9833.FSEL = 1;
		Reg1.D15 = 1;
		Reg2.D15 = 1;
	}
	else
	{
		// FREQ0 Write to
		AD9833.FSEL = 0;
		Reg1.D14 = 1;
		Reg2.D14 = 1;
	}

	AD9833_Send(Reg1.wValue);
	AD9833_Send(Reg2.wValue);

	// FREQ0/1 switching
	AD9833_Send(AD9833.wValue);
}

// AD9833 Phase Setting
static void AD9833_SetPhase(WORD wVal)
{
	AD9833reg_t Reg;
	Reg.wValue = wVal;

	// Always PHASE0 Write to
	Reg.D15 = 1;
	Reg.D14 = 1;
	Reg.D13 = 0;

	AD9833_Send(Reg.wValue);
}

// AD9833 Action Start
static void AD9833_Start(BOOL bSquare)
{
	AD9833.RESET = 0;
	AD9833.SLEEP1 = 0;
	AD9833.SLEEP12 = 0;
	
	if (bSquare)
	{
		AD9833.SLEEP12 = 1;
		AD9833.OPBITEN = 1;
		AD9833.DIV2 = 1;
	}
	
	AD9833_Send(AD9833.wValue);
}

// AD9833 Send to
static void AD9833_Send(WORD wData)
{
	AD9833_SYNC = 0;

	int nCount = 0;
	do
	{
		AD9833_SDAT = (wData & 0x8000)? 1 : 0;
		DelayNs(5); // t7, t9
		
		AD9833_SCLK = 0;
		DelayNs(10);      // t6
		AD9833_SCLK = 1;
		DelayNs(5);      // t5-t9
		
		wData <<= 1;
	}
	while (++nCount < 16);
	
	AD9833_SYNC = 1;
	DelayNs(5);          // t11
}


sevgiler.... (simulasyon ektedir..

ete

Onur,
Data sheet'e bakılır ise Bilgi yollama işi FSCYNC pini LOW iken yapılıyor ve MSBFirst yollama yapılıyor. CLK ise yollama sonrası HIGH da bekliyor. Bu durumda kullanman gereken shiftout komut formatı şöyle olmalı,
SHIFTOUT DAT, CLK, 5, [$21,$00,$60,$42,$40,$e5,$C0,$00,$20,$00]

ENA= 0 : PauseUS 1 : ENA= 1  


Frekans hesabı ile ilgili formül , Frq_reg=(fout * 2^28)/25Mhz. Senin frekans değerlerini yerine koyar isek,
Frq_Reg=(1,4Mhz * 268.435.456)/25=15.032.385 ve hex olarak $00e5 6041 elde edilir.
Bu noktada DB15 ve DB14 bitlerinin 0 veya 1 olmaları ile ilgili bazı şeyler okudum ki bunlar sonucu etkileyen faktörler olmalı. Ancak detaylı bir açıklama bulamadım. Ancak AN107 dokümanda bir örnek frekans hesabı verilmiş (400 Hz lik bir sinyal elde edebilmek için) ve burada Register0 değeri $0000 $10c7 olarak bulunmuş. Ancak register değerleri $0000 yerine $4000 ve $10c7 yerine $50c7 olarak alınmış.Bu dökümadan her bir değerin açıklamasıda mevcut.
Bu açıklamada özellikle $1047 nin $5047 ye çevrilmesindeki gerekçe DB15=0 ve DB14=1 yapılarak Register0 adresi verildiği belirtilmiş. Bizim hesapladığımız değerde zaten DB15=0 ve DB14=1 olduğundan bir değişim yapmamış oluyoruz.
Register0'ın MSB tarafında ise bizim hesapta $00E5 çıkmış oldu. Bu değeri benzer mantıkla DB14 bitini 1 yapar isek sonuç $40E5 olacaktır. BU durumda registere yazılacak değer bu olmalıdır diye mantık yürütüp programı çalıştırdığımda yaklaşık 200Khz lik bir sinyal görüyorum. MSB registerini $40E5 değilde $00E5 şeklinde kullanır isem 769Khz lik bir sinyal okuyorum. Bu durumda hesabın yanlış olduğu kesinleşmiş oluyor. Data sheet de register bitlerinin fonksiyonları anlatılmış. Ama uzun ve sakin kafa ile inceleyip sonuca ulaşmak gerek sanırım.
Bu arada senin Japon'un sinyaline de bakmak lazım acab o tam 1,4Mhz verebiliyormu??
Bana vermiyor gibi geldi. Acaba yanlışmı değerlendirdim.

Ete

onurinci

hocam galiba doğru izi yakaladınız. AD9833 normal operasyon frekansı 25 mhz. simulasyon dosyası 25 MHz'de çalıştıramadım , ama PEPE bir forumda araya nokta koyarak enazından 2.5 MHz de reaksiyon gözlemleniyor yazmış. simulasyonda o objeye tıkladığımızda frekansı değiştirebiliyoruz. doğru bir örnek bulamadığımda First MSB 'mi yoksa LSB 'mi yollanacak Sheet'ten anlıyamadım. 5 ayrı parametre yollanıyor.bunlar bir önceliğe sahipmi onuda anlamadım. Japon'un verdiği dosyayı işlemciye attığımda .Frekans metrede. 1.400.040 Hz geliyor.sanırım bu asya modüllerinin 25 MHz SMD osilatörlerinden kaynaklanıyor, doğru çalışması için bir kaç bit eksiltilir diye düşünüyorum. bu gün saydım ilk açılışta 8.182 ve 15.360 MHz'lerden açılıyor. 5 kez enerjiyi kesip verirsem tam 1.400,000 Hz geliyor çok'ta temiz bir sinyal var. aslında buraya kadar kendim becerip sizden bir adc portundan i en düşük Nible ile oynamanızı talep edecektim, yazılım'la falan oynamadan +- 300 Hz falan bir trimpot ile oynatabilirsiniz diye düşünmüştüm, verdiğiniz önergeyi yarın deneyeceğim..

ete

#10
SOnunda bu işin hesabının nasıl yapıldığını anladım. 1,4Mhz için örnek hesap vererek anlatayım daha iyi anlaşılacaktır.

1,4Mhz için Register hesabı,  Freq_reg=(1,4Mhz * 2^28)/25

Freq_reg=(1,4 * 268435456)/25 = 15.032.386 bu frekans register değerimiz oluyor ve 32 bitlik bir sayı olması gerekiyor yada bu sayıyı binary olarak yazıp 32 bite sol tarafına sıfır ekleyerek yapıyoruz.

Binary karşılığı  %000000001110010101 10000001000010
Bu sayının LSB tarafının ilk 14 bitini alıyoruz =  %0010000001000010 (başına 00 ekleyerek 16 bite tamamladık)
bu sayının 15 ve 14 cü bitlerine 01 ekliyoruz = %0110000001000010
Bulduğumuz sayının Hex karşılığı = $6042 olup bu yerleştirilecek birinci sayımız oluyor

Şimdi hesaplanan sayının MSB tarafını alıyoruz= %0000001110010101
Bu sayınında 15 ve 14 cü bitlerini %01 yapıyoruz (ekliyoruz),
%0100001110010101 elde ediyoruz bu sayının hex karşılığı $4395 buda yerleşecek ikinci sayı oluyor.

O halde registerlere yerleşecek sayı dizisi,
$21,$00,$60,$42,$43,$95,$c0,$00,$20,$00 oluyor.
Şimdi bu diziyi kullanarak verdiğimde peryodu 1,40 us olan bir sinyal elde ediyorum .
Şimdi sende dene program ilişiktedir.
Sonucu bildir lütfen.
Ete

onurinci

Hocam müjdeli haber , klavyenize sağlık, sorunsuz çalıştı. hocam hiç acelem yok ikinci bir ihtiyacım daha doğdu.

 bunu bir alıcıya (SSB) Single Side Band  çalışan bunlarıda insan sesini net duyabilmemiz için ( BFO ) Beat Frequency Oscillatör olarak kullanacağım.

 Clarifier denilen 0...5 Volt bir pot ile merkez frekanstan 1 KHz aşağı 1 KHz yukarı ayar yapabilen bir devre .Frekans bit'inin en küçük hanelerini bir pot ile değiştirmek istiyorum.

ama bir zorluk var tanımladığım bir port örnek GPIO.5 normalde 1'de ben bunu 0'a çektiğimde ADC değerini pass geçecek .

işlemciye verilecek olan frekansa geri dönecek. eski ivedikten alınma cihazları hayata döndürmeye çalışıyorum. bu isteğim ile bir ara boş vaktinizde ilgilenebilirseniz. çok sevinirim, sevgiler..

ete

Onur , tam olarak ne istediğini anlamadım maalesef.
Anladığım tek şey girilen bir frekans değerini 1khz lik adımlar ile aşağı veya yukarı kaydırabilmeyi istediğin. Mademki bu işte bir pot kullanılacak bu işi diyelimki 1K lık pot ile yapıyoruz. Bunun orta noktasını sıfır kabul edebiliriz. Yani orta uç 500ohm noktasında ki bu net bir değer olmayacağı için adc karşılığı 500-520 aralığını sıfır noktsı kabul edebiliriz. Pot bu konumda ise bir ekleme yada çıkartma yapmaz. Potu sola çevirdiğimizde (çıkartma yapması için) 0-500 aralığını dilimlemek gerekir. Bu iş için de senin pot ile bir yönde kaç adet 1Khz lik değer çıkartacağına karar vermen lazım. Başka bir deyişle 0-500 ohm aralığında pot ana frekanstan kaç Khz (maksimum değer olarak) eksiltecektir. Aynı değeri artış tarafında da kullanacağız. Örnek verecek olursak 0-500 aralığını 10 kademe olarak belirlersek toplamda 10Khzlik bir değişim yaratır. 20 kademe yaparsak 20Khz lik bir değişim yaratacaktır. İyice düşün ve 0-500 aralığında kaç kademe veya kaç adet 1Khz lik çıkartım yapılacak bana söyle lütfen.
Frekans hesabı aslında 32 bit matematik gerektiriyor. Normal şartlarda 12F-16F serisi bu işi yapamıyor. Yalnızca 18F serisi LONG değişkeni kullanarak yapabiliyor. Bu hesabı pic'e yaptırmanın bir yolunu bulmam gerekiyor. Hiç bir yol bulamaz isem N-Bit_Matematik kütüphanesini kullanarak işlem yaptırmaya çalışacağım.

Ete

onurinci

hcam eksik anlatmışım. örnek sabit olarak Pic'e 455 KHz attık .

 Pot 10 Hz adımlar ile toplamda sağa 1 yada 1.5 khz gezinecek . sola'da 10 Hz adımlarla 1 yada 1.5 khz gezinecek.

ortada ise Pic'e attığımız 455 KHz değerini korusun. ama bir Pin'i TX yani gönderme Pin'i yapacağız.

pot'u nerede bırakırsak bırakalım , bu pin 455 KHz'lik değere yani pic'e ilk atığımız Frekans dönecek. TX butonunu bıraktığımız zaman potun o an pot'u nerede bıraktıysak o konuma geri dönecek.

çok basite indirgersek bu TX pini ayarlı yada sabit moda sokacak. nacizane ben şöyle düşündüm, bir frekans yollama paketi var dikkat etmişsinizdir.

bir gurup çok yüksek frekansa diğer gurup ise daha küçük frekanslara hükmediyor.bunları VAR olarak atabiliyoruz. yüksek hesaba kayan noktaya falan gerek olmaması diye düşünüyorum.

kısaca sadece 4 bitlik bir Nible ile oynayacağız.

ete

#14
BU işle haftaya uğraşabilirim. Ancak pot kullanılması işi bira zora sokacak gibi. EMin değilim programlama esnasında belli olur. Çünki pot konumuna göre sabit değer üretir. Ancak TX butonu biraz yardımcı olacak gibi. Butona basmadan pot ayarlanıp butona basınca o andaki pot değerine bağlı bir değer üretip gönderecek ama potu bırakır bırakmaz asıl frekansına geri dönecek yani bu frekansı tekrar gönderecek bu şekilde anladım.
Burada esas olan 10 hzlik farkın registerler değerinde yarattığı farkı hesaplayıp ona göre sayılarla oynamak lazım.                   

Ete

Powered by EzPortal
▲