implementaci on de un generador de funciones arbitrarias ... · de senales,~ entre los que se halla...
TRANSCRIPT
Implementacion de un generador de funciones arbitrarias con
FPGA
Matias Risaro y Marcelo Luda
22 de diciembre de 2014
Resumen
En el presente trabajo se detalla la construccion de un generador de funciones arbitrariasdigital de dos canales, utilizando una placa FPGA y electronica de conversion digital-analogica.Se desarrollo una interfaz serie para definir la frecuencia de trabajo y cargar los datos de lasfunciones arbitrarias. Ademas el dispositivo construido puede sincronizarse a una funcion TTLde referencia a traves de un PLL digital disenado. Se incluye el diseno de la electronica deconversion, la descripcion en bloques del diseno FPGA y los ASM de los algoritmos principalesimplementados.
1. Introduccion
Un generador de funciones es un dispositivo que permite generar senales de tension que varıande forma periodica en funcion del tiempo. Es un elemento basico de laboratorios de fısica y devarias ingenierıas en general. En particular, la generacion de funciones arbitrarias permite extendersus aplicaciones. Ademas, poder sincronzar una senal generada a una senal de referencia permiteimplementar tecnicas de medicion de alta precision, como el lock-in, o hacer analisis espectrales deotras senales.
En el siguiente informe se detalla el desarrollo de un generador de funciones arbitrarias conresolucion en tension de 8 bits y en tiempo de 6 bits, con una frecuencia maxima de f = 156kHz.Este dispositivo se implementa utilizando una placa de desarrollo Nexys-3 y un DAC AD7545 de 12bits. El diseno permite controlar el generador desde un ordenador a traves de una interfaz UART,pudiendo establecer la forma de la funcion de onda para dos canales diferentes y la frecuencia deoperacion. Dicha frecuencia tambien puede ser definida con una senal externa de referencia de tipoTTL. Para ello se implemento un modulo Phase Locked Loop (PLL) de deteccion de frecuencia yfase.
1.1. Generador de Funciones
Un generador de funciones es un dispositivo capaz generar senales electricas periodicas enel tiempo. Son utilizados generalmente para probar otros dispositivos electronicos y para reali-zar analisis espectrales. Las funciones de onda mas utilizadas son las ondas senoidales, las ondascuadradas y las triangulares. Estas funciones se pueden construir utilizando elementos totalmenteanalogicos a partir de un oscilador electronico de referencia, elementos que componen los generado-res de funciones mas basicos del mercado. Los generadores de funciones mas sofisticados sintetizanla funcion de onda mediante procesamiento de senales digitales (DSP) y luego utilizan un conversordigital analogico (DAC) para producir una senal analogica. Esto permite ampliar la variedad deformas de onda y se los conoce como AWG (Arbitrary Waveform Generator)
Un DAC es un dispositivo electronico capaz de convertir un dato de senal digital en senales detension analogica. Dichos dispositivos son alimentados con una tension de referencia, Vcc (tıpica-mente 5 V), y generan una tension continua proporcional al dato que se le ingresa. Un DAC de7 bits alimentado con 5 V, por ejemplo, discretiza en 128 valores las tensiones entre 0 y 5 Volts.Si se carga a la entrada el numero 0100000, que corresponde al numero decimal 64, a la salida seobtiene una tension continua de 2,5 V. El DAC que se utiliza en el presente trabajo es el AD7545,
1
que tiene una resolucion de 12 bits y un tiempo de respuesta de aproximadamente 100 ns. La cargade los datos se realiza en forma paralela, a traves de las 12 entradas que posee. En la figura 1 semuestra un esquema de las conexiones del AD7545.
19
16
17
20
1
2
3
18
AD7545 R
RFB
OUT 1
AGND
VDD
DGND
DB11–DB0(PINS 4–15)
12
12
12-BITMULTIPLYING DAC
INPUT DATA LATCHES
VREF
WR
CS
Figura 1: Esquema de E/S del DAC AD7545
La resolucion del AD7545 es de 12 bits, pero no se utiliza a su maxima resolucion. Se conectana tierra los 4 bits menos significativos y se tiene entonces un DAC de 8 bits, que nos permiteuna resolucion en tensiones de aproximadamente 2 mV. Esto es lo que se conoce como resolucionvertical de un generador de funciones.
Otra de las caracterısticas de un generador de funciones es la longitud de la forma de onda,que es la cantidad de puntos que definen la funcion a repetir periodicamente. En nuestro caso seopta por una longitud de 6 bits (64 puntos) para definir la funcion de onda. Cabe destacar que conesta eleccion, y considerando el tiempo de respuesta del DAC, se obtiene el mınimo perıodo quepuede tener la funcion de onda. Dicho perıodo es T = 100ns ∗ 64 = 6, 4µs, por lo tanto la maximafrecuencia a la que puede trabajar el generador de funciones es f = 1/T = 156kHz.
1.2. PLL
La sigla PLL (Phase-Locked Loop) se refiere a tecnica de control que permite sincronizar lafrecuencia y la fase de una senal generada por un oscilador controlable, a la de una senal de refe-rencia. Dicha tecnica representa un elemento basico para multiples aplicaciones en procesamientode senales, entre los que se halla la demodulacion de una senal de radio FM o la medicion de senalesdebiles por la tecnica de Lock-in.
La tecnica Lock-in permite hacer una analisis espectral de la respuesta de un sistema anteuna excitacion periodica. Para ello se utiliza una senal de referencia con la misma frecuencia yfase que la senal excitadora, normalmente generada bajo la norma TTL (onda cuadrada de 0 a5V). La tecnica de lock-in consiste en generar funciones de seno y coseno sincornizadas a la senalde referencia con un PLL, multiplicarlas por la senal de respuesta del sistema y filtrarlas con unfiltro pasa bajos. Con este procedimiento se obtiene una tension de salida, correspondiente a loscoeficientes de la serie de Fourier de la senal de respuesta del sistema.
Un PLL analogico consiste en un detector de fase con un filtro pasa bajos y un VCO (VoltageControlled Oscillator) vinculados en forma realimentada como muestra la figura 2. La salida delfiltro es una tension de error, que da cuenta de la diferencia entre la frecuencia de referencia yla del VCO. En este trabajo se implemento un PLL digital que puede lockearse a senales TTLhaciendo deteccion de flancos e induciendo la frecuencia de la senal de referencia.
2
Figura 2: Esquema de un PLL analogico
2. Implementacion en FPGA
El dispositivo fue desarrollado sobre una placa FPGA de desarrollo Nexys-3 programada enVerilog. A continuacion se realiza un analisis de la estructura modular de esta implementacion.
En la figura 3 se detallan las entradas y salidas del dispositivo y los perifericos asociados. Seincluye una interfaz de comunicacion con el ordenador (pines tx y rx), la senal de entrada signal
para la referencia, los bus de datos JC y JD para comunicacion con los DAC, algunas salidas parael control del display de siete segmentos (an y seg) y algunas entradas para el control de variablesinternas (NTau, PC_o_PLL y sw_mem). Se incluye una salida extra jb para debugging que sirve parausar de trigger externo en el osciloscopio al visualizar las senales de salida de los DAC.
rx
tx
Ntau[2]
PC_o_PLL
sw_mem
signal
JC[8]
JD[8]
jb
an[4]
seg[8]
main
Figura 3: Modulo principal del proyecto
Las principales partes del diagrama de bloques interno del generador de funciones se muestranen la figura 4. Cada una de las salidas que controla un DAC esta asociada a un modulo de memoria(memoria A y memoria B). Dichos modulos consisten en un banco de registros con un puntero delectura que avanza cıclicamente y de a un paso, cada vez que llega un 1’b1 al pin change_val.Ademas cuenta con una interfaz de escritura compuesta por las entradas mem_reset, mem_wr ymem_wr_dat. El modulo divisor_tau es un divisor de frecuencia programable, implementado conun contador de ciclos de reloj (10ns) y se reinicia cada vez que llega al valor freq emitiendo untick en la salida. Este modulo alimenta las entradas change_val que hacen avanzar el puntero delectura de las memorias.
El valor de freq es seleccionado entre cfreq o dfreq, dependiendo del valor del switch PC_o_PLL.En el primer estado la frecuencia se define con la interfaz UART, mientras que en el otro se calculala frecuencia de la senal de referencia con el modulo PLL. Es un valor de 32bit y los 16 bits massignificativos se muestran en valor hexadecimal utilizando el display de siete segmentos.
3
mem_reset
rd_val[8]
memoria A
mem_wr
mem_wr_dat[8]
change_val
rd_reset
mem_reset
rd_val[8]
memoria B
mem_wr
mem_wr_dat[8]
change_val
rd_reset
rx freq[32]UART
tx phase[32]
mem_reset
mem_wr
mem_wr_dat[8]
selector_mem
sw_mem
selector
PC_o_PLL
cfreq[32]
dfreq[32]
freq[32] freq[32]tick
divisor_tau
hex2seg
hex2seg
[31:28]
[27:24]
hex2seg[23:20]
hex2seg[19:16]
an[4]
disp_mux
seg[8]
Figura 4: Estructura de modulos del generador de funciones
El modulo UART, ademas de implementar la comunicacion con el ordenador incluye la interfazde escritura de las memorias. El switch sw_mem determina que memoria se esta programando enun instante dado. Tambien posee dos registros internos de 32 bits para guardar la informacion decfreq y phase que se le envıa desde el ordenador.
2.1. Banco de memoria para funciones arbitrarias
El modulo de memoria (figura 5) consiste en un banco de 64 registros de 8 bits. La unica salidaes rd_val que muestra el valor apuntado por el puntero rd_ptr en cada momento. En cada flancodel reloj en que el pin change_val esta en 1’b1 el puntero rd_ptr se incrementa en +1 y al llegara 64 vuelve a comenzar desde cero. De este modo, cada 64 ticks que llegan a change_val ocurreun periodo completo de la funcion de onda guardada en la memoria.
mem_reset
rd_val[8]
memoria
mem_wr
mem_wr_dat[8]
change_val
rd_reset
wr_ptr
rd_ptr
Figura 5: Modulo de memoria
Para llenar el contenido de la memoria se utiliza la interfaz de escritura mencionada en laseccion anterior. Cada vez que llega un tick a mem_wr se escribe el valor de mem_wr_dat en el registroapuntado por wr_ptr y se incrementa wr_ptr en +1. Cuando wr_ptr llega a 64 se deshabilita laescritura hasta que este vuelva a ser cero. El pin mem_reset sirve para reiniciar el puntero wr_ptr
a cero y habilitar nuevamente la escritura del banco completo.
4
2.2. Modulo UART modificado
Sobre la base del modulo UART proporcionado en el curso “Diseno de Sistemas con FPGA”DC-FCEN-UBA1 se programo un modulo de control que interpreta los caracteres enviados desdeun ordenador usando el protocolo RS-232. En la figura 6 se puede apreciar el diseno interno delmodulo modificado.
UART
rxdout[8]
uart_rx
rx_donestick
stick din[8]
uart_tx
tx_start
tx_done
tx
stick
baud_rate_gen
wrfifo_rx
wr_dat[8]
fifo_reset
empty
full
rd
rd_dat[8]
dinfifo_wr
uart_cpu
rx_tickfifo_wr_dat[8]
fifo_reset
fifo_empy
fifo_full
fifo_rd
fifo_rd_dat[8]
mem_wr
mem_wr_dat[8]
mem_reset
freq[32]
phase[32]
s_exito
s_fallo
r_data[8]
fifo_tx
empty
rd
wrw_data[8]
s_fallo
err_msg
msg_dat[8]
msg_tick s_exito
Figura 6: Modulo UART modificado para implementar el protocolo de control del dispositivo desdeun ordenador
El modulo uart_cpu es una FSM que procesa los caracteres que van llegando por rx e imple-menta diferentes algoritmos en funcion de ello. El principal se inicia con la llegada de un caracter’m’ cuando el FSM esta en estado idle. En ese caso, se reinicia el fifo_rx (con un tick en elpin fifo_reset) y los siguientes caracteres que lleguen se van a escribir directamente en el el fifohasta que este lleno (se active el pin fifo_full). El fifo tiene el mismo tamano que los modulos dememoria, por lo que se esta cargando un periodo completo de la funcion de onda a producir. Unavez lleno, el uart_cpu reinicia el modulo de memoria (con un tick en el pin mem_reset), lee de auno los registros del fifo y los escribe en el modulo de memoria utilizando la interfase de escrituraya descrita. Terminado el proceso de escritura, si no hubo errores, envıa un tick por s_exito quepermite enviar un caracter de confirmacion a traves del tx al ordenador.
En caso de que la FSM en estado idle reciba un caracter ’f’ o ’p’ en el bus din, el modulouart_cpu tomara los siguientes 4 bytes que lleguen y los guardara en el registro freq o phase
respectivamente. De este modo quedan cargados dos registros de 32 bits que sirven para fijar lafrecuencia de trabajo del generador de funciones (en el caso que la frecuencia se controla desde elordenador) y un valor que sirve para establecer una diferencia de fase entre la senal de referenciay la generada (en el caso donde se controla la frecuencia y la fase desde el PLL).
En la figura 7 se puede ver el diagrama ASM del FSM implementado por uart_cpu. No seincluye la rama de la escritura del valor de phase porque es equivalente al de freq.
1http://www.dc.uba.ar/materias/disfpga/2014/c2/descargas/UART.rar/view
5
reset_mem_f
rx_tick == 1
w_ptr_freq_next ← 2'b00
guardar1_f
w_en_freq_next ← 0
w_en_freq_next ← 1
F
T
w_en_freq_next ← 0
rx_tick == 1
w_ptr_freq_next ← 2'b01
guardar2_f
w_en_freq_next ← 0
w_en_freq_next ← 1
F
T
rx_tick == 1
w_ptr_freq_next ← 2'b10
guardar3_f
w_en_freq_next ← 0
w_en_freq_next ← 1
F
T
rx_tick == 1
w_ptr_freq_next ← 2'b11
guardar4_f
w_en_freq_next ← 0
w_en_freq_next ← 1
exito_f
F
T
idle
fifo_reset ← 0fifo_wr ← 0fif_rd ← 0
mem_reset ← 0mem_wr ← 0s_exito ← 0
fifo_full == 1
fifo_reset ← 1
fifo_reset ← 0fifo_wr ← rx_tick
mem_reset ← 1
din
s_exito ← 1fifo_rd ← 0mem_wr ← 0
reset_fifo_m
carga_fifo_m
reset_mem_m
fifo_rd ← 1mem_wr ← ~fifo_emptymem_reset ← 0
carga_mem_m
exito_m
'm'
F
T
~('m'|'p'|'f')
fifo_empty == 1
F
T
'f'
'p'
...
Figura 7: ASM del modulo
6
2.3. Sincronizacion en fase y frecuencia
Cuando el switch PC_o_PLL esta en 1’b1 el generador de funciones trabaja en una frecuenciacalculada a partir de la senal de referencia y con su fase lockeada a la esta senal. Para ello seimplementaron los tres modulos que se muestran en la figura 8.
signal fup_tick
flank_detector
fdw_tick
ftickfreq[32]
freq_detectorNtau[2]
dfreq[32]
PC_o_PLLfunc_reset
desfasadorftick
phase[32]
freq[32]
func_reset
Figura 8: Modulos que implementan el PLL
El modulo flank_detector es una maquina de estados con un flip-flop que detecta cambios enel valor de signal y envıa un tick por fup_tick cada vez que hay un flanco de subida y un tickpor fdw_tick cada vez que hay un flanco de bajada. Con una de estas dos salidas se alimentan losmodulos de freq_detector y desfasador.
El modulo freq_detector es un contador de ciclos de reloj que se reinicia cada vez que llegaun tick a ftick. Antes de reiniciarse guarda el ultimo valor, que representa el numero de ticks dereloj que entran en un perıodo de la senal. Debido a que este numero puede variar levemente entremedicion y medicion (por ruidos, jitter en la senal de referencia u otras fuentes de imprecision) seutilizo un algoritmo de integracion tipo “filtro pasa bajos” para actualizar el valor de freq. Enlugar de guardar directamente el valor q_reg relevado en cada medicion de flanco se guarda elvalor resultante de la formula (1).
freq next =q reg N + freq (256 −N)
256(1)
Con los switchs NTau se puede elegir que el valor N = 128, 64, 32, 16 segun se quiera convergeren pocos pasos a la frecuencia de relevada o en muchos pasos con una estabilidad mayor.
2.4. Electronica asociada
El dispositivo se completa con el desarrollo de la electronica de conversion digital-analogica dela senal de salida. Para ello se utilizo el DAC integrado AD7545, que funciona como una resistenciaprogramable, y un amplificador operacional (LF357) de salida para la adaptacion de impedancias.La eleccion del DAC radica en la disponibilidad de control por un bus directo de 12 cables, lo queevita la implementacion de algun protocolo de control como el I2C o el SPI. El LF357 fue elegidoen funcion de su gran ancho de banda, que permite operar el DAC a la maxima velocidad posible(100 ns). En la figura 9a se puede ver el esquema del circuito de conversion para un canal. En lafigura 9b se incluyo el diseno del circuito impreso utilizando dos canales de salida.
El circuito fue impreso en una placa PCB y se soldaron todos sus componentes para hacer laspruebas de generacion de funciones. Se utilizo una fuente partida de ±6V implementada a partirde una fuente de switching simple y un circuito a medida armado en una protoboard. Se armaronlos cables a medida para conectar la FPGA. Se puede ver una foto del dispositivo terminado en lafigura 10.
7
22-23-2031X3-1X3-2X3-3
V-
GND
V+
200
2k
33p
22-23-2021
AD7545123456789
10 11121314151617181920
LF3571234 5
678
SV
1
123456789101112
R1
R3
AE
S
C1
X1-1X1-2V-
GNDGND
GNDGNDGND
GND
V+ V+
V+
OUT1
OUT1 OUT
DB
5
DB
5
DB
6
DB
6
DB
7
DB
7
DB
8
DB
8
DB
9
DB
9
DB
10
DB
10
DB
11
DB
11
DB
4
DB
4
DB
3
DB
3
DB
2
DB
2
DB
1
DB
1
DB
0
DB
0
P19
P19
(a) Esquema para un canal
1
12
31
1
12
31
3
3
AD
7545
LF35
7
SV1
R1
R3C1
X3
AD
7545
_BIS
LF35
7_B
IS
C2
R2
SV2
R4
X1
X2
200
2k
33p
22-2
3-20
3133
p 200
2k
22-2
3-20
2122
-23-
2021
(b) Diseno impreso
Figura 9: Circuito de conversion digital-analogico para dos canales
Figura 10: Foto del circuito terminado que implementa los dos DAC
3. Caracterizacion y resultados
Para controlar el dispositivo se desarrollo un script en Python donde se definieron las funcionesmatematicas que el generador de funciones produce y las funciones necesarias para la comunicacion.En el apendice A se puede ver el codigo, disponible para ejecutar desde una consola IPhython.
En la figura 11 se pueden ver la funcion senoidal generada por el dispositivo relevada pormedio de un osciloscopio. Para bajas frecuencias la resolucion temporal del osciloscopio permitever los pasos de discretizacion. En la figura 12 se pueden apreciar diferentes funciones arbitrariasgeneradas con el dispositivo.
8
−10 −8 −6 −4 −2 0 2 4 6 8 10−6
−5
−4
−3
−2
−1
0
1
Tiempo (ms)
Te
ns
ión
(V
)Generador de funciones, Senoidal
(a) Baja frecuencia
−100 −80 −60 −40 −20 0 20 40 60 80 100−6
−5
−4
−3
−2
−1
0
1
Tiempo (us)
Ten
sió
n (
V)
Generador de funciones, Senoidal
(b) Alta frecuencia
Figura 11: Generacion de funcion senoidal a dos frecuencias diferentes.
−10 −8 −6 −4 −2 0 2 4 6 8 10−6
−5
−4
−3
−2
−1
0
1
Tiempo (ms)
Ten
siÃ
³n (
V)
Generador de funciones, Gauss
(a) Gaussiana
−25 −20 −15 −10 −5 0 5 10 15 20 25−6
−5
−4
−3
−2
−1
0
Tiempo (ms)
Ten
siÃ
³n (
V)
Generador de funciones, Rampa
(b) Rampa
−25 −20 −15 −10 −5 0 5 10 15 20 25−6
−5
−4
−3
−2
−1
0
1
Tiempo (ms)
Ten
siÃ
³n (
V)
Generador de funciones, Triangular
(c) Triangular
Figura 12: Generacion de funciones arbitrarias
Para caracterizar la precision en la generacion de la funciones se midio la dispersion en frecuenciamidiendo el jitter en el periodo de las funciones generadas. Para funciones senoidales la dispersionen diferentes frecuencias se puede ver en la tabla 1. Se incluyen otras funciones arbitrarias generadasen la tabla. Se puede ver que la dispersion hallada es del orden del ∼ 1/1000.
9
Funcion Frecuencia dispersionSeno lento 156.1 Hz 0.2 HzSeno medio 15.4 KHz 0.1 KHzSeno rapido 141.6 KHz 0.1 KHzGaussiana 15.4 KHz 0.1 KHzTriangular 156.3 KHz 0.6 KHzRampa 156.3 KHz 0.2 KHz
Tabla 1: Dispersiones en frecuencia para diferentes frecuencias y funciones generadas
Se pudo corroborar el funcionamiento del PLL sincronizando cada una de las funciones arbi-trarias generadas, a una senal cuadrada de referencia. La inferencia de la frecuencia de trabajodemostro una velocidad de adaptacion muy rapida, con tiempos del orden de 20 ciclos de reloj dela senal de referencia.
A modo de ejemplo, se probo la capacidad de generar funciones completamente arbitrariastratando de reproducir una imagen 2D arbitraria a partir de la generacion de las funciones co-rrespondientes a x(t) e y(t) en cada uno de los canales de salida. En la figura 13 se puede ver lapantalla del osciloscopio en modo xy representando una de las imagenes emuladas.
Figura 13: Ejemplo practico de la implementacion de funciones arbitrarias en dos canales si-multaneos
4. Conclusiones
La tecnologıa FPGA demostro ser perfectamente adecuada para la implementacion de un gene-rador de funciones arbitrarias digital. Las frecuencias logradas en este trabajo son suficientementealtas para su utilizacion en diversas aplicaciones de un laboratorio de fısica. Los lımites puedensuperarse utilizando electronica de alta velocidad y una placa FPGA de mayores prestaciones.
10
A. Programa de control en Python
# Control de generador de funciones en ipython
from numpy import *
from matplotlib.pyplot import *
import matplotlib.cm as cm
import Image
# Funcion para convertir un integer en un string de 4 bytes
def tau2str(tau):
t=uint32(tau)
cc=’’
for i in range (0,4):
cc=chr(mod(t,256))+cc
t=t/256
return cc
# Funcion para convertir una tira de numeros uint8 en chars
def array2str(fun):
ll=’’
for i in fun.tolist ():
ll=ll+chr(i)
return ll
# Abrimos el puerto Serie --------------
import serial
ser = serial.Serial(port=’/dev/ttyUSB2 ’,baudrate =19200)
# Configuramos frecuencia de operacion
freq =20000 # x10 ns entre punto y punto
cic=int (1/( freq*1e-8))
ciclos=tau2str(cic)
ser.write(’66’.decode(’hex’))
ser.write(ciclos)
# Generamos las funciones
xx=arange (0,64)
# Seno
fun= sin(xx*pi/32)
fun=fun -fun.min()
fun=fun/fun.max()*255
fsin=uint8(fun)
# Triangular
fun=abs(xx -32.)
fun=fun -fun.min()
fun=fun/fun.max()*255
ftrian=uint8(fun)
# Gaussiana
fun=exp(-((xx -32.) /8) **2)
fun=fun -fun.min()
fun=fun/fun.max()*255
fgauss=uint8(fun)
# Rampa
fun=xx
fun=fun -fun.min()
fun=fun/float(fun.max())*255
framp=uint8(fun)
# Batman
bat_x = array ([ 32, 52, 77, 69, 72, 88, 106, 112, 114, 122,
131, 140, 142, 146, 165, 183, 180, 176, 196, 214, 230, 241,
250, 255, 251, 244, 229, 218, 205, 211, 206, 193, 181, 173,
162, 152, 141, 133, 127, 120, 115, 105, 96, 86, 81, 70,
57, 47, 43, 46, 48, 31, 20, 8, 2, 0, 4, 10,
17, 22, 27, 31, 31, 31], dtype=uint8)
bat_y = array ([ 41, 24, 10, 38, 71, 90, 71, 32, 0, 26,
26, 0, 23, 71, 94, 65, 27, 9, 23, 37, 53, 71,
98, 130, 159, 186, 213, 231, 240, 206, 180, 180, 193, 207,
183, 180, 202, 227, 255,227, 207, 185, 177, 194, 204, 190,
178, 178, 198, 224, 237, 223, 206, 182, 157, 126, 95, 77,
65, 53, 49, 44, 44, 44], dtype=uint8)
# Comandos para comunicacion directa
def set_freq(ser ,freq):
ser.write(’f’+tau2str(freq))
def set_phase(ser ,phase):
ser.write(’p’+tau2str(phase))
def sext_fun(ser ,fun):
ser.write(’m’+array2str(fun))
control generador funciones.py
11