martes, 15 de abril de 2008




Diseño dos osciladores


Elección da frecuencia de mostreo do sistema


A frecuencia máxima de muestreo virá determinada polo tempo que lle leva ao convertidor dixital-analóxico xerar unha saida estable. Segundo as follas de características o período mínimo para o peor caso é de 12us. Esto permítenos unha frecuencia máxima de 83kHz.


Por outra banda, a frecuencia mínima de mostreo ven dada polo dobre da máxima frecuencia analóxica coa que se vai traballar, que neste caso será de 2*1633Hz=3266Hz para cumprir o criterio de Nyquist.


Outra restricción a maiores é que a frecuencia debe poder xerarse a partir do oscilador incluido na placa que é de 50MHz.


Esta marxe é moi amplia, pero co fin de non incorporar un filtro analóxico á saida do sistema empregaremos sobremostreo. A contraparte desto será unha menor precisión na frecuencia debido á cuantificación dos coeficientes.


En canto a esta, empregaremos o menor número de bits necesarios. Partimos de I1Q11 debido ao número de bits cos que traballa o convertidor, pero un coeficiente é maior que 1 nalgún caso (en módulo) , polo que como mínimo será I2Q10 se mantemos o número total de bits.


O estándar esixe que as frecuencias xeradas estean nun marxe de 1.5% da especificada, polo que debemos realizar a elección do número de bits dos coeficientes do filtro acorde con esto. Para este propósito escribimos dous scripts en Matlab, un que xera o filtro a partir dunha frecuencia discreta, e o outro que calcula a tolerancia despois da cuantificación:




script 1
function [num,den]=filtro(omega_discreta)
num=[1 -cos(omega_discreta)];
den=[1 -2*cos(omega_discreta) 1];
end




script 2
Q=10;
Ts=1/50000;
frec_analoxicas=[697 770 852 941 1209 1336 1477 1633];
w=2*pi*frec_analoxicas*Ts;
for k=1:length(frec_analoxicas)
%%filtro sen cuantificar
[N,D]=filtro(w(k));
%%filtro cuantificado
Dc=round(D*2^Q)/2^Q;
dif=phase(roots(D))-phase(roots(Dc));
tol=max(abs(dif))/Ts/2/pi;
fprintf('frec=%iHz => tolerancia=%iHz => %i%%\n',frec_analoxicas(k),tol,tol/frec_analoxicas(k)*100)
end






A saida xerada é:


frec=697Hz => tolerancia=6.601286e+000Hz => 9.470998e-001%


frec=770Hz => tolerancia=1.671428e+001Hz => 2.170685e+000%


frec=852Hz => tolerancia=9.872585e+000Hz => 1.158754e+000%


frec=941Hz => tolerancia=9.995271e+000Hz => 1.062197e+000%


frec=1209Hz => tolerancia=1.046912e+001Hz => 8.659324e-001%


frec=1336Hz => tolerancia=4.765929e+000Hz => 3.567312e-001%


frec=1477Hz => tolerancia=3.688330e+000Hz => 2.497177e-001%


frec=1633Hz => tolerancia=5.679399e-001Hz => 3.477893e-002%




onde detectamos que para 770Hz supérase o 1.5%, polo que empregaremos un bit a maiores.


Repetindo esto para I2Q11 obtemos:


frec=697Hz => tolerancia=6.601286e+000Hz => 9.470998e-001%


frec=770Hz => tolerancia=3.221402e+000Hz => 4.183639e-001%


frec=852Hz => tolerancia=8.291335e+000Hz => 9.731614e-001%


frec=941Hz => tolerancia=6.503294e+000Hz => 6.911046e-001%


frec=1209Hz => tolerancia=2.325194e+000Hz => 1.923238e-001%


frec=1336Hz => tolerancia=4.765929e+000Hz => 3.567312e-001%


frec=1477Hz => tolerancia=3.688330e+000Hz => 2.497177e-001%


frec=1633Hz => tolerancia=5.679399e-001Hz => 3.477893e-002%




co que sí cumplimos a restricción.




En cuanto aos efectos da precisión finita dentro dos filtros simulamos a resposta con Matlab valéndonos do Toolbox de procesado de sinal: mediante o fdatool definimos a lonxitude dos acumuladores, coeficientes e rexistros e mediante dfilt/filter() xeramos un tono de 10 segundos para comprobar a resposta final:








No hay comentarios: