/**
	AD9850-628v1.cpp
	Firmware pour piloter un circuit DDS : AD9850
	avec un AVR atmega2560
**/

/*
	Ce fichier source "AD9850-628v1.cpp" est libre, vous pouvez le redistribuer et/ou le modifier selon
	les termes de la Licence Publique Générale GNU.

	Silicium628 - avril 2026
*/

#include <Arduino.h>
#include "AD9850-ESP32.h"

#define bitSet(value, bit) ((value) |= (1UL << (bit)))  // 1UL signifie la valeur 1 au format Unsigned Long (32 bits)
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

// Constructeur
AD9850::AD9850() { }



void AD9850::reset()
{
 	//delayMicroseconds(100);
	delay(1);
	digitalWrite(AD_RESET, HIGH);
	//delayMicroseconds(100);	
	delay(10);
	digitalWrite(AD_RESET, LOW); 
	//delayMicroseconds(100);
	delay(10);
}



void AD9850::impulse_clk_W()
{
 	delayMicroseconds(5);
	//delay(1);
	digitalWrite(AD_WCL, HIGH);
 	delayMicroseconds(5);
	//delay(1);
	digitalWrite(AD_WCL, LOW);
 	delayMicroseconds(5);
	//delay(1);
}


void AD9850::impulse_FQ_U()
{
	delayMicroseconds(5);
	//delay(1);
	digitalWrite(AD_FQU, HIGH);
	delayMicroseconds(5);
	//delay(1);
	digitalWrite(AD_FQU, LOW);
	delayMicroseconds(5);
	//delay(1);
	
}



/***********************************************************************
f_out = FTW x CLKIN / 2³² nous dit le datasheet
en en déduit :

FTW = f_out * 2³² / CLKIN
ici CLKIN = 125MHz / 2 = 62.5 MHz
125MHZ c'est la fréquence du quartz
cette fréquence est /2 en interne

FTW = f_out * (2³² / 62.5E6 ) = 68.71947674 x f_out

************************************************************************/

void AD9850::calcul_FTW()
{
	float y;
	y = 6.871947674 * f_out;
	FTW = (uint32_t) y;
	
}



void AD9850::out_F(uint32_t f_out_i)  // le paramètre f_out_i est = à la fréquence en 1/10 Hz c.a.d à 10x fréquence en Hz, ce qui permet une précision du 1/10 Hz
{
// cette fonction envoie 40 bits vers AD9850; voir le datasheet
	f_out = f_out_i;
	calcul_FTW();
	
	uint8_t n;

//envoi de la frequence
  uint32_t masque;
  phase =0;

	masque = 1;
	for (n=0;  n<= 31; n++)   // on sort le LSB (W0) en premier
	{
		masque += masque;	// revient à x2 le masque le '1' se deplacant de droite a gauche, 32 bits en tout
		if ( (FTW & masque) != 0) { digitalWrite(AD_D7, HIGH); } else { digitalWrite(AD_D7, LOW); }
		impulse_clk_W();
	}
	
	digitalWrite(AD_D7, LOW);	// (W32 toujours = 0)
	impulse_clk_W();

	digitalWrite(AD_D7, LOW);	// (W33 toujours = 0)
	impulse_clk_W();

	digitalWrite(AD_D7, LOW);	// (W34 = Power-Down = 0)
	impulse_clk_W();

// envoi de la phase (5 bits)

  for (n=0;  n<=4; n++)    // on sort le LSB (W35) en premier et le MSB en dernier.
	{
		masque = (1 << n);
		if (phase & masque) { digitalWrite(AD_D7, HIGH); } else { digitalWrite(AD_D7, LOW); }

		impulse_clk_W();
	}
	impulse_FQ_U();
}




