Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de...

28
SISTEMAS ELECTRÓNICOS APUNTES Repaso de prerrequisitos Introducción Los contenidos de esta asignatura se asientan sobre conceptos básicos de electrónica analógica, electrónica digital y programación en C que debería haber adquirido durante su formación de grado. Este documento pretende ser solo un repaso de aquellas nociones que conviene dominar para aprovechar el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede consultar alguna de las referencias de la Sección 5. 1. Sistemas de numeración A lo largo de la historia se han usado multitud de sistemas de numeración diferentes (el egipcio, el romano, el maya...). Sin embargo, en esta asignatura va a aprender a programar microcontroladores, que son dispositivos digitales y, por tanto, solo necesita conocer tres sistemas de numeración: el decimal, que no requiere presentación, el binario y el hexadecimal. Todos ellos son sistemas de numeración posicionales, es decir, el valor de cada dígito depende de la posición en la que se encuentra dentro del número y, más concretamente, polinómicos, porque el peso de cada cifra se incrementa siguiendo una progresión geométrica. La progresión geométrica se forma con potencias de un número al que se denomina base y que coincide con el número de símbolos diferentes del sistema de numeración. 1.1. Sistema binario Al contrario que el sistema decimal que usa 10 símbolos para representar cualquier número, el sistema binario utiliza únicamente dos: 0 y 1, lo que permite que pueda almacenarse y procesarse en un sistema digital. Salvo por esta diferencia, el manejo de números en binario es exactamente igual al de los números decimales. No obstante, el hecho de que solo tenga dos símbolos implica que para representar cualquier cantidad utiliza una gran cantidad de dígitos. Esto hace que sean difíciles de memorizar y escribir. Por ese motivo, aunque los sistemas digitales operen en binario, se suele trabajar en decimal y realizar las conversiones pertinentes cuando haya que intercambiar números con el sistema digital. En este curso solo vamos a necesitar realizar conversiones de números enteros, razón por la cual no se menciona la conversión con decimales a continuación. 1.1.1. Conversión de binario a decimal Para pasar de binario (o de cualquier otra base b) a decimal basta con aplicar la fórmula: N 10 = n–1 X i =0 d i · b i (1) donde d representa un dígito, i su posición y n el número total de dígitos. Por ejemplo: (11011) 2 =1 · 2 4 +1 · 2 3 +0 · 2 2 +1 · 2 1 +1 · 2 0 =1 · 16 + 1 · 8+1 · 2+1 · 1 = 27 (2) Repaso de prerrequisitos Curso 2019/2020 1

Transcript of Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de...

Page 1: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

Repaso de prerrequisitos

IntroducciónLos contenidos de esta asignatura se asientan sobre conceptos básicos de electrónica analógica,

electrónica digital y programación en C que debería haber adquirido durante su formación de grado. Estedocumento pretende ser solo un repaso de aquellas nociones que conviene dominar para aprovecharel curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con másprofundidad, puede consultar alguna de las referencias de la Sección 5.

1. Sistemas de numeraciónA lo largo de la historia se han usado multitud de sistemas de numeración diferentes (el egipcio, el

romano, el maya...). Sin embargo, en esta asignatura va a aprender a programar microcontroladores,que son dispositivos digitales y, por tanto, solo necesita conocer tres sistemas de numeración: el decimal,que no requiere presentación, el binario y el hexadecimal.

Todos ellos son sistemas de numeración posicionales, es decir, el valor de cada dígito depende dela posición en la que se encuentra dentro del número y, más concretamente, polinómicos, porque elpeso de cada cifra se incrementa siguiendo una progresión geométrica. La progresión geométrica seforma con potencias de un número al que se denomina base y que coincide con el número de símbolosdiferentes del sistema de numeración.

1.1. Sistema binario

Al contrario que el sistema decimal que usa 10 símbolos para representar cualquier número, elsistema binario utiliza únicamente dos: 0 y 1, lo que permite que pueda almacenarse y procesarse enun sistema digital. Salvo por esta diferencia, el manejo de números en binario es exactamente igual alde los números decimales.

No obstante, el hecho de que solo tenga dos símbolos implica que para representar cualquiercantidad utiliza una gran cantidad de dígitos. Esto hace que sean difíciles de memorizar y escribir. Porese motivo, aunque los sistemas digitales operen en binario, se suele trabajar en decimal y realizar lasconversiones pertinentes cuando haya que intercambiar números con el sistema digital. En este cursosolo vamos a necesitar realizar conversiones de números enteros, razón por la cual no se menciona laconversión con decimales a continuación.

1.1.1. Conversión de binario a decimal

Para pasar de binario (o de cualquier otra base b) a decimal basta con aplicar la fórmula:

N10 =n–1∑

i = 0

di · bi (1)

donde d representa un dígito, i su posición y n el número total de dígitos. Por ejemplo:

(11011)2 = 1 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 1 · 20 = 1 · 16 + 1 · 8 + 1 · 2 + 1 · 1 = 27 (2)

Repaso de prerrequisitosCurso 2019/2020

1

Page 2: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

1.1.2. Conversión de decimal a binario

Para convertir un número decimal a binario existen varias técnicas, aunque la más utilizada es la delas divisiones sucesivas. Consiste en ir dividiendo el número decimal entre dos (o en general entre labase b) e ir anotando los restos de las divisiones parciales. El proceso termina cuando el cociente escero. El número binario se obtiene leyendo los restos de abajo a arriba.

2

1 2

1 6 2

0 3 2

1 1 2

1 0

1 1 0 1 1

Fin

13

27

Figura 1. Ejemplo de conversión de decimal a binario.

1.2. HexadecimalCuando se programan microcontroladores, a veces es más conveniente recurrir al sistema binario.

Sin embargo, como se ha mencionado previamente, el hecho de utilizar muchas cifras para codificarnúmeros relativamente pequeños hace que sea fácil equivocarse. Para mitigar este problema se empleahabitualmente la codificación hexadecimal, que es mucho más compacta ya que consta de 16 símbolos:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, y F. Las letras se corresponden con los números 10 a 15 endecimal.

1.2.1. Conversión entre hexadecimal y binario

Para convertir de binario a hexadecimal se agrupan los bits de cuatro en cuatro empezando porel bit menos significativo1. Si es necesario, se añaden ceros por la izquierda para completar el últimogrupo. Una vez hechas las agrupaciones, se convierte cada grupo por separado en un dígito entre 0 y F.Por ejemplo:

(11011)2 = 0001 1011 = (1B)16 (3)

La conversión de hexadecimal a binario se realiza justo a la inversa, convirtiendo cada dígito en unnúmero binario.

1.2.2. Conversión entre hexadecimal y decimal

La conversión entre los sistemas hexadecimal y decimal es análoga a la binario–decimal utilizandocomo base b = 16. La Figura 2 muestra un ejemplo de cómo pasar de decimal a hexadecimal.

16

11

1 B

1

27

16

1 0 Fin

Figura 2. Ejemplo de conversión de decimal a hexadecimal.

1Recuerde que el bit menos significativo (LSB, del inglés least significant bit) es el que está más a la derecha del número yel más significativo (MSB o most significant bit), el de más a la izquierda.

2 Repaso de prerrequisitosCurso 2019/2020

Page 3: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

1.3. Representación de números con signoPara distinguir entre números positivos y negativos, en decimal se utilizan dos símbolos adicionales:

+ y –. En cambio, en un sistema digital solo pueden existir dos símbolos, el 0 y el 1, por lo que la formade representar los números negativos es diferente. La técnica que emplean los microcontroladores esel complemento a dos. Una forma de obtener el complemento a dos de un número binario consisteen realizar el complemento a uno, es decir, invertir todos los bits del número binario (cambiar los 1por 0 y viceversa) y después sumar 1 al resultado. El bit más significativo de un número con signose denomina bit de signo y es 0 en los números positivos y 1 en los negativos. Para representar unnúmero entero con signo se sigue el siguiente algoritmo:

