Simulación de circuto para lectura de tensión

Para un proyecto de robótica que estoy comenzando, basado en versiones de los rover marcianos de NASA, necesitaba diseñar un circuito para hacer la lectura de la corriente que circula por un motor controlado mediante un driver Allegro A4953. Este driver tiene un pin LSS en el que se puede conectar una resistencia \(R_S\) para medir la corriente del motor, que se obtiene simplemente dividiendo la tensión \(V_S\) en la resistencia por el valor de la misma:

\begin{equation*} I_{motor} = \frac{V_S}{R_S} \end{equation*}

Las conexiones del chip se muestran en la hoja de datos:

Conexiones del A4953

El esquema del circuito se hizo en KiCad y se simuló con ngspice. La tensión en la resistencia \(R_S\), \(V_S\), se simula usando una fuente de tensión (\(V_1\) en el esquema) cuyo valor se hace variar entre los valores máximo y mínimo.

Esquema

Cálculos

Resistencia \(R_S\)

En la hoja de datos del driver se especifica que el valor de la tensión en la \(R_S\) debe ser menor, en valor absoluto, que \(0.5V\). Para calcular esta resistencia, se da una expresión en función de \(I_{max}\), la corriente máxima que puede circular por el motor, \(A\), una ganancia interna que se define con el valor \(10\), y \(V_{ref}\), la tensión que se aplique en el pin VREF:

\begin{equation*} I_{max} = \frac{V_{ref}}{A R_S} \end{equation*}

Para una corriente máxima de \(1.1A\) y \(V_{ref} = 5V\):

\begin{equation*} R_S = \frac{V_{ref}}{A I_{max}} = \frac{5V}{10 \times 1.1A} = 0.45 \Omega \end{equation*}

Eligiendo \(R_S = 0.4 \Omega\), la tensión máxima que se tendrá en LSS es, en valor absoluto, \(V_S = 0.4 \Omega \times 1.1A = 0.44V < 0.5V\), por lo que la tensión en LSS estará comprendida entre \(-0.44V\) y \(+0.44V\).

Adaptación de tensiones

Este rango de tensiones será leído mediante el conversor analógico/digital (ADC) de un Arduino Nano, que registra tensiones entre \(0\) y \(5V\) con una resolución de 10 bit (1024 cuentas), por lo que es necesario adaptar estas tensiones a valores adecuados para tener una resolución decente en la lectura. Idealmente, se intentaría usar todo el rango \((0V, 5V)\) del ADC, pero conviene dejar márgenes de seguridad para asegurar que no se alcanzan los máximos y para evitar que el amplificador operacional que hará la adaptación trabaje en los extremos (\(0V\) y \(VCC\)), lo que puede producir valores erróneos.

La adaptación de tensiones se realiza usando un amplificador operacional LM358 configurado como amplificador no inversor. En esta configuración, la ganancia es positiva, por lo que el primer obstáculo está en transformar el rango de tensiones en LSS para que todas sean positivas. Para ello se coloca en serie con la tensión \(V_S\) un diodo alimentado desde el pin de \(3.3V\) del Arduino que sumará su tensión de codo, unos \(0.66V\) de promedio, al valor de \(V_S\), por lo que se pasa a tener un rango de tensiones \((Vd-Vs, Vd+Vs) = (0.23V, 1.09V)\), todas positivas. Estas tensiones, \(V_M\) en el esquema y en la gráfica, se pasan como entrada a la etapa amplificadora para adaptarlas al rango \((0V, 5V)\) del ADC.

Amplificador operacional

La ganancia del amplificador no inversor viene dada, en este circuito, por

\begin{equation*} A_v = 1 + \frac{R_4}{R_2+R_3} \end{equation*}

y la tensión en la salida será

\begin{equation*} V_{OUT} = A_v V_M \end{equation*}

Según las especificaciones del LM358, en la salida de este operacional se pueden obtener tensiones entre \(0V\) y \(VCC-1.5V\), por lo que si fijamos un valor máximo aproximado de tensión en el ADC de \(4.5V\) se tiene que VCC debe ser igual a \(6V\), que es una de las tensiones que se va a usar en la placa definitiva. Ese valor máximo también da un margen de seguridad en la tensión medida en el ADC.

Para obtener \(4.5V\) en la salida cuando se tienen \(1.09V\) enla entrada necesitamos una ganancia de tensión igual a

\begin{equation*} \frac{4.5V}{1.09V} = 4.13 = 1 + \frac{R_4}{R_2+R_3} \end{equation*}

por lo que la relación \(\frac{R_4}{R_2+R_3}\) tiene que ser menor o igual a \(3.13\) para no sobrepasar los \(4.5V\). Seleccionando \(R_2+R_3 = 110 \: k \Omega\) y \(R_4 = 330 \:k \Omega\) se obtiene una relación de \(3\) y una ganancia \(A_v = 4\).

Con esta ganancia el rango de tensiones en la salida del amplificador será

\begin{equation*} V_{OUT} = (A_v \times 0.23, \: Av \times 1.09) = (0.90V, \: 4.35V) \end{equation*}

que se corresponden con valores medidos en el ADC de \((184, 890)\), utilizando un \(69 \%\) del rango del ADC.

Simulación

La gráfica siguiente muestra el resultado de la simulación para los parámetros \(V_S\), \(V_M\) y \(V_{OUT}\) cuando \(V_S\) se hace variar entre \(-0.44V\) y \(+0.44V\).

Plot

La simulación devuelve los siguientes valores de las tensiones \(V_M\), tras sumar la tensión de codo del diodo, y \(V_{OUT}\), a la salida del amplificador, para los casos en que \(V_S\) toma los valores mínimo, \(0\) y máximo:

\(V_S\) \(V_M\) \(V_{OUT}\)
\(-0.44\) \(0.23\) \(0.90\)
\(0.00\) \(0.66\) \(2.63\)
\(+0.44\) \(1.09\) \(4.35\)

Se puede ver cómo \(V_M\) toma valores siempre positivos, por lo que no hay problemas en el amplificador. También se ve que la tensión a la salida está en el rango del conversor ACD.

Resolución en corriente

Se puede calcular la resolución de la medida de corriente por el motor, es decir cuánto cambia la corriente por cada cuenta del ADC.

La tensión de salida del amplificador es:

\begin{equation*} V_{OUT} = A_v(R_S i_S + V_d) \end{equation*}

siendo \(i_S\) la corriente que circula por \(R_S\) (se desprecia la corrientes que circula por el diodo, del orden de \(1 mA\)) y \(V_d\) la tensión de codo en el diodo.

Expresado como cuentas del ADC:

\begin{equation*} N = \frac{1024}{5} V_{OUT} \end{equation*}

Si tomamos dos medidas consecutivas del ADC, \(N1\) y \(N2 = N1 + 1\):

\begin{equation*} N2 - N1 = \frac{1024}{5} Av (R_S i_2 + V_d) - \frac{1024}{5} Av (R_S i_1 + V_d) \end{equation*}

Operando:

\begin{equation*} 1 = \frac{1024}{5} Av R_S (i_2 - i_1) \end{equation*}

y se tiene:

\begin{equation*} i2 - i1 = \Delta i = \frac{5}{1024 \: A_v R_S} = 3.05 \dfrac{mA}{cuenta} \end{equation*}

Es decir, se tiene una resolución en la medida de corriente que circula por el motor de unos \(3 \: mA\).