Generador de señales en hoja de cálculo.

Tiempo de lectura: 15 minutos.

Equivalente en Word: 25 páginas.

Nivel de hoja de cálculo:  Intermedio

Nivel de matemáticas: Intermedio. Trigonometría. 

Concimientos necesarios: electrónica analógica y digital. 


Descripción general

Vamos a implementar un modelo matemático teórico en condiciones ideales,  es decir,  funcionamiento básico de un laboratorio de electrónica en Excel. En Excel o en cualquier editor de hoja de cálculo que tengáis. Por ejemplo Libre Office Calc. 

En sucesivos posts vamos a publicar mejoras a este modelo, corrección de bugs etc. 

Este modelo lo vamos a ir adaptando para generar un modelo real en condiciones reales de trabajo,  simulando mecanismos de control y seguridad,  sobrecargas,  roturas,  fallos,  averías. 


La electrónica,  especialmente la electrónica analógica,  es una disciplina que se basa en funciones lineales.  Son funciones continuas en el tiempo que adquieren valores de una manera progresiva. 

El laboratorio va a constar de instrumentación típica de laboratorio. 


Generador de señales, voltímetro,  osciloscopio, fuente de alimentación. 

Todos los modelos van  a comenzar siendo teóricos,  es decir,  condiciones ideales, para irlos dotando de características reales de funcionamiento,  como tensiones y corrientes máximas,  atenuaciones,  ruido, averías, fallos,  etc.

Comenzamos con el generador de señal. 


Diagrama de bloques

Vamos a implementar el modelo matemático básico de un generador de señales.  Puede generar tensión continua, alterna, y  modos de funcionamiento especiales. 

Primero dividimos el trabajo en dos partes.  El panel de control y la matriz de cálculo. 

Interfaces


    1. Panel de control HMI. 
Si habéis visto un generador de señales, dispone de unos controles fuera del dispositivo donde se regula la amplitud de la señal,  el tipo de señal, offset, frecuencia, y controles adicionales como mecanismos para generar análisis em frecuencia. Va a consistir en una serie de cuadros de texto con los valores a introducir.

En futuras versiones del modelo,  implementaremos un interfaz con un bus que permita el control de los componentes y los instrumentos del laboratorio de una manera automatizada. 

Matriz de cálculo. 


La matriz de cálculo va a simular la electrónica del generador. Como Excel es una matriz de cálculo,  vamos a emplear las celdas verticales como eje de tiempos,  y las horizontales para crear los diferentes bloques que irán componiendo las señales pasándolas de unos a otros, que entre todos forman la matriz. Son los siguientes. 


Se pueden generar señales  como sinusoide,  impulsos, pulsos,   señal cuadrada, señal triangular y diente de sierra. También añadiremos una opción para trabajar con señales de ruido configurable. 

Implementación

Lo primero que hacemos es abrir una hoja de cálculo nueva. A la página la llamamos Generador-Matriz. Creamos otra página que se llame Generador-Panel y otra que se llame Generador-Bus.  Seleccionamos la página Generador-Matriz.  Dejamos un espacio arriba para un panel de control. Unas 50 filas. 

Son filas para configurar que serán el interfaz con la página de control  y futuras ampliaciones a un bus de control.  Si lo diseñamos como si  se tratara de un sistema real, finalmente podremos trabajar de manera más sencilla. Los interfaces engloban dos subsistemas, y agrupan señales tanto de entrada como de salida. 


 Luego podemos ir insertando si necesitamos más con la opción insertar filas.  

Precaución: Al insertar filas mediante el botón Insertar Filas,  la aplicación ajusta las fórmulas y relaciones de las celdas inferiores o laterales para que conserven las fórmulas guardadas,  sin embargo  no ajusta el código de las macros. Por lo que si has hecho una macro con código de manera manual, tienes que reescribir el código para que se propaguen los cambios manualmente. Lo mejor es que tengas todas las variables y constantes referenciadas desde celdas conocidas, para que puedas asegurarte de que las cifras que estás usando son las correctas.

En este panel van a estar todas las variables del sistema que luego podemos exportar a una pantalla separada. 

Encendido/Apagado

Creamos un selector de encendido/apagado.  Todo el instrumento funcionará con respecto a este selector. Es un campo 1/0 en la celda S17. la celda R17 contendrá el texto Conexión/Desconexión. 

Las celdas M4:M12 contendrán los dígitos 1,2,3,4,5,6,7,8,9 y las columnas de N4:N112 los textos siguientes.  

M
N
1
Sinusoidal
2
Tren de Pulsos
3
Cuadrada
4
Diente de Sierra
5
Triangular
6
Tren de Impulsos
7
Tren de impulsos bipolares
8
Ruido Aleatorio
9
Binario

Columna activa

Como el fichero va a tener cientos de miles de registros, para acelerar las representaciones y los cálculos, vamos a añadir a cada columna, un registro de actividad,  de tal manera,  que si la columna está activa en ese momento, muestra los valores,  y si no está activa,  no los representa. 
Comenzamos con las columnas 
W17 = S18
Es decir,  si el generador está activo, la base de tiempos está funcionando. 
X17 =  S18

Zona de control de la Matriz. 

La Matriz tiene una zona de control, en la parte izquierda. Ahí guardamos la información que nos llegue por el bus de comunicaciones y por el panel manual. De estas dos informaciones sacaremos una única selección de datos que configurarán el generador.

La zona de control son los parámetros que llegan de los diferentes orígenes de control. 

La zona de información es información aclaratoria para depuración,  manejo de la  matriz y para mostrarla en gráficas como información sobre la señal que se está leyendo. 

En la parte superior, por ejemplo en la columna E ponemos las etiquetas de las principales variables del generador. Son : 

Matriz
Mandos
Configuracion Guardada
1
Origen
1
Fichero
Resultados.xlsx
Total Muestras
10000
Muestras
1000
Inicio
5000
Amplitud
14
Frecuencia
8000
Invertir
0
Tipo de señal
1
Ciclo de trabajo
70
Offset
-5
Desfase º
0
Desfase segundos
0
Desfase muestras
0
Conexión/desconexión
1
Base de tiempos
0,0000001
Vobulador
0
Frecuencia Inicial
10000
Frecuencia Máxima
50000


Damos formato a estas cifras, porque ver 0,000001segundos  no es lo mismo que ver 1µs,  y ver 100kHz,  es más claro que ver 100000

A cada cifra le aplicamos su formato. 

En Generador Panel. 


Al lado de cada celda con una unidad, pegamos la siguiente celda

Las que tengan tiempos en segundos. F12,  F13, F16,  F17,  I12,  I13,  I16,  I17,  L12,  L143, L16,  L17. 

Copiamos este texto en la celda C9

=SI(O(Y(B19<0,001;B19>0,000001);B19=0,000001);TRUNCAR((B19*1000000);1)&" µs ";SI(O(Y(B19<1;B19>0,001);B19=0,001);TRUNCAR((B19*1000);1) & "ms";SI(O(Y(B19<0,000001;B19>0,000000001);B19=0,0000000001);TRUNCAR((B19*1000000000);1) & "ns";SI(Y(B19<1000;B19>1);TRUNCAR((B19*1);1) & "seg";""))))

Ahora seleccionamos la celda  C9 completa haciendo click sobre ella, copiamos  y  pegamos  donde tengamos que representar unidades de segundos. 


Las que tengan frecuencias en Herzios. F4,  I4,  L4

Copiamos este texto en la celda C11

=SI(O(Y(B11>1000;B11<1000000);B11=1000);TRUNCAR((B11/1000);1)&"  KHz ";SI(O(Y(B11<1000;B11>0);B11=0);TRUNCAR((B11*1);1) & " Hz";SI(O(Y(B11>1000000;B11<1000000000);B11=1000000);TRUNCAR((B11/1000000);1) & " MHz";SI(Y(B11>1000000000;B11<1000000000000);TRUNCAR((B11/1000000000);1) & " GHz";""))))

Ahora seleccionamos la celda  C11 completa haciendo click sobre ella, copiamos  y  pegamos  donde tengamos que representar unidades de Herzios


Las que tengan tensiones en Voltios, F3,  I3,  L3. 

Copiamos y pegamos en la celda C3 este texto. 

=SI(O(Y(B2<0,001;B2>0,000001);B2=0,000001);TRUNCAR((B2*1000000);2)&" µV ";SI(O(Y(B2<1;B2>0,001);B2=0,001);TRUNCAR((B2*1000);2) & "mV";SI(O(Y(B2<0,000001;B2>0,000000001);B2=0,0000000001);TRUNCAR((B2*1000000000);2) & "nV";SI(Y(B2<1000;B2>1);TRUNCAR((B2*1);2) & "V";""))))

Ahora seleccionamos la celda C3 completa haciendo click sobre ella, copiamos y pegamos allá donde tengamos que representar Tensiones.


Bloques de oscilación

A continuación trabajamos sobre los bloques de oscilación, la base del generador.  Todo generador de señal tiene un oscilador.

Generalmente construiremos  las señales entre -1 y 1 ó entre 0 y 1, para luego adaptarlas en amplitud. 


Base de tiempos 

Generamos una base de tiempos. En la columna W,  creamos 10.000 celdas con 10.000 registros que contengan cada uno una unidad más que el registro anterior.  Además, lo referenciamos al registro de encendido/apagado.  

En la casilla W19 escribimos el valor 0. 

En la  casilla W20,  

=SI(S$18=1;W19+1;"")

En la columna de al lado, referenciamos los tiempos con respecto a una base de tiempos que vamos a crear. 

Donde B25 es la celda que contiene la fracción de unidad que emplearemos como tiempo. Fijamos B25 a 0,0000001 segundos por ejemplo. 

Para crear la base de tiempos, escribimos el valor 0 en la celda X19,  y en la X20 el siguiente texto. 

=SI(X$17=1;E$37+X19;"")


Copiamos y pegamos en toda la columna 10.000 veces desde la casilla 21 hasta la 10021.  

No hace falta escribirlo 10.000 veces.  Puedes copiar y pegar un rango,  o arrastrar desde la celda superior. 

Para no arrastrar,  es mejor copiar y pegar todas las celdas a la vez.  De esta manera es mucho más rápido. Pulsas la celda que contiene la fórmula,  haces scroll hacia la última fila,  pulsas la celda donde quieres que acabe y pegas.  

Con 10.000 muestras y 0,001 segundos tendremos 10 segundos de representación, por ejemplo. 

Cuando necesitemos representar señales de 1MHz, ajustamos la base de tiempos a 0,000001. Y si necesitamos 1 THz,  ajustamos a 0,000000000001. Como es un generador teórico, podemos alcanzar frecuencias en un margen muy amplio de funcionamiento.     

En la parte de arriba, por ejemplo en A17 grabamos =COUNT(An:Am) donde An y Am es donde empieza y acaban los registros. Por ejemplo Count(A20:A10019) con 10.000 registros comenzando en el registro nº 20.  

Hay que tener en cuenta que estamos trabajando en dos dominios a la vez,  analógico y digital,  por lo que hay que fijarse bien en los detalles de las conversiones . 

En la  columna Y  guardamos la frecuencia,  que será un valor que luego podemos emplear para aumentar o disminuir conforme queramos por ejemplo modular en FM. Así que en una celda del panel de control guardamos la frecuencia,  y la copiamos en todas las celdas de la tercera columna.  

En la celda Y19 escribimos  =SI(E38=1;E39;E28). Donde E39 contiene la frecuencia de inicio de vobulación,  y E38 la frecuencia estática de funcionamiento si E38=0.

En la columna Y15,  insertamos el paso de vobulación,  que es la diferencia entre frecuencias de una muestra a a la siguiente. Este valor lo calculamos así =(E40-E39)/A17  donde E40 y E39 son respectivamente la frecuencia  máxima y mínima de vobulación y A17 son las muestras en total.   

En la celda Y20  y sucesivas pegamos =SI(Y$17=1;SI(E$38=0;"";Y19+Y$15)).  

Esta columna nos servirá cuando el instrumento tenga analizador de frecuencia, que podemos mover la frecuencia entre diferentes valores. 

En la celda Z,  podemos guardar el período, que es el inverso de la frecuencia. 

En la celda AA guardamos el período de la señal en muestras,  que es el período de la señal dividido por  la base de tiempos,  que tenemos guardado en la celda B25. 


Generador de ciclos

Una parte muy importante de un generador es el generador de ciclos digital.  Está basado en una función que aumenta correlativamente hasta alcanzar el período de la señal,  volviendo a reiniciar. Esta acción la realiza hasta el final de las muestras. 

La ecuación es la siguiente. 

En la celdas AK19,  registramos la muestra por la que comenzamos. Cuando haya un avance o un retroceso en el tiempo para crear un desfase,  esta celda representará la muestra inicial. 

=SI(E35=0;E35+1;SI(E35>0;AA19-E35+1;AA19-ABS(E35)+1))

Donde un ciclo comienza en la muestra 1 y acaba en la muestra final, que dependiendo de su frecuencia,  estará calculado en la celda AA19,  funcionando sin vovulador. 

Sinusoide pura

Ahora creamos un mecanismo que nos permita avanzar entre 0 y 2?  a la velocidad que queramos.  La velocidad va a depender de nuestra base de tiempos y de las muestras por segundo que queramos realizar. 



Para dibujar una función seno o coseno, movemos un fasor a velocidad constante entre 0 y 2PI
Como tiene que ser una velocidad programable, para poder cambiar la frecuencia,  hacemos un contador de secuencia variable, tomando como referencia la base de tiempos y la frecuencia que queremos mostrar. Si tenemos 1KHz y 10.000 muestras por ciclo,  entonces contamos entre 1 y 10.000. Si tenemos 1KHz y 10 muestras por ciclo,  contamos entre 1 y 10,  y reiniciamos el contador. 

El producto del contador por la fracción (2PI/muestras por ciclo) dará como resultado una vuelta a la circunferencia. 




En la celda  AV12 escribimos 

=2*PI() 

que da el valor 6,28318530717959


En la
 celda AU20 escribimos: 

=SI(AU$17=1;AK20*AV20;"")

En la celda AV20 escribimos

=SI(AV$17=1;SI(E$38=1;AV$12/AA20;AV$12/E$74);"")

copiamos y pegamos hasta las respectivas celdas nº 10019.

 

En la celda BW20 escribimos

=SI(BW$17=1;SI(E$28<>0;(SENO(AU20));"");"")


Aunque en los generadores no hay pantalla,  vamos a añadir una ventana de depuración,  en la que vamos a ir viendo si nos vamos equivocando, para poder corregirlo. Ahora mismo la estructura del generador está hecha.  Solo queda añadirle las señales . 

Si hemos seguido los pasos, lo que vemos es :





Así conseguimos el adelanto positivo o negativo transformado en muestras.  El fasor comenzará el seno en la posición que le diga la muestra,  en lugar de hacerlo en cero. 

Así conseguimos este efecto. 





Consejo: Al actualizar muchos datos desde una página diferente a la página que queremos modificar, el sistema no tiene que representar los cambios, por lo que solo necesita calcular. De esta manera los cambios son más rápidos.


Ahora vamos a implementar el resto de funciones. Cuadrada,  triangular,  diente de sierra, tren de pulsos, tren de impulsos y señal de ruido aleatorio. 


Tren de impulsos. 

Tenemos un contador en la celda Q que genera ciclos conforme a nuestro criterio. Tantos ciclos como queramos representar con la base de tiempos que tenemos. 

Para generar señales no sinusoidales,  se suele tener en cuenta un ciclo de trabajo, que es el tiempo que la señal está en la parte superior y el tiempo que la señal está en la parte inferior. 


Lo ponemos como parámetro.  un 50, que podemos cambiar por 25, 30, 60 ó 90. Cualquier número entre 1 y 99. 

Ahora creamos una columna con los las muestras por ciclo que mantenemos el pulso arriba, y la diferencia con los ciclos totales,  será el tiempo que el pulso está abajo. 

H51

=G51*E$7/100

I51

=G51-H51


Hay que tener en cuenta que cara vez que añadimos una columna con datos el fichero aumenta 80kB de tamaño, por lo que si no ahorramos columnas en breve nos juntamos con 10MB de tamaño. 


Tenemos en dos columnas,  el tiempo alto y el tiempo bajo que son configurables. 

Ahora en la celda 

X52

=SI(Q51<(H51);1;0)


Y ya tenemos la señal tren de pulsos configurable



Señal cuadrada. 

La señal cuadrada se distingue de la señal en tren de pulsos en que tiene valores negativos. La mitad del ciclo, o el tiempo que establezca el ciclo de trabajo,  está en la parte alta,  y el resto en la parte baja. 


Como ya tenemos el contador de ciclos hecho,  solo es implementar la señal. 


En la celda L51

=SI(Y(Q51<H51);1;SI(Y(Q51>H51);-1;1))

Y ya tenemos la señal cuadrada

 





La representamos con un ciclo de trabajo del 80%

Diente de sierra

Para generar un señal diente de sierra estática,  solo necesitamos conocer la frecuencia.  Hallamos el valor de la pendiente en el origen,  y lo mantenemos hasta que la señal llega a la unidad. En ese momento bajamos a cero y reiniciamos el ciclo. 

La pendiente en el origen es:

=1/E28

siendo E28 la frecuencia de la señal. 

La señal diente de sierra es así:

=SI(AW$17=1;SI(E$36=1;SI(AK20<0;(AK20+AA$19)*AW$12;AK20*AW$12);"");"")

Donde AW12 es la pendiente inicial. 



Verificamos que la primera iteración se hace correcta, ya que tiene que comprobar el desfase inicial. 


Y obtenemos la siguiente señal


Señal triangular

Para la señal triangular,  hacemos lo siguiente:

Dividimos el pulso en 4 partes,  y hacemos 3 rectas con pendiente fija durante el intervalo de 4/número de muestras. 

Son 4 ecuaciones en una misma condición. 

Estas son las 4 ecuaciones. 

La señal triangular se divide en 4 segmentos.  Dos de ellos por encima del cero y dos por debajo.  Dos a dos comparten una misma pendiente cambiando de signo entre pares. 




Disponemos de un contador que aumenta hasta un máximo de muestras por ciclo.  Lo usamos como referencia para calcular cada punto de inicio según el adelanto que fijemos. Si el adelanto es positivo, empleamos el contador tal cual.  Si el adelanto es negativo el contador será negativo ascendente, por lo tanto empleamos la suma del contador+nº total de muestras que será igual al número de muestras positivas ascendentes. 



En la celda P19

=SI(Y(Q52<G52/4);1;SI(Y(Q52>G52/4;Q52<3*G52/4);-1;SI(Y(Q52>3*G52/4;Q52<G52);1)))

para conseguir la positividad o negatividad de la pendiente por tramo. 

Para conseguir el punto de inicio según el adelanto hay que calcularlo por tramos. 

Esta es la ecuación que hay que pegar. 

=SI(Q51<0;SI(O(Y(Q51+G51>G51/4;Q51+G51<G51/2);Q51+G51=G51/2);(-1+((G51/4)/((Q51+G51)/2)));)&SI(O(Y(Q51+G51>G51/2;Q51+G51<3*G51/4);Q51+G51=3*G51/4);(((G51/2)-(Q51+G51)))/(G51/4);)&SI(O(Y(Q51+G51>3*G51/4;Q51+G51<G51);Q51+G51=G51);(-3*(G51-(Q51+G51))/(3*G51/4));)&SI(O(Q51+G51<G51/4;Q51+G51=G51/4);4*(Q51+G51)/G51;);SI(O(Y(Q51>G51/4;Q51<G51/2);Q51=G51/2);(-1+((G51/4)/((Q51)/2)));)&SI(O(Y(Q51>G51/2;Q51<3*G51/4);Q51=3*G51/4);(((G51/2)-(Q51)))/(G51/4);)&SI(O(Y(Q51>3*G51/4;Q51<G51);Q51=G51);(-3*(G51-(Q51))/(3*G51/4));)&SI(O(Q51<G51/4;Q51=G51/4);4*(Q51)/G51;))




