Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
M
Microstepper
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Projects
Microstepper
Commits
b0d985a4
Commit
b0d985a4
authored
Sep 22, 2021
by
Anders Wallin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
better DDS FTW set and get
parent
1c502780
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
150 additions
and
56 deletions
+150
-56
dds_sw.ino
dds_sw/dds_sw.ino
+58
-8
httpd.h
dds_sw/httpd.h
+72
-42
plllib.h
dds_sw/plllib.h
+3
-0
printf_wrapper.h
dds_sw/printf_wrapper.h
+9
-0
ad9912_frequency.py
scripts/ad9912_frequency.py
+7
-5
ustep.py
scripts/ustep.py
+1
-1
No files found.
dds_sw/dds_sw.ino
View file @
b0d985a4
...
...
@@ -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
(
"f
r = 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("f
tw_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
);
...
...
dds_sw/httpd.h
View file @
b0d985a4
...
...
@@ -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
dds_sw/plllib.h
View file @
b0d985a4
...
...
@@ -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
);
...
...
dds_sw/printf_wrapper.h
View file @
b0d985a4
...
...
@@ -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__
scripts/ad9912_frequency.py
View file @
b0d985a4
...
...
@@ -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
(
[
"
%02
x"
%
dig
for
dig
in
split_hex
(
FTW1
)],
" "
,
"
%.12
f"
%
f1
)
for
n
in
range
(
1
):
f
=
400
e6
+
2e6
*
n
FTW1
=
int
(
ftw_dds
(
f
)
)
f
=
123
e6
+
2e6
*
n
FTW1
=
ustep
.
ftw_dds
(
f
)
hexs
=
split_hex
(
FTW1
)
ftw_string
=
"
%02
x:
%02
x:
%02
x:
%02
x:
%02
x:
%02
x"
%
(
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
=
"
%02
x:
%02
x:
%02
x:
%02
x:
%02
x:
%02
x"
%
(
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
(
"
%.6
f
%
s"
%
(
f
,
ftw_string
)
)
time
.
sleep
(
1
)
scripts/ustep.py
View file @
b0d985a4
...
...
@@ -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
"""
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment