Esto funciona para un condensador ideal, es decir, si puedes ignorar ESR
Deje \ $ I \ $ = magnitud de la corriente a través del circuito, \ $ U_C \ $ = magnitud de la tensión a través de un capacitor, y \ $ X_C \ $ = la reactancia de un capacitor (todos son positivos reales números).
Como primer paso, puedes encontrar \ $ X_C \ $:
$$ X_C = \ frac {U_C} {I} $$
Luego, utilice la siguiente relación para la impedancia total (como un número complejo)
$$ Z = R - jX_C $$
donde \ $ j \ $ es la unidad imaginaria, puede encontrar el ángulo de fase para el voltaje a través de un capacitor
$$ \ varphi = - \ arctan \ left (\ frac {X_C} {R} \ right) $$
En cuanto a \ $ I \ $ y \ $ U_C \ $, puede encontrar estas magnitudes al promediar las muestras de ADC en un número entero de periodos y escalar en \ $ \ frac {\ pi} {2} \ $:
$$ I = \ frac {\ pi} {2N} \ sum_ {i = 1} ^ N | I_i | $$
$$ U = \ frac {\ pi} {2N} \ sum_ {i = 1} ^ N | U_i | $$
El factor \ $ \ frac {\ pi} {2} \ $ surge de la proporción entre la magnitud y el promedio del valor absoluto para una onda sinusoidal. Por cierto, puedes ignorar este factor, ya que se cancelará en \ $ X_C = \ frac {U_C} {I} \ $.
Si no puedes ignorar ESR
Luego puedes calcular el desplazamiento de fase usando un álgebra lineal. Para los vectores \ $ \ mathbf {v} \ $ y \ $ \ mathbf {w} \ $
$$ \ cos (\ varphi) = \ frac {\ mathbf {v} \ cdot \ mathbf {w}} {\ | \ mathbf {v} \ | \ | \ mathbf {w} \ |} $$
y puede tratar las señales muestreadas como vectores multidimensionales, utilizando
$$ \ mathbf {v} \ cdot \ mathbf {w} = \ sum_ {i = 1} ^ N v_i w_i $$
$$ \ | \ mathbf {v} \ | = \ sqrt {\ sum_ {i = 1} ^ N v_i ^ 2} $$
(muestreo en un número entero de períodos)
Sustituya \ $ v_i = U_i \ $ y \ $ w_i = I_i \ $ para la fórmula final
$$ \ varphi = \ arccos \ left (\ frac {\ mathbf {U} \ cdot \ mathbf {I}} {\ | \ mathbf {U} \ | \ | \ mathbf {I} \ |} \ derecha) $$
donde \ $ U_i \ $ es el voltaje muestreado a través de un condensador y \ $ I_i \ $ es la corriente muestreada a través del circuito.
EDIT:
En MATLAB o Octave puedes probar lo siguiente:
>> t = linspace(0, 2*pi*10, 100);
>> x = sin(t);
>> y = sin(t + 0.123);
>> phase_shift = acos(dot(x, y)/(norm(x)*norm(y)))
phase_shift = 0.12422
Hay algún error (0.12422 vs 0.123) debido a un número relativamente pequeño de muestras (100).
Por cierto, \ $ \ cos (-x) = \ cos (x) \ $ (función par), por lo que no puede determinar el signo. Esto no es un problema, ya que para un condensador el signo siempre es el mismo.