Y conseguimos esta forma de onda

Tren de pulsos. 



Los pulsos son interesantes para muestrear señales.  Mandamos un uno contra una señal y devuelve el valor de la señal en ese punto. 

Si mandamos pulsos con la frecuencia correcta, podemos hacer el primer paso de la tarea de muestrear la señal, es decir,  pasarla de dominio analógico a digital, lo que se llama digitalizar o convertidor A/D. 

Para hacer el generador de pulsos, simplemente tomamos del generador de ciclos, un pulso cada vez que el contador vale 1. 

El resto del tiempo la señal vale cero, 


En el panel de control hemos grabado todos los datos para poderlos mostrar en la gráfica


Para la versión inicial este es el generador de señales.  Si usamos dos, podemos crear una señal modulada en AM simplemente con multiplicar  una señal de alta frecuencia por una señal de baja frecuencia. 

 






O las consecuencias del rebote en montañas y edificios que sufren las señales de radio. 

Frecuencímetro

 Tomamos una señal que desconocemos su información. 

Truco. 

Si hacemos un panel de control en  la misma hoja de la matriz de datos, la aplicación tarda mucho más,  porque tiene que calcular y representarnos los datos y son cerca de 300.000 registros.  Si ponemos las celdas de control y la gráfica de resultado a una hoja separada,  al hacer los cambios la aplicación solo tiene que hacer cálculos,  dejando la parte de representación. 

En sucesivos posts vamos a ir aplicando estas señales a diferentes montajes que darán como resultado otras señales,  que está bien conocer. 

También haremos un analizador de espectro, con un vobulador que nos permita analizar anchos de banda y respuestas en frecuencia de montajes que modelemos. 



Etapa de salida

La etapa de salida consta de un selector,  un amplificador y un inversor. 


El selector,  elige la señal activa. 

El amplificador adapta la señal a la magnitud necesaria en  cada momento. 

El inversor,  invierte la polaridad,  es decir,  cambia de signo el valor instantáneo de la señal activa. 


Estas acciones se hacen con tres columnas: 

Primera columna: Selector. Podemos elegir la celda BY para este caso. 

=SI(S$18=1;SI($E$28<>0;SI($E$30=1;BW20;SI($E$30=2;BQ20;SI($E$30=3;BP20;SI($E$30=4;BU20;SI($E$30=5;BV20;SI($E$30=6;BR20;SI($E$30=7;BT20;SI($E$30=8;BX20;SI($E$30=9;BM20;SI($E$30=10;BN20;SI($E$30=11;BP20;"")))))))))));0);"")


Donde 

BW20 es la columna de la señal sinusoidal

BP20 es la columna de la señal cuadrada

BQ20 es la columna de la señal tren de pulsos

...


Posteriormente,  el inversor. 

=SI(BZ$17=1;SI(E$29=1;-BY20;BY20);"")

Esta función hace que si el inversor está activado,  conseguimos el valor -BY20,  donde BY20 es la celda del selector. 

Finalmente .  Amplificador. 

El amplificador suele ser la etapa de salida de muchos sistemas analógicos, para adaptar la señal al medio. 


En este caso,  solo multiplicamos. 

Salida del ondulador. 


=CB20*BZ20

donde CB20 es la amplificación y BZ20 es la señal de salida del inversor.   



Comentarios

Entradas populares de este blog

Tutoriales de VBASIC para Excel. Aprender a localizar recursos de programación de manera local. Objetos del interfaz, sus propiedades y valores.

Copiar y pegar múltiples celdas en hoja de cálculo