Si el número es positivo, se representa en binario, asegurándose de que el número de dígitos usadoes suficiente para que el bit más significativo sea un 0.

Si el número es negativo, se obtiene el complemento a dos del valor absoluto, cuyo bit mássignificativo también debe ser 0 para que después de realizar el complemento se convierta en 1. Porejemplo, para obtener la representación del número –3 en 8 bits (obviamente con signo) hay quecalcular el complemento a dos del módulo, que es 3 = (0000 0011)2. El resultado es (1111 1101)2,cuyo bit más significativo es un 1 por tratarse de un número negativo.

No se puede determinar si un número tiene signo o no a partir de su codificación en binario. Enprogramación se utilizan los tipos de dato (ver Sección 3.1) para saber si el bit más significativo hayque interpretarlo como bit de signo o forma parte del valor de un número positivo.

En ocasiones necesitará realizar la conversión inversa, es decir, a partir de una representación encomplemento a dos de un número negativo obtener su valor decimal. Para ello basta con seguir elalgoritmo presentado anteriormente a la inversa. Primero se hace el complemento a dos y después seconvierte el resultado, que se corresponde con el valor absoluto, a decimal.

2. Funciones lógicasEn los programas desarrollados para microcontroladores se utilizan frecuentemente cuatro funciones

lógicas cuyas tablas de verdad se reproducen a continuación.

Tabla 1. Tabla de verdad de la función AND.

A B A · B0 0 00 1 01 0 01 1 1

Tabla 2. Tabla de verdad de la función OR.

A B A + B

0 0 00 1 11 0 11 1 1

Tabla 3. Tabla de verdad de la función XOR.

A B A ⊕ B

0 0 00 1 11 0 11 1 0

Tabla 4. Tabla de verdad de la función NOT.

A A

0 11 0

Repaso de prerrequisitosCurso 2019/2020

3

Page 4: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

3. Programación en C para microcontroladoresEl microcontrolador dsPIC33FJ32MC202 de Microchip Technology2, que vamos a utilizar se

programa en C (igual que el Arduino3 de Electrónica de segundo de grado). Partiendo de la base deque ya sabe C, el objetivo de esta sección es refrescar algunos conceptos clave para que pueda seguirlas explicaciones de clase desde el principio. Por suerte para usted, los temidos punteros no formanparte de ellos.

3.1. Tipos de datosEn programación, un tipo de dato es una atributo que especifica los valores que pueden almacenar

las variables y qué operaciones son capaces de realizar. En C se distinguen dos grupos: los datos enterosy los de coma flotante (o decimales). Algunos tipos de dato como el char siempre tienen las mismaspropiedades, independientemente de la plataforma, mientras que otros varían de un microcontroladora otro. Por ejemplo, el tamaño de los datos de tipo int puede ser de 16, 32 o 64 bits. Las Tablas 5 y 6muestran las propiedades de los tipos de datos del microcontrolador dsPIC33FJ32MC202 que seemplearán durante el curso. Como los datos en coma flotante siempre tienen signo, en la Tabla 6 seindica únicamente el rango de valores positivos posibles.

Tabla 5. Tipos de datos enteros en el dsPIC33FJ32MC202.

Tipo Tamaño Valor mínimo Valor máximo

char 8 bits –27 (–128) 27 – 1 (127)unsigned char 8 bits 0 28 – 1 (255)int 16 bits –215 (–32768) 215 – 1 (32767)unsigned int 16 bits 0 216 – 1 (65535)long 32 bits –231 231 – 1unsigned long 32 bits 0 232 – 1

Tabla 6. Tipos de datos en coma flotante en el dsPIC33FJ32MC202.

Tipo Tamaño Valor mínimo Valor máximo

float 32 bits 1,175494 · 10–38 3,40282346 · 1038

double 32 bitsa 1,175494 · 10–38 3,40282346 · 1038

aValor por defecto. Se puede configurar para que utilice 64 bits.

Como un microcontrolador es un sistema digital, las variables se almacenan en memoria en formatobinario. Sin embargo, dado que trabajar en binario no es cómodo ni intuitivo en muchos casos, a la horade programar se puede utilizar binario, decimal y hexadecimal indistintamente como se indica enel Código 1. Para identificar los números binarios y hexadecimales se anteponen los prefijos 0b y 0x.

char a = 0b11111111; // Prefijo binario: 0bchar b = -1; // Prefijo decimal: Ningunochar c = 0xFF; // Prefijo hexadecimal: 0x

Código 1. Las variables a, b y c tienen exactamente el mismo valor.

2https://www.microchip.com3https://www.arduino.cc

4 Repaso de prerrequisitosCurso 2019/2020

Page 5: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

También es importante recordar que la promoción de números enteros es directa cuando se tratade pasar de un tipo de dato de menor tamaño a uno mayor, es decir, una variable de 8 bits se puedeguardar en una de 16 bits sin problema porque “cabe”. Obviamente no se puede hacer lo contrario sinperder información. Si se quiere hacer una conversión de tipo de forma explícita, se puede hacer un castponiendo el nuevo tipo entre paréntesis delante de la expresión que se desea convertir (Código 4).

unsigned char c = 0xFF;unsigned int i;

i = c; // i = 0x00FF

Código 2. Promoción sin signo.

char c = 0xFF;int i;

i = c; // i = 0xFFFF

Código 3. Promoción con signo.

float f = 2.1;int i;

i = (int) f // i = 2

Código 4. Ejemplo de cast.

3.2. OperadoresLo interesante de las variables es que se pueden hacer operaciones con ellas. A continuación se

explican brevemente todos los operadores relevantes para programar un microcontrolador.

3.2.1. Operadores aritméticos

Permiten realizar las operaciones aritméticas básicas (sumas, restas, multiplicaciones, divisiones) yalgunas otras útiles en programación como los incrementos. La Tabla 7 presenta la sintaxis de todosellos y una breve descripción de su funcionamiento. Se presta especial atención a aquellos operadoresque pueden resultar problemáticos si no se usan adecuadamente.

Tabla 7. Operadores aritméticos.

Nombre del operador Sintaxis Descripción

Asignación a = b Copia en la variable a el valor almacenado en b.

Suma a + b Suma a y b.

Resta a - b Sustrae b de a.

Menos unario -a Cambia el signo de la variable a. Complemento a 2.

Multiplicación a * b Multiplica a y b.

División a / b Si a y b son enteros, calcula el cociente de la división entera.Ejemplo: 1/2 = 0Si al menos uno de los operandos es un número en coma flotante,el resultado tiene decimales.Ejemplo: El resultado de 1.0/2 (o 1/2.0) es 0.5.

Módulo a % b Calcula el resto de la división entera a / b. Resulta útil recordarque si el resto es 0, a es múltiplo de b.Ejemplo: Si a = 3 y b = 2 el resultado será 1.

Pre-incremento ++a Incrementa a en una unidad y después la evalúa.Ejemplo: Si a = 1, después de ejecutar b = ++a, a = 2 y b = 2.

Post-incremento a++ Evalúa a y después la incrementa en una unidad.Ejemplo: Si a = 1, después de ejecutar b = a++, a = 2 y b = 1.

Pre-decremento --a Análogo al pre-incremento pero restando una unidad.

Post-decremento a-- Análogo al post-incremento pero restando una unidad.

Repaso de prerrequisitosCurso 2019/2020

5

Page 6: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

3.2.2. Operadores lógicos

En C no existen variables lógicas que puedan valer solo verdadero o falso, sino que todas las variablespueden interpretarse como un valor lógico al evaluar una condición:

Si su valor es 0, se leerá FALSE.

Cualquier otro valor será considerado TRUE.

Por ejemplo, en el Código 5 la instrucción while tiene que ejecutar el bloque de código que apareceentre llaves mientras que su condición sea verdadera. Como una condición solo puede evaluarse comoverdadera o falsa, la variable i se interpreta como una valor lógico y el programa repite el fragmentode código entre llaves hasta que i pasa a ser 0.

int suma = 0;int i = 5;

while (i) {suma = suma + i;i--;

}

Código 5. Ejemplo de variable entera interpretada como valor lógico.

Lo mismo sucede con los operadores lógicos (Tabla 8). Sus operandos y el resultado de la operaciónse tratan siempre como valores lógicos. Debajo de la tabla puede ver algunos ejemplos con el resultadode cada una de las expresiones escrito en forma de comentario.

Tabla 8. Operadores lógicos.

Nombre del operador Sintaxis Descripción

AND lógico a && b Devuelve TRUE si a y b son verdaderos (distintos de cero).

OR lógico a || b Devuelve TRUE si al menos uno de los operandos es verdadero.

NOT lógico !a Devuelve TRUE solo si a = 0, es decir, niega el valor lógico de a.

int a = 1;int b = 14;int c = 0;int d = 32;int ans;

ans = a && b; // TRUEans = c && d; // FALSE

Código 6. AND lógico.

int a = 0;int b = 0;int c = 32;int ans;

ans = a || b; // FALSEans = a || c; // TRUE

Código 7. OR lógico.

int a = 14;int b = 0;int ans;

ans = !a; // FALSEans = !b; // TRUE

Código 8. NOT lógico.

Los operadores lógicos suelen confundirse frecuentemente con los operadores a nivel de bitque, como se verá más adelante, tienen un nombre y una sintaxis muy parecidos. Es un error bastantecomplicado de detectar, de modo que compruebe siempre dos veces que está empleando el operadorcorrecto.

6 Repaso de prerrequisitosCurso 2019/2020

Page 7: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

3.2.3. Operadores de comparación o relacionales

Al igual que los operadores lógicos, las operaciones de comparación (Tabla 9) siempre dan comoresultado un valor lógico. Sin embargo, los operandos se tratan como variables numéricas normales(enteras o decimales, según el tipo de dato).

Tabla 9. Operadores de comparación o relacionales.

Nombre del operador Sintaxis Descripción

Igualdad a == b Devuelve TRUE si a y b son iguales.No debe confundirse con el operador de asignación = .

Desigualdad a != b Devuelve TRUE si a y b son distintos.

Mayor que a > b Devuelve TRUE si a es mayor que b.

Menor que a < b Devuelve TRUE si a es menor que b.

Mayor o igual que a >= b Devuelve TRUE si a es mayor o igual que b.

Menor o igual que a <= b Devuelve TRUE si a es menor o igual que b.

3.2.4. Operadores a nivel de bit

Este tipo de operadores (Tabla 10) se utilizan prácticamente en cualquier programa desarrolladopara un microcontrolador, por muy sencillo que sea. Por ese motivo es fundamental que sepa manejarloscon soltura. A diferencia de todos los operadores anteriores, operan sobre los bits de los operandosindividualmente, sin tener en cuenta el número completo, por lo que cuando se hacen cálculos a manolo más razonable es trabajar en binario, especialmente si no se tiene demasiada práctica. El resultadode la operación es un número, no una variable lógica. Tanto los operandos como el resultado se suelenexpresar en hexadecimal porque es un formato más compacto que el binario y resulta más difícilequivocarse al transcribirlo, sobre todo si son números largos de 16 o 32 bits.

Tabla 10. Operadores a nivel de bit.

Nombre del operador Sintaxis Descripción

AND bit a bit a & b Realiza un AND entre todos los bits de a y b que están en la mismaposición, es decir, hace un AND entre los dos bits de la posicióncero, otro entre los bits de la posición uno, y así sucesivamente.No debe confundirse con el operador AND lógico &&.

OR bit a bit a | b Calcula un OR entre los bits de la misma posición. No es lo mismoque el OR lógico ||.

XOR bit a bit a ^ b Realiza un OR exclusivo entre los bits de la misma posición.

NOT bit a bit ~a Complemento a 1. Convierte los 0 de la codificación binaria de aen 1 y viceversa.Es diferente del NOT lógico !.

Desplazamientoa la izquierda

a << b Mueve b posiciones hacia la izquierda los bits de a. Los b bits mássignificativos de a desaparecen; rellena con ceros por la derecha.Equivale a multiplicar a por 2b.

Desplazamientoa la derecha

a >> b Mueve b posiciones hacia la derecha los bits de a. Los b bits menossignificativos de a desaparecen. Si a tiene signo, se rellena con elbit más significativo de a por la izquierda; si no lo tiene, se rellenacon ceros. Equivale a dividir a por 2b.

Repaso de prerrequisitosCurso 2019/2020

7

Page 8: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

La Figura 3 muestra cómo se realizaría un AND bit a bit entre dos números de 8 bits: se convierten abinario, se colocan uno encima del otro y se realiza la operación AND por columnas. El procedimientoes análogo para el OR y el XOR bit a bit.

0 1 0 1 0 0 1 10x53

Bit 0Bit 7

1 0 1 1 0 1 1 0

& & & & & & & &

0 0 0 1 0 0 1 0

0xB6

0x12

Figura 3. Ejemplo de AND bit a bit.

Para terminar con este apartado, se presentan ejemplos de los tres posibles casos de desplazamientos:a la izquierda, a la derecha sin signo y a la derecha con signo. Observe que en el primer caso (Figura 4),efectivamente se multiplica el número inicial por 4, ya que a = 23 y b = 92.

char a = 0x17;char b;

b = a << 2; // b = 0x5C

Bit 0Bit 7

0

0 0 0 1 0 1 1 1

0 1 0 1 1 1 0 0

Figura 4. Desplazamiento a la izquierda.

En cuanto a los desplazamientos a la derecha, comprobemos si realiza la división entera. En el casosin signo (Figura 5), a = 169 y b = 42. El resultado exacto de dividir 169 entre 4 es 42,25, por loque está bien. En la versión con signo (Figura 6), a = -87, que dividido por 4 da –21,75. Sin embargo,en decimal b = -22. ¿Es esto correcto? Pues sí y no. En C no da lo mismo desplazar a la derecha unnúmero negativo que hacer la división entera utilizando el operador /. El resultado del desplazamientosiempre es menor que el cociente con decimales. En cambio, la división siempre está más próxima acero, por lo que en este caso daría –21.

unsigned char a = 0xA9;unsigned char b;

b = a >> 2; // b = 0x2A

Bit 0Bit 7

1 0 1 0 1 0 0 1

0 0 1 0 1 0 1 0

Figura 5. Desplazamiento a la derecha sin signo.

char a = 0xA9;char b;

b = a >> 2; // b = 0xEA

Bit 0Bit 7

1 0 1 0 1 0 0 1

1 1 1 0 1 0 1 0

Figura 6. Desplazamiento a la derecha con signo.

8 Repaso de prerrequisitosCurso 2019/2020

Page 9: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

3.2.5. Operadores de asignación compuestos

En C se pueden combinar asignaciones y operaciones aritméticas o a nivel de bit que involucrendos operandos para hacer el código más compacto. En cambio, no existe esta posibilidad para losoperadores que tienen un único operando (unarios) porque algunos de ellos como los incrementos ylos decrementos ya actualizan el operando.

Tabla 11. Operadores de asignación compuestos.

Nombre del operador Sintaxis Equivalencia

Asignación de suma a += b a = a + b

Asignación de resta a -= b a = a - b

Asignación de multiplicación a *= b a = a * b

Asignación de división a /= b a = a / b

Asignación de módulo a %= b a = a % b

Asignación de AND bit a bit a &= b a = a & b

Asignación de OR bit a bit a |= b a = a | b

Asignación de XOR bit a bit a ^= b a = a ^ b

Asignación de desplazamiento a la derecha a >>= b a = a >> b

Asignación de desplazamiento a la izquierda a <<= b a = a << b

3.2.6. Precedencia y orden de evaluación

La precedencia o prioridad de los operadores especifica el orden en que se realizan las operacionesen aquellas expresiones que contienen más de un operador. Empezando por arriba, la Tabla 12 presentalos operadores que se han visto hasta este punto en orden decreciente de prioridad.

Tabla 12. Precedencia de operadores.

Nombre del operador Tipo de operación Asociatividad

++ -- (sufijos) Unaria De izquierda a derecha

++ -- (prefijos) - ~ ! Unaria De derecha a izquierda

* / % Multiplicativa De izquierda a derecha

+ - Aditiva De izquierda a derecha

<< >> Desplazamiento De izquierda a derecha

< > <= >= Relacional De izquierda a derecha

== != Igualdad De izquierda a derecha

& AND bit a bit De izquierda a derecha

^ XOR bit a bit De izquierda a derecha

| OR bit a bit De izquierda a derecha

&& AND lógico De izquierda a derecha

|| OR lógico De izquierda a derecha

= *= /= %= += -= <<= >>= &= ^= |= Asignación De derecha a izquierda

Repaso de prerrequisitosCurso 2019/2020

9

Page 10: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

Todos los operadores que aparecen en la misma línea comparten prioridad. Cuando una expresióncontiene varios operadores con la misma prioridad, la evaluación continúa según su asociatividad.Los operadores con asociatividad de izquierda a derecha se resuelven empezando por la izquierda yviceversa. Por ejemplo, la expresión a + b + c se evaluaría como (a + b) + c.

No es necesario aprenderse la tabla de precedencias de memoria; en caso de duda lo mejor esutilizar paréntesis para asegurarse de que la expresión se evalúa en el orden esperado.

3.3. MáscarasEsta sección explica una técnica empleada muy a menudo para procesar información bit a bit en

microcontroladores. Se denomina máscara a una especie de filtro, expresado generalmente en formatohexadecimal, que se aplica a una variable para poder leer o modificar sus bits de forma selectiva. Losoperadores que permiten hacerlo son el AND y el OR bit a bit.

El AND bit a bit se utiliza para poner a cero algunos bits concretos sin modificar los demás.Por ejemplo, en el Código 9, la máscara 0xFF (que el microcontrolador interpreta como 0x00FF

porque está trabajando con variables de 16 bits) selecciona los 8 bits menos significativos de a

(porque un AND con 1 es una operación neutra), pone a cero los 8 bits más significativos (unAND de cualquier número con 0 siempre da 0) y guarda el resultado en b.

El OR bit a bit se emplea para escribir unos en bits concretos sin alterar los demás. En elCódigo 10 la máscara 0xFF pone a uno los 8 bits menos significativos (un OR con 1 siempre da 1)y preserva el valor del resto (un OR con 0 es una operación neutra).

int a = 0x5555;int b;

b = a & 0xFF; // b = 0x0055

Código 9. Ejemplo de máscara con AND bit a bit.

int a = 0x5555;int b;

b = a | 0xFF; // b = 0x55FF

Código 10. Ejemplo de máscara con OR bit a bit.

Si se combinan ambos operadores, se puede conseguir que el bit de una variable sea igual que el bitde otra sin modificar las demás posiciones. Por ejemplo, en el Código 11 se copia el valor del bit 2 de lavariable a en la posición 2 de b. Primero se borran todos los bits de a menos el segundo y se guarda elresultado en una variable auxiliar. Como se quieren poner bits a cero, se usa un &. Después, se borra elbit 2 de b para que al aplicar un OR sobre él se escriba un 0 si el bit 2 de a vale 0 (0 | 0 = 0), y un 1(1 | 0 = 1) si es 1.

int a = 0x1234;int b = 0x5550;int aux;

aux = a & 0x0004; // Seleccionar el bit 2 de ab &= 0xFFFB; // Borrar el bit 2 de bb |= aux; // Copiar el bit 2 de a en b (b = 0x5554)

Código 11. Copiar un bit en la misma posición de otra variable.

10 Repaso de prerrequisitosCurso 2019/2020

Page 11: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

A la hora de trabajar con máscaras, son de especial utilidad el NOT bit a bit o complemento a 1 (~),y los operadores de desplazamiento (<< y >>). Suponga que ahora se quiere copiar el bit 2 de a en laposición 3 de b (Código 12). La primera expresión almacena el valor del bit 2 de a en la posición 0de aux. De esta manera no hace falta recordar en operaciones posteriores en qué posición estabaoriginalmente el bit que queremos copiar. A continuación se borra el bit 3 de b. A primera vista puedeparecer que usar un desplazamiento y un complemento a 1 es más difícil que escribir la máscara 0xFFF7

directamente, pero no es así. El operando de la derecha del desplazamiento indica qué bit queremosborrar, en este caso el 3, y la negación que lo que queremos es escribir un 0 en vez del 1 que hemosdesplazado. Finalmente, se coloca el bit almacenado en aux en la posición deseada.

int a = 0x1234;int b = 0x5550;int aux;

aux = (a >> 2) & 0x1; // aux.0 = a.2b &= ~(1 << 3); // b.3 = 0 (b &= ~0x0008 o b &= 0xFFF7)b |= aux << 3; // b.3 = aux.0 (b = 0x5558)

Código 12. Copiar un bit en una posición diferente de otra variable.

3.4. Estructuras condicionales

La habilidad de controlar la ejecución del programa en determinadas circunstancias permitedesarrollar aplicaciones mucho más flexibles y útiles. Por ello, el lenguaje C contiene las siguientesestructuras.

3.4.1. Bloque if - else

La instrucción if permite definir fragmentos de código que solo se se ejecutan si se verifican ciertascondiciones. Puede ir acompañada de la claúsula else, cuando interesa ejecutar un código alternativosi la condición del if es falsa. Su sintaxis se muestra en el Código 13.

Los bloques if - else se pueden anidar, es decir, se pueden escribir unos dentro de otros paracomprobar más de dos posibilidades (Código 14). No obstante, normalmente es más legible emplear laexpresión else if para evaluar varias condiciones consecutivamente (Código 15). En el momento enel que una condición se verifica, las posteriores ya no se comprueban.

if (condición) {// Cond. verdadera...

}else {

// Condición falsa...

}

Código 13. Bloque if - else.

if (cond. 1) {...

}else {

if (cond. 2) {...

}else {

...}

}

Código 14. if - else anidado.

if (cond. 1) {...

}else if (cond. 2) {

...}else {

...}

Código 15. Sintaxis de else if.

Repaso de prerrequisitosCurso 2019/2020

11

Page 12: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

Cuando se trabaja con condiciones, hay que prestar mucha atención para no confundir aquellosoperadores que tienen una sintaxis semejante como el de igualdad y el de asignación (Código 16), o lasversiones lógicas y a nivel de bit de algunos operadores como el AND o el OR (Código 17). En ambosejemplos las dos posibilidades son sintácticamente correctas, pero no funcionan de la misma manera.Generalmente la que se pretende utilizar es la opción de la izquierda.

if (a == b) {...

}

if (a = b) {...

}

Código 16. Igualdad (izq.) frente a asignación (dcha.).En el caso de la igualdad la condición se cumple sia es igual que b; con la asignación, la condición esverdadera si b es distinto de cero.

if (a && b) {...

}

if (a & b) {...

}

Código 17. AND lógico (izq.) frente al bit a bit (dcha.).Con la versión lógica la condición se verifica si a y bson distintos de cero. En el AND bit a bit, se cumple siel resultado de la operación no es cero.

3.4.2. Bloque switch - case

Esta estructura es una alternativa a sentencias if que comparan una variable con varios valoresenteros (Código 18). Se utiliza frecuentemente para implementar máquinas de estado (si no recuerdalo que son no se preocupe, volveremos a explicarlas durante el curso). En el Código 19, si la variableestado toma el valor de uno de los case, se ejecuta el código que hay después de los dos puntos hastaque se encuentre una instrucción break. Si por un descuido se nos olvida esta última, se ejecutarátambién el código de los case que haya a continuación. Opcionalmente, se puede añadir un caso pordefecto (default) para que se ejecute un código si la variable estado no coincide con ningún valor. Esel equivalente a la cláusula else.

if (estado == 0) {...

}else if (estado == 1) {

...}else if (estado == 2) {

...}else {

...}

Código 18. Máquina de estados con if - else.

switch (estado) {case 0:

...break;

case 1:...break;

case 2:...break;

default:...break;

}

Código 19. Sintaxis del bloque switch - case.

3.5. BuclesA medida que los programas se van haciendo más complejos, es muy habitual tener que ejecutar el

mismo bloque de código varias veces. Un programador inexperto simplemente copiaría el fragmentode código que hay que repetir las veces que fueran necesarias. Sin embargo, esta solución se vuelveinviable a medida que crece el número de iteraciones (repeticiones). Precisamente para evitar estose inventaron los bucles, que permiten ejecutar un conjunto de instrucciones de forma repetida. Acontinuación se repasan brevemente los tres tipos de bucles disponibles en C.

12 Repaso de prerrequisitosCurso 2019/2020

Page 13: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

3.5.1. Bucle for

El bucle for tiene tres argumentos separados por punto y coma (Código 20). La inicialización seejecuta solo una vez, justo antes de entrar en el bucle y sirve para dar un valor inicial a la variable quese va utilizar para contar el número de iteraciones, normalmente denominada i. El bucle se repetirámientras se cumpla la condición. Si el valor inicial no la verifica, no se ejecutará ninguna vez. Alfinalizar cada iteración, se ejecuta la sentencia de incremento para sumar (o restar) una o variasunidades a la variable que cuenta las iteraciones. El Código 21 muestra un ejemplo.

for (inicialización; condición; incremento) {...

}

Código 20. Sintaxis del bucle for.

3.5.2. Bucle while

Si no se conoce de antemano el número de iteraciones que hay que realizar se debe utilizar unbucle while (Código 22). Su funcionamiento es el siguiente. En primer lugar, se evalúa la condición. Siel resultado es falso no ejecuta ninguna de las instrucciones delimitadas entre llaves y el programacontinúa. Si por el contrario la condición se cumple, se ejecutan las instrucciones del bucle y se vuelvea comprobar la condición. El proceso se repite indefinidamente hasta que la condición sea falsa. Si esonunca ocurre, el programa se quedará bloqueado.

3.5.3. Bucle do - while

Esta estructura (Código 23) es prácticamente idéntica al while. La única diferencia es que como lacondición se comprueba al final, el código entre llaves se ejecuta siempre como mínimo una vez.

for (i = 0; i < 3; i++) {...

}

Código 21. Ejemplo de bucle for.

while (condición) {...

}

Código 22. Bucle while.

do {...

} while (condición)

Código 23. Bucle do - while.

3.6. Vectores

Un vector es un conjunto de datos del mismo tipo que se almacenan en posiciones consecutivasde memoria y a los cuales se accede mediante el mismo nombre. Se definen de forma similar a lasvariables salvo porque se debe especificar su tamaño entre corchetes. Por ejemplo, para definir unvector llamado vec que pueda almacenar 10 valores de tipo unsigned int habría que escribir:

unsigned int vec [10];

Código 24. Definición de un vector.

Para poder consultar o modificar un elemento concreto del vector, es necesario especificar entrecorchetes su posición. Como los índices en C empiezan en cero, el último elemento de vec está en la

Repaso de prerrequisitosCurso 2019/2020

13

Page 14: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

vec[0] = 16; // CORRECTO. Primer elemento del vectorvec = 24; // ERROR. No se ha especificado un índicevec [10] = 87; // ERROR. ¡El índice 10 no existe!

Código 25. Forma correcta de acceder a un elemento de un vector y errores típicos.

posición número 9. El Código 25 muestra la forma correcta de acceder a un elemento del vector y doserrores muy comunes.

El primer error suele producirse por un descuido, olvidarse de que se está trabajando con un vector,en lugar de con una variable. En el segundo fallo, el problema es que se está accediendo a una zonade memoria que no pertenece al vector. Este error es muy difícil de detectar porque el compilador noinforma de él y el programa simplemente funciona mal, ya que se modifica sin querer el valor de otrasvariables.

Como quizá recuerde, la mejor forma de trabajar con vectores es utilizando bucles for para iterarpor sus elementos. Una de las aplicaciones de dicho bucle sería inicializar el vector (Código 26).Observe que se ha utilizado una constante TAM_VECTOR para definir su tamaño. Esto permite modificarfácilmente su longitud sin tener que revisar todo el programa. En el Código 26 también se presenta lamanera de inicializar un vector en el momento de la definición.

#define TAM_VECTOR 5

int main(void) {int v1[TAM_VECTOR ];int v2[] = {0, 1, 2, 3, 4};int i;

// Inicializar todos los elementos de v1 a cerofor (i = 0; i < TAM_VECTOR; i++) {

v1[i] = 0;}

...

return 0;}

Código 26. Formas de inicializar un vector.

3.7. FuncionesLa manera más elegante de estructurar un programa, especialmente si se trata de resolver un

problema complejo, es dividirlo en tareas más simples o módulos. Esta aproximación presenta laventaja de que si están diseñados para que sean genéricos, los módulos se pueden reutilizar. En C,este tipo de módulos se denominan funciones y constan de unos argumentos de entrada, un valor deretorno, que se emplea para devolver un resultado, y un conjunto de instrucciones que definen sucomportamiento.

Las funciones deben ser declaradas al principio del archivo y posteriormente definidas. Ladiferencia entre ambas sentencias radica en que la primera simplemente indica al compilador que

14 Repaso de prerrequisitosCurso 2019/2020

Page 15: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

existe una función con esa estructura que cualquier función que haya debajo puede utilizar, mientrasque la definición especifica las instrucciones que se deben ejecutar cuando se llame a la función. ElCódigo 27 muestra un ejemplo.

int potencia(int base , unsigned int exponente); // Declaración

int main(void) {unsigned int n = 2;int base = 10;int resultado;

resultado = potencia(base , n); // Llamada

...

return 0;}

// Definiciónint potencia(int base , unsigned int exponente) {

int resultado = 1;unsigned int i;

for (i = 0; i < exponente; i++) {resultado *= base;

}

return resultado; // Valor de retorno}

Código 27. Ejemplo de declaración, definición y llamada de una función.

La primera línea constituye la declaración de una función denominada potencia que tiene dosargumentos, uno de tipo int y otro de tipo unsigned int, y que devuelve un valor entero de 16 bits consigno. Como ya ha sido declarada, la función se puede llamar sin problema desde el main. Recuerdeque el nombre de los argumentos de la declaración y la llamada no tienen por qué coincidir y que losargumentos siempre se pasan por copia, es decir, que cualquier modificación que se haga sobre ellosdentro de la función no repercute sobre el valor de las variables originales. Finalmente, en la parteinferior se encuentra la definición, el código que se ejecutará cada vez que se llame a la función.

3.7.1. Ámbito de una variable

Se entiende por ámbito de una variable a la zona del programa en la cual una variable existe. Lasvariables que se pueden utilizar en cualquier parte y que permanecen en memoria durante toda laejecución del programa se denominan variables globales, mientras que las que solo existen en unazona delimitada reciben el nombre de variables locales.

Por norma general, en C una variable existe solo dentro de las llaves entre las que se declara.Por ejemplo, en el caso del Código 27, la variable i solo existe dentro de la función potencia. Secrea cuando se llama a la función y se destruye (desaparece de memoria) cuando la función retorna.Si se vuelve a llamar posteriormente a la función, se creará una variable distinta. En cambio, si sehubiera definido una variable al principio del código fuera de cualquier función, sería global y todas lasfunciones podrían acceder a ella para leerla y modificarla.

Repaso de prerrequisitosCurso 2019/2020

15

Page 16: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

3.7.2. Paso de vectores como argumento

