Commit b0d985a4 authored by Anders Wallin's avatar Anders Wallin

better DDS FTW set and get

parent 1c502780
......@@ -48,17 +48,64 @@ AD9912::DDS ddsB(SPI_SDIO, SPI_CSB_DDSB, SPI_SCLK, 1);
// PLL-object
ADF4350::PLL pll(SPI_SDIO, SPI_CSB_PLL, SPI_SCLK);
// Webserver
HTTPD::httpd* webserver = new HTTPD::httpd(&ddsA, &ddsB);
HTTPD::httpd* webserver = new HTTPD::httpd(&ddsA, &ddsB, &pll);
void init_pll(ADF4350::PLL* pll) {
delay(1000);
Serial.print("init_pll()\n");
pll->preset1(); // 10MHz input, 1 GHz DDS clock
delay(1000);
}
void init_DDS(AD9912::DDS* dds) {
delay(1000);
dds->reset();
delay(100);
int id = dds->read_id();
delay(20);
serial_printf("DDS id = %d\n", id);
delay(20);
dds->set_pd( AD9912::PD_HSTL | AD9912::PLL_PD); // no PLL!
delay(20);
dds->set_PLL_parameters(AD9912::VCO_AUTORANGE); // not required?
delay(20);
dds->update_registers();
delay(20);
int8_t f[6] = { (int8_t)0xc6, (int8_t)0x4b, (int8_t)0x37, (int8_t)0x89, (int8_t)0x41, (int8_t)0x00};
//int8_t fB[6] = { (int8_t)0xc6, (int8_t)0x4b, (int8_t)0x37, (int8_t)0x89, (int8_t)0x41, (int8_t)0x00};
serial_printf("set f = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", f[5],f[4],f[3],f[2],f[1],f[0] );
// 6-element array
dds->set_frequency(f);
delay(20);
//ddsB.set_frequency(f);
//delay(20);
int8_t fr[6];
int mask8 = 0x000000ff;
dds->get_frequency(fr);
delay(20);
//serial_printf("ftw_A = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", fr[5],fr[4],fr[3],fr[2],fr[1],fr[0] );
serial_printf("get ftw = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", fr[5] & mask8,fr[4] & mask8,fr[3] & mask8,fr[2] & mask8,fr[1] & mask8,(fr[0] & mask8) );
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
delay(1000);
Serial.print("initializing.\n");
delay(2000);
pll.preset1(); // 10MHz input, 1 GHz DDS clock
init_pll(&pll);
init_DDS(&ddsA);
init_DDS(&ddsB);
/*
delay(1000);
ddsA.reset();
delay(100);
......@@ -104,14 +151,17 @@ void setup() {
delay(20);
int8_t fr[6];
int mask8 = 0x000000ff;
ddsA.get_frequency(fr);
delay(20);
serial_printf("fr = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", fr[5],fr[4],fr[3],fr[2],fr[1],fr[0] );
//serial_printf("ftw_A = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", fr[5],fr[4],fr[3],fr[2],fr[1],fr[0] );
serial_printf("ftw_A = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", fr[5] & mask8,fr[4] & mask8,fr[3] & mask8,fr[2] & mask8,fr[1] & mask8,(fr[0] & mask8) );
ddsB.get_frequency(fr);
delay(20);
serial_printf("fr = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", fr[5],fr[4],fr[3],fr[2],fr[1],fr[0] );
serial_printf("ftw_B = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", fr[5] & mask8,fr[4] & mask8,fr[3] & mask8,fr[2] & mask8,fr[1] & mask8,(fr[0] & mask8) );
*/
delay(1000);
webserver->init();
delay(1000);
......
......@@ -47,10 +47,11 @@ class httpd {
public:
httpd(AD9912::DDS* ddsA, AD9912::DDS* ddsB){
httpd(AD9912::DDS* ddsA, AD9912::DDS* ddsB, ADF4350::PLL* pll) {
server = new EthernetServer(80); // (port 80 is default for HTTP):
_ddsA = ddsA;
_ddsB = ddsB;
_pll = pll;
}
~httpd(){
delete server;
......@@ -68,7 +69,7 @@ void init() {
Serial.println(dhcp_result);
#endif
server->begin();
Serial.print("MUX is at IP: ");
Serial.print("DDS is at IP: ");
Serial.println(Ethernet.localIP());
//_m1->init();
//_m2->init();
......@@ -164,19 +165,19 @@ void parse_command() {
}
// printout for debug
/*
for(int n = 0; n < index; n++) {
Serial.print("Token ");
Serial.print(n);
Serial.print(" ");
Serial.println(strings[n]);
}
*/
// URL request: http://192.168.1.18/DDS:0:FTW:00:11:22:33:44:55
// URL request: http://192.168.1.18/DDS:B:FTW:00:4b:37:89:41:f1
// Token 0 GET
// Token 1 DDS
// Token 2 0
// Token 2 B
// Token 3 FTW
// Token 4 00
// Token 5 11
......@@ -191,10 +192,13 @@ void parse_command() {
if (strcmp(strings[1], "DDS")==0 ) {
AD9912::DDS* dds;
uint8_t state;
if (strcmp(strings[2], "0") == 0) {
if (strcmp(strings[2], "A") == 0) {
dds = _ddsA;
} else if ( strcmp(strings[2], "1") == 0) {
} else if ( strcmp(strings[2], "B") == 0) {
dds = _ddsB;
} else if (strcmp(strings[2], "INIT")==0 ) {
_pll->preset1(); // initialize PLL
} else {
return;
}
......@@ -203,76 +207,101 @@ void parse_command() {
//Serial.print("MUX ");
//Serial.print(mux->get_id());
int8_t f[6];
f[0] = (int8_t) strtol( strings[4], NULL, 16 );
f[1] = (int8_t) strtol( strings[5], NULL, 16 );
f[2] = (int8_t) strtol( strings[6], NULL, 16 );
f[3] = (int8_t) strtol( strings[7], NULL, 16 );
f[4] = (int8_t) strtol( strings[8], NULL, 16 );
f[5] = (int8_t) strtol( strings[9], NULL, 16 );
Serial.print(" FTW ");
Serial.print( (uint) f[0] );
f[5] = (int8_t) strtol( strings[4], NULL, 16 );
f[4] = (int8_t) strtol( strings[5], NULL, 16 );
f[3] = (int8_t) strtol( strings[6], NULL, 16 );
f[2] = (int8_t) strtol( strings[7], NULL, 16 );
f[1] = (int8_t) strtol( strings[8], NULL, 16 );
f[0] = (int8_t) strtol( strings[9], NULL, 16 );
Serial.print("set FTW ");
//char tmp[128];
int mask8 = 0x000000ff;
//char_printf(tmp, "%02x", f[5] & mask8);
serial_printf("%02x %02x %02x %02x %02x %02x\n", f[5]&mask8,f[4]&mask8,f[3]&mask8,f[2]&mask8,f[1]&mask8,f[0]&mask8 );
/*
Serial.print( (uint) f[5] );
Serial.print(" ");
Serial.print( (uint) f[1] );
Serial.print(" ");
Serial.print( (int) f[2] );
Serial.print( (uint) f[4] );
Serial.print(" ");
Serial.print( (int) f[3] );
Serial.print(" ");
Serial.print( (int) f[4] );
Serial.print( (int) f[2] );
Serial.print(" ");
Serial.print( (int) f[5] );
Serial.print( (int) f[1] );
Serial.print(" ");
Serial.print( (int) f[0] );
Serial.print("\n");
*/
dds->set_frequency(f);
}
} // END if FTW
}
}
}
} // END if DDS
} // END if GET
} // parse_command()
void print_state(EthernetClient* client) {
// www-browser sees this output.
client->print("DDS:");
client->print( _ddsA->get_id() );
client->print( "A" );
client->print(":FTW:");
int8_t f[6]={0,0,0,0,0,0};
_ddsA->get_frequency(f);
client->print( (int)f[0] );
char tmp[128];
int mask8 = 0x000000ff;
char_printf(tmp, "%02x", f[5] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[1] );
char_printf(tmp, "%02x", f[4] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[2] );
char_printf(tmp, "%02x", f[3] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[3] );
char_printf(tmp, "%02x", f[2] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[4] );
char_printf(tmp, "%02x", f[1] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[5] );
char_printf(tmp, "%02x", f[0] & mask8);
client->print( tmp );
client->println("<BR>");
serial_printf("fA = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", (int8_t)f[5],f[4],f[3],f[2],f[1],(int8_t)f[0] );
serial_printf("get_f_A = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",f[5]&mask8,f[4]&mask8,f[3]&mask8,f[2]&mask8,f[1]&mask8,f[0]&mask8 );
client->print("DDS:");
client->print( _ddsB->get_id() );
client->print( "B" );
client->print(":FTW:");
_ddsB->get_frequency(f);
client->print( (int)f[0] );
char_printf(tmp, "%02x", f[5] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[1] );
char_printf(tmp, "%02x", f[4] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[2] );
char_printf(tmp, "%02x", f[3] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[3] );
char_printf(tmp, "%02x", f[2] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[4] );
char_printf(tmp, "%02x", f[1] & mask8);
client->print( tmp );
client->print( ":" );
client->print( (int)f[5] );
char_printf(tmp, "%02x", f[0] & mask8);
client->print( tmp );
client->println("<BR>");
serial_printf("fB = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", f[5],f[4],f[3],f[2],f[1],f[0] );
serial_printf("get_f_B = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", f[5]&mask8,f[4]&mask8,f[3]&mask8,f[2]&mask8,f[1]&mask8,f[0]&mask8 );
} // print_state
......@@ -281,6 +310,7 @@ private:
String _httpRequest;
AD9912::DDS* _ddsA;
AD9912::DDS* _ddsB;
ADF4350::PLL* _pll;
}; // end class
} // end namespace
#endif
......@@ -10,6 +10,7 @@
#include "Arduino.h"
#include "spibitbang.h"
#include "adf4350.h"
#include "printf_wrapper.h"
//#include "encoderlib.h"
//#include "FiniteStateMachine.h"
......@@ -35,6 +36,7 @@ public:
// 10MHz ref in 1GHz out operation preset
void preset1(){
serial_printf("PLL preset1()\n");
spi->write32_int32( ADF4350::preset1_R5 );
spi->write32_int32( ADF4350::preset1_R4 );
spi->write32_int32( ADF4350::preset1_R3 );
......@@ -46,6 +48,7 @@ public:
// 100MHz ref in 1GHz out operation preset
void preset2(){
serial_printf("PLL preset2()\n");
spi->write32_int32( ADF4350::preset2_R5 );
spi->write32_int32( ADF4350::preset2_R4 );
spi->write32_int32( ADF4350::preset2_R3 );
......
......@@ -20,5 +20,14 @@ void serial_printf(char *fmt, ... ){
Serial.print(tmp);
}
void char_printf(char *tmp, char *fmt, ... ){
//char tmp[128]; // resulting string limited to 128 chars
va_list args;
va_start (args, fmt );
vsnprintf(tmp, 128, fmt, args);
va_end (args);
//Serial.print(tmp);
//return tmp;
}
#endif // __PRINTF_WRAPPER_H__
......@@ -13,6 +13,8 @@ import numpy
import requests
import time
import ustep
def ftw_dds(f_hz):
""" return AD9912 1GHz SYSCLK FTW
"""
......@@ -49,11 +51,11 @@ f1 = hz_dds(FTW1)
print( ["%02x"%dig for dig in split_hex(FTW1)], " ", "%.12f"%f1 )
for n in range(1):
f = 400e6+2e6*n
FTW1 = int( ftw_dds(f ) )
f = 123e6+2e6*n
FTW1 = ustep.ftw_dds( f )
hexs = split_hex(FTW1)
ftw_string = "%02x:%02x:%02x:%02x:%02x:%02x" % (hexs[0],hexs[1],hexs[2],hexs[3],hexs[4],hexs[5] )
r = requests.get('http://192.168.1.18/DDS:0:FTW:%s' % ftw_string)
print(f)
ftw_string = "%02x:%02x:%02x:%02x:%02x:%02x" % (hexs[5],hexs[4],hexs[3],hexs[2],hexs[1],hexs[0] )
r = requests.get('http://192.168.1.18/DDS:A:FTW:%s' % ftw_string)
print("%.6f %s" % (f, ftw_string))
time.sleep(1)
......@@ -77,7 +77,7 @@ def f2_from_y(y18, ftw1, N_div=8.0, M_div=1024.0):
ftw2i = round_to_even(ftw2)
return int(ftw2i)
def set_DDS(ftw, DDS=0, IP="192.168.1.18"):
def set_DDS(ftw, DDS="A", IP="192.168.1.18"):
""" use HTTP to set DDS frequency to given frequency tuning word
DDS index can be 0 or 1
"""
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment