Megkésve bár, de végre felrakom a kódokat is.
Nem gondolom hogy sok meglepetést tartalmaznak. Egy egyszerű függvény a DAC8531 programozására:
void SetFreqDAC(WORD_VAL freq)
{
char i;
LATAbits.LATA2 = 0; // CLK Low
LATAbits.LATA1 = 0; // SYNC Low
#ifdef __18CXX
_asm NOP NOP _endasm
#endif
// write PD1 and PD0
for (i = 0; i < 8; i++)
{
LATAbits.LATA2 = 1; // Rising edge LATAbits.LATA0 = 0;
LATAbits.LATA2 = 0; // Falling edge
}
// write level data
for (i = 0; i < 16; i++)
{
LATAbits.LATA2 = 1; // Rising edge LATAbits.LATA0 = freq.bits.b15;
freq.Val *= 2; // rotate left
LATAbits.LATA2 = 0; // Falling edge
}
#ifdef __18CXX
_asm NOP NOP _endasm
#endif
LATAbits.LATA1 = 1; // SYNC High
LATAbits.LATA2 = 1; // CLK High
}
És kicsit kibővült a TMR1 megszakítás, minden frekvencia mérés után beállítja a DAC-t:
void FreqDAC_AutoHoldFreq(DWORD_VAL measured)
{
if (AutoHoldFreq.Val != 0x00) // AutoHold Functionality {
FreqError.Val = AutoHoldFreq.Val - measured.Val; ActualFreq.Val -= (FreqError.Val >> 2); SetFreqDAC(ActualFreq); // Set new freq
}
}
Ez a frekvencia különbséget néggyel osztja, és ez alapján állítja utána a DAC-t, így nem lesz túl ideges.
A Windows-os kódot nem részletezem, csak egy új függvényt tartalmaz, ami az auto hold frekvenciát beállítja.
Az órajelgenerátor kimenő frekvenciájának állandósága nagyban függ attól, hogy a VCO mennyire mászik el. A melegedés miatti, lassú mászásokat a DAC korrigálni tudja, de próbapanelen az áramkör összeszed annyi zajt, hogy a kimenő frekvencia folyton fel-le változzon. Ez 1MHz frekvencián olyan 100 Hz elmozdulásokat jelent. Ha ennél pontosabbra van szükség, akkor a következő megoldások közül lehet választani:
- Jó NYÁK tervvel valószínüleg a zaj nagy része eltűnik
- A VCO bemenetére lehet egy szűrőt tenni, hogy a nagyobb frekvenciás komponensek ne jussanak rá
- A VCO tartományát meg lehet emelni 10MHz-re, és azt visszaosztani 10-el az 1MHz-hez. így a zaj is jelentősen csökkenni fog.
Jó berhelést mindenkinek.