Si en alguna ocasión necesita pasar un vector como argumento a una función deberá usar unpuntero. Será la única situación en la que se cruzará con un puntero este curso, por lo que no necesitarecordar cómo funcionan internamente. El Código 28 muestra una función que calcula el máximo deun vector. Observe que tanto en la declaración como en la definición se antepone un asterisco * alargumento del vector y que también es necesario pasar el tamaño para no acceder a posiciones que noexisten. En este caso como se está utilizando un puntero, cualquier modificación que se haga sobre elvector v dentro de la función se verá reflejada en la variable v del main.

#define TAM_VECTOR 5

int max(int* v, unsigned int longitud);

int main(void) {int v[] = {1, 5, 8, 4, 3};int maximo;

maximo = max(v, TAM_VECTOR);

...

return 0;}

int max(int* v, unsigned int longitud) {int maximo = 0x8000; // 0x8000 = -32768 (Valor mínimo en 16 bits)unsigned int i;

for (i = 0; i < longitud; i++) {if (v[i] > maximo) {

maximo = v[i];}

}

return maximo;}

Código 28. Ejemplo del paso de un vector como argumento de una función.

4. Amplificadores operacionalesLos amplificadores operacionales (abreviados generalmente en inglés como op amps) son uno de

los dispositivos integrados más versátiles, y desempeñan un papel fundamental en los circuitos deacondicionamiento de sensores que aprenderá a diseñar a partir del segundo mes de curso. Al igual quesucedía con el apartado de programación en C, aunque se podrían escribir varias decenas de páginassobre este tema, esta sección se centra exclusivamente en repasar aquellos conceptos que necesitará conmás frecuencia durante la asignatura. En cualquiera de los libros citados en la Sección 5.2 encontrarátodo con muchísimo más detalle.

Desde el punto de vista de la señal, un amplificador operacional tiene tres terminales, dos entradasy una salida. La Figura 7(a) muestra el símbolo que se utiliza para representarlo, donde los pines 1 y 2

16 Repaso de prerrequisitosCurso 2019/2020

Page 17: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

(a) (b)

Figura 7. Símbolos de un amplificador operacional sin (a) y con (b) indicación de las alimentaciones.

son las entradas positiva y negativa respectivamente y el terminal 3 se corresponde con la salida delcircuito. Sin embargo, como sabe, los operacionales necesitan alimentación —continua, por supuesto—para funcionar. Cuando es necesario indicar cómo está alimentado un operacional, se utiliza el símbolode la Figura 7(b) donde los terminales 4 y 5 son las alimentaciones positiva VCC y negativa VEE. Lohabitual es que los amplificadores operacionales se alimenten con tensiones simétricas (3,3 V y −3,3 V,por ejemplo) pero como no siempre es sencillo o conveniente utilizar tensiones negativas, en lossistemas electrónicos es bastante frecuente encontrarse con alimentaciones simples en las que VEE estáconectada a tierra (GND).

4.1. Operacionales idealesUn amplificador operacional está diseñado para medir la diferencia entre la tensión de sus dos

entradas y multiplicarla por una constante A que se denomina ganancia diferencial o ganancia enlazo abierto. Por tanto, con la configuración de la Figura 7 a la salida del operacional habrá unatensión

vo = A (v+ − v−) (4)

Nótese que v− cambia de signo a la salida, razón por la cual se denomina a la entrada denotada con elsigno “–”, terminal inversor. Siguiendo un razonamiento análogo, la entrada con signo “+” se denominaterminal no inversor.

En esta asignatura se van a ignorar los errores de los amplificadores operacionales y se va a emplearun modelo ideal que verifica lo siguiente:

Las entradas no consumen corriente (i+ = i− = 0) o, lo que es lo mismo, la impedancia de entradade un amplificador ideal se puede suponer infinita (Zin →∞)4.

La salida vo se comporta como una fuente ideal de tensión, es decir, que la impedancia de salida seconsidera nula (Zout = 0). Esto significa que la tensión de salida será A (v+ − v−), siempre que eloperacional no sature. Un amplificador operacional puede saturar por dos motivos:

• Si se demanda más intensidad (en valor absoluto) de la que el operacional es capaz desuministrar por el terminal 3, el valor de la tensión a la salida será aquel que haga que elamplificador proporcione la corriente máxima admisible.

4En realidad, por los terminales de entrada circula la corriente de polarización (bias current IIB en inglés), que en losoperacionales “malos” es del orden de 80 nA.

Repaso de prerrequisitosCurso 2019/2020

17

Page 18: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

• Por otro lado, los operacionales tampoco pueden generar tensiones de salida que se encuentrenfuera de su rango de alimentación. Los operacionales de tipo rail-to-rail saturan prácticamentea las tensiones de alimentación, pero no así los demás, cuyos límites de saturación son algo másrestrictivos. Por ejemplo, un amplificador alimentado a ±3,3 V, tendrá su límite superior L+

alrededor de 3 V (o incluso a 2,5 V), y el inferior L−, en torno a −3 V. Salvo que se especifiquelo contrario, en esta asignatura puede suponer que todos los operacionales son rail-to-rail.

Como se deriva de (4), los operacionales ideales responden únicamente a la diferencia entre lasdos señales de entrada e ignoran cualquier señal común a ambas. Es decir que si por ejemplov+ = v− = 1V, la salida debería ser cero. Por eso se dice que tienen ganancia de modo común ceroo rechazo de modo común infinito.

El ancho de banda es infinito, es decir, A permanece constante en todo el rango de frecuencias.

Finalmente, como la ganancia en lazo abierto es muy grande5, se puede considerar infinita (A→∞).

Quizá esté pensando que si A es infinita (o casi) los amplificadores operacionales saturan siempre aL+ si v+ > v− y a L− si v+ < v−. Efectivamente, en lazo abierto como se ha presentado hasta ahora, eloperacional se comporta de esa forma y se puede utilizar como comparador analógico. Sin embargo,como se verá en el apartado siguiente, los operacionales casi nunca se utilizan en lazo abierto sino quese emplean otros componentes para establecer una realimentación6.

4.2. Realimentación negativaImagine que conecta la salida vo de un amplificador operacional al terminal inversor y aplica una

señal de entrada vi en el terminal no inversor como se muestra en la Figura 8. Sustituyendo v+ por vi yv− por vo en (4) se llega a:

vo = A(vi − vo) (5)

vo = Avi −Avo (6)

(1 +A)vo = Avi (7)

vo =����>≈1

A

1 +Avi ⇒ vo ≈ vi (8) Figura 8. Buffer o seguidor.

Observe que como la ganancia A es tan grande (hemos supuesto que infinita en un operacionalideal), las tensiones en la salida —y por tanto en el terminal inversor— y en la entrada se mantienenprácticamente iguales en todo momento. Si la ganancia diferencial fuera de 105 y vi = 1V, la salida vosería 0,999 990 V, es decir, una diferencia de tan solo 10µV respecto a la entrada.

Como consecuencia de la realimentación negativa, si vi aumenta, vo = A(vi − v−) también seincrementa, por lo que v− aumenta, haciendo que vo baje de nuevo, lo que provoca que v− vuelva asubir y así sucesivamente hasta que se alcanza un punto de equilibrio cuando v+ es prácticamente iguala v−. Si se considera que A → ∞, entonces la única forma de que vo tenga un valor real distinto deinfinito es que v+ = v−. Esta ecuación se denomina cortocircuito virtual y solo es aplicable cuandoexiste realimentación negativa, independientemente de que la conexión entre vo y v− sea directa ohaya elementos intermedios.

5Por lo general está entre 105 y 106 V/V.6Este curso solo vamos a utilizar amplificadores operacionales con realimentación negativa, pero recuerde que también

existe la realimentación positiva, una de cuyas principales aplicaciones es diseñar comparadores con histéresis.

18 Repaso de prerrequisitosCurso 2019/2020

Page 19: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

4.3. Circuitos básicos

4.3.1. Buffer o seguidor

Cuando la salida se conecta directamente con la entrada inversora como en la Figura 8, el circuito sedenomina buffer o seguidor. A simple vista parece que este circuito carece de utilidad práctica porquese limita a replicar a la salida la tensión de la entrada. Sin embargo, como la impedancia de entradaZin de un amplificador operacional es prácticamente infinita y la de salida Zout, nula, se puede utilizarpara desacoplar etapas y evitar que haya efectos de carga. En otras palabras, permite aislar dos partesde un circuito para que los componentes posteriores al buffer no modifiquen el funcionamiento de losque lo preceden.

4.3.2. Amplificador no inversor

Figura 9. Amplificador no inversor.

Si se añade un divisor de tensión a larealimentación negativa (Figura 9) de formaque solo una fracción de la tensión de salidallegue al terminal negativo, intuitivamenteparece que la salida debería ser un múltiplo dela tensión de entrada. Ahora v− ya no es iguala vo sino proporcional al divisor de tensión queforman R1 y R2:

v− =R1

R1 +R2︸ ︷︷ ︸f

vo (9)

Sustituyendo de nuevo en (4) se llega a:

vo = A(vi − f vo) (10)

vo = Avi −Af vo (11)

(1 + fA)vo = Avi (12)

vo =�����>

1f

si A→∞

A

1 + fAvi ⇒ vo =

R1 +R2

R1vi ⇒ vo =

(R2

R1+ 1

)vi (13)

El mismo resultado se puede obtener utilizando la ecuación del cortocircuito virtual y la ley de Ohm.Como la tensión v− tiene que ser igual que vi, la corriente i1 indicada en la Figura 9 será:

i1 =viR1

(14)

Aplicando de nuevo la ley de Ohm sobre R2 y teniendo cuidado con los signos7:

i2 =vo − viR2

(15)

7Recuerde que para componentes pasivos (resistencias, condensadores, bobinas...) la ley de Ohm se enuncia con signopositivo V = R · I si los sentidos de la corriente y la tensión son opuestos, y con signo negativo en caso contrario.

Repaso de prerrequisitosCurso 2019/2020

19

Page 20: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

Como no puede circular corriente por el terminal negativo del operacional, i1 = i2. Igualando ambasexpresiones:

viR1

=vo − viR2

(16)

viR1

+viR2

=voR2

(17)

vo =

(R2

R1+ 1

)vi (18)

Aunque ambos métodos de resolución son equivalentes, de ahora en adelante se utilizará únicamenteel cortocircuito virtual porque resulta más sencillo de aplicar en circuitos complejos.

4.3.3. Amplificador inversor

Por el nombre de la sección se podrá imaginar que el circuito de la Figura 10 hace lo contrario queel anterior, es decir, vo es un múltiplo de vi pero de signo opuesto. Aplicando el cortocircuito virtualse tiene que la tensión v− = 0V y dado que no circula corriente por los terminales de entrada deloperacional, i tiene que ser la misma por ambas resistencias. Aplicando la ley de Ohm a R1:

i =viR1

(19)

Haciendo lo propio con R2:

i =0− voR2

(20)

Finalmente, igualando las intensidades:

viR1

=−voR2⇒ vo = −

R2

R1vi (21) Figura 10. Amplficador inversor.

4.3.4. Amplificador diferencial

En un amplificador diferencial existen dos fuentes de tensión independientes, v1 y v2, que lleganal operacional por ambos terminales de entrada (Figura 11(a)). Aunque se puede resolver el circuitopor varios métodos (nudos, mallas...), lo más sencillo es aplicar superposición. Para ello se resuelveel circuito tantas veces como fuentes independientes haya, pasivando en cada caso todas las fuentesindependientes menos una8. La salida del circuito original es la suma de los resultados parciales decada uno los circuitos simplificados.

Resolviendo en primer lugar para v1 (pasivando v2), se llega al circuito de la Figura 11(b). Como nopuede circular corriente por el terminal positivo y no hay fuentes en esa parte del circuito, no hay caídade tensión en las resistencias R3 y R4. Por tanto, la tensión v+ = 0V y el circuito es exactamente elmismo que el amplificador inversor del apartado anterior:

vo1 = −R2

R1v1 (22)

8Recuerde que una fuente de tensión se pasiva sustituyéndola por un cortocircuito (una fuente de tensión de 0 V) y queuna fuente de corriente se reemplaza por un circuito abierto.

20 Repaso de prerrequisitosCurso 2019/2020

Page 21: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

(a) (b) (c)

Figura 11. Amplificador diferencial (a) y circuitos para resolver por superposición en función de v1 (b) y v2 (c).

Haciendo lo mismo para v2, la tensión v+ se puede obtener a partir del divisor de tensión que formanR3 y R4:

v+ =R4

R3 +R4v2 (23)

Desde este punto el circuito es un amplificador no inversor por lo que:

vo2 =

(R2

R1+ 1

)v+ =

(R4

R3 +R4

)(R2

R1+ 1

)v2 (24)

Sumando ambos términos:

vo =

(R4

R3 +R4

)(R2

R1+ 1

)v2 −

R2

R1v1 (25)

Si además se impone que R1 = R3 y R2 = R4 se consigue que el circuito se comporte como unrestador con ganancia. Fíjese en que la señal que entra por el terminal positivo, v2 en este caso, es laque conserva el signo.

vo =

(R2

�����R1 +R2

)(���

��R2 +R1

R1

)v2 −

R2

R1v1 ⇒ vo =

R2

R1(v2 − v1) (26)

4.3.5. Sumador inversor

Por si no se había dado cuenta todavía, la denominación operacional del amplificador viene deltérmino “operación”, ya que se trata de un dispositivo capaz de realizar operaciones matemáticas. Hastaahora ha visto que permite multiplicar (con signo positivo y negativo) y restar, por lo que parece lógicoque también sirva para sumar. Estudiemos en primer lugar la configuración inversora para dos entradasv1 y v2 (Figura 12(a)). De nuevo, lo más rápido para analizar el circuito es emplear el principio desuperposición.

Para empezar, centrémonos en la Figura 12(b). Como existe realimentación negativa, por elcortocircuito virtual la tensión v− = 0V. Eso significa que la resistencia R2 está conectada entredos tensiones iguales y, por tanto, no influye porque no circula corriente por ella. En consecuencia, elcircuito resultante es un amplificador inversor estándar como el de la Sección 4.3.3:

vo1 = −R3

R1v1 (27)

Repaso de prerrequisitosCurso 2019/2020

21

Page 22: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

(a) (b) (c)

Figura 12. Sumador inversor (a) y circuitos para resolver por superposición en función de v1 (b) y v2 (c).

Realizando un análisis análogo sobre el circuito de la Figura 12(c) se obtiene la ecuación (28).

vo2 = −R3

R2v2 (28)

El resultado final es pues:

vo = −R3

(v1R1

+v2R2

)(29)

Observe que el circuito permite realizar una suma ponderada de las entradas aunque, eso sí, elresultado tiene el signo contrario. Si se quisieran sumar más términos bastaría con añadir tantasresistencias en paralelo con R1 como señales se tengan.

4.3.6. Sumador no inversor

Por supuesto, también existe una versión no inversora del sumador (Figura 13(a)). Para obtener laganancia se procede de igual modo que en el caso anterior, aplicando superposición. Si empezamosanalizando la Figura 13(b), el valor de la tensión v+ depende del divisor de tensión de R1 y R2:

v+1 =R2

R1 +R2v1 (30)

A partir de aquí se trata de un amplificador no inversor estándar por lo que:

vo1 =

(R4

R3+ 1

)R2

R1 +R2v1 (31)

(a) (b) (c)

Figura 13. Sumador no inversor (a) y circuitos para resolver por superposición en función de v1 (b) y v2 (c).

22 Repaso de prerrequisitosCurso 2019/2020

Page 23: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

Fíjese en que hasta este punto no hay ninguna diferencia con la ecuación (24) del amplificadordiferencial. Si repetimos el proceso pasivando ahora v1 (Figura 13(c)), el divisor es justo el contrarioque el anterior, por lo que sumando la contribución de ambos subcircuitos se llega a:

vo =

(R4

R3+ 1

)(R2

R1 +R2v1 +

R1

R1 +R2v2

)(32)

En el caso de que hubiera más de dos entradas, los divisores de tensión para calcular v+ en funciónde cada una de ellas se complican ligeramente, aunque no debería suponer ningún problema si tienecuidado con los paralelos.

4.3.7. Resumen de configuraciones típicas

Configuración Circuito Fórmula

Comparadorsin histéresis vo =

{L+ si v+ > v−

L− si v+ < v−

Buffer oseguidor

vo = vi

Amplificadorno inversor vo =

(R2

R1+ 1

)vi

Amplificadorinversor

vo = −R2

R1vi

Amplificadordiferencial

vo =

(R4

R3 +R4

)(R2

R1+ 1

)v2 −

R2

R1v1

Si R1 = R3 y R2 = R4:

vo =R2

R1(v2 − v1)

Repaso de prerrequisitosCurso 2019/2020

23

Page 24: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

Configuración Circuito Fórmula

Sumadorinversor

vo = −Rf ·n∑

i=1

viRi

Para el caso de dos entradas (n = 2):

vo = −Rf

(v1R1

+v2R2

)

Sumadorno inversor

vo =

(Rf

Rg+ 1

n∑i=1

‖ R{1,...,n}\{i}Ri+ ‖ R{1,...,n}\{i}

vi

Para el caso de dos entradas (n = 2):

vo =

(Rf

Rg+ 1

)(R2

R1 +R2v1 +

R1

R1 +R2v2

)

5. Bibliografía y recursos online5.1. Electrónica digital y programación en C

J. D. Muñoz Frías, Introducción a los sistemas digitales, γ Ed., Dic. 2013.

Á. Sánchez Miralles, Sistemas electrónicos digitales, 3a Ed., Sep. 2013.

Microchip Technology Inc., MPLAB® XC16 C Compiler User’s Guide, 2014.

https://www.programiz.com/c-programming/ — Tutorial muy bien explicado, con diagramas quefacilitan la comprensión de los conceptos y ejemplos comentados con mucho detalle.

https://www.learn-c.org/ — Curso interactivo de C elaborado a partir de ejemplos. La principaldiferencia respecto a otros tutoriales, es que propone ejercicios al final de cada módulo que se puedenresolver escribiendo el código directamente en el navegador, sin necesidad de instalar nada.

https://www.tutorialspoint.com/cprogramming/ — Muy completo, abarca desde lo más básicohasta conceptos avanzados. El inconveniente es que está todo mezclado por lo que no resultademasiado didáctico si no tiene experiencia previa en C o ha enterrado sus conocimientos en los másrecóndito de su cerebro. En cambio, es interesante para aquellos que tengan una buena base de C yquieran profundizar más allá de lo necesario para cursar con éxito esta asignatura.

https://en.wikibooks.org/wiki/C_Programming — Libro de programación en C de la Wikipedia.Exhaustivo, aunque bastante arduo para sentarse a leerlo de principio a fin. Es más bien material deconsulta para resolver dudas puntuales. También está disponible en español.

https://repl.it/languages/c — Compilador online de C para ejecutar código rápidamente.

24 Repaso de prerrequisitosCurso 2019/2020

Page 25: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

5.2. Electrónica analógica

P. Scherz y S. Monk, Practical Electronics for Inventors, 4a Ed., McGraw-Hill Education, Abr. 2016.ISBN-13: 978-1-259-58754-2

A. S. Sedra y K. C. Smith, Microelectronic Circuits, 7a Ed., Oxford University Press, Nov. 2015. ISBN-13:978-0-199-33914-3

P. Horowitz y W. Hill, The Art of Electronics, 3a Ed., Cambridge University Press, Abr. 2015. ISBN-13:978-0-521-80926-9

T. C. Hayes y P. Horowitz, Learning the Art of Electronics — A Hands-On Lab Course, 1a Ed., CambridgeUniversity Press, Mar. 2016. ISBN-13: 978-0-521-17723-8

https://www.allaboutcircuits.com/textbook/ — Libro de texto de acceso abierto sobre funda-mentos de circuitos y electrónica. En el Volumen III hay capítulos dedicados específicamente a losamplificadores operacionales.

6. Ejercicios1. Realice las conversiones entre sistemas de numeración que faltan.

Tipo de dato Decimal Binario Hexadecimal

char -7

char 0x7A

unsigned char 1000 1100

int 20000

int 1111 1111 0000 0000

unsigned int 0x147E

2. Resuelva las siguientes expresiones con operadores lógicos.

int a = 0x001B; // ! (NOT) // >= (Mayor o igual que)

int b = 0x0000; !a = a >= d =

int c = -2; !b =

int d = 27; // < (Menor que)

// == (Igualdad) b < c =

// && (AND) a == d =

a && b = // <= (Menor o igual que)

c && d = // != (Desigualdad) b <= d =

a != c =

// || (OR) // Combinaciones

a || b = // > (Mayor que) (a > c) && (b < d) =

c || d = c > d = !((a && b) || c) =

Repaso de prerrequisitosCurso 2019/2020

25

Page 26: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

3. ¿Cuál es el valor hexadecimal de las siguientes operaciones a nivel de bit?

int a = 0xDEAC; // ^ (XOR)

int b = 0x1CA1; a ^ d =

int c = 0xF423; b ^ c =

unsigned int d = 0xFC07;

// << (Desplazamiento a la izquierda)

// & (AND) a << 2 =

a & c = c << 8 =

b & d =

// >> (Desplazamiento a la derecha)

// | (OR) c >> 4 =

a | b = d >> 6 =

c | d =

// Combinaciones

// ~ (NOT, complemento a 1) ((b << 4) ^ d) | c =

~c = ((a ^ c) | ~a) & b =

4. Sea una variable entera a de 16 bits. Con una sola línea de código:

Escriba un 0 en los bits 7 y 9 de a sin alterar los demás bits.

A partir del resultado anterior, escriba un 1 en los bits 6 y 8 sin modificar el resto.

Guarde en b el valor de los pines 8 a 11.

26 Repaso de prerrequisitosCurso 2019/2020

Page 27: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

5. ¿Qué valor toman las variables después de ejecutar cada una de las líneas del siguiente programa?

int a = -2;

int b = 4;

int c;

c = a–; // a = b = c =

c >>= 1; // a = b = c =

c += b - a; // a = b = c =

a = ++b; // a = b = c =

c = b / 2; // a = b = c =

c = a % c; // a = b = c =

c *= b; // a = b = c =

6. ¿En cuáles de los siguientes fragmentos de código se verifica la condición, o lo que es lo mismo,cuánto vale b?

// Código #1

int a = -1;

int b = 0;

if (a) {

b = 1;

}

b =

// Código #2

int a = 0;

int b = 0;

if (a = 0) {

b = 1;

}

b =

// Código #3

int a = 0;

int b = 0;

if (a = 1) {

b = 1;

}

b =

// Código #4

int a = 0;

int b = 0;

if (a) {

b = 1;

}

b =

7. Escriba un programa en C que sume los cinco elementos de un vector de tipo int.

// Usando un bucle for // Usando un bucle while

Repaso de prerrequisitosCurso 2019/2020

27

Page 28: Repaso de prerrequisitos - Academia Cartagena99 de prerre… · el curso al máximo. Si después de leerlo considera que necesita revisar los fundamentos con más profundidad, puede

SISTEMAS ELECTRÓNICOSAPUNTES

8. Teniendo en cuenta que el operacional está alimentado entre 3,3 V y 0 V, calcule la ganancia delcircuito y determine la tensión de salida para los valores de vi indicados en la tabla.

Resultados

vovi

=

vi = 1V vo =

vi = −0,1V vo =

vi = −1V vo =

9. Con el sentido indicado en la figura, ¿cuál es el valor de la corriente i que está suministrando eloperacional en el siguiente circuito si vi = 0,1V?

10. Obtenga la expresión que relaciona las tensiones de entrada con la tensión de salida vo.

28 Repaso de prerrequisitosCurso 2019/2020