Pulse Width Modulation - PWM

Simulação de PWM em Octave

Um amplificador Class D é qualquer deste tipo:

Ref.: Wikipidia

Tem um eficiência da ordem dos 90% e pode ser encontrado, por exemplo, em telemóveis. O seu baixo consumo, para a potência que conseguem produzir, torna-os quase perfeitos para essas utilizações.

Vejamos como implementar a ideia de codificar um sinal de entrada comparando-o com uma função dente-de-serra e depois recuperar o sinal inicial. Vamos usar o Octave.

A ideia é comparar um sinal de entrada com uma onda triangular ou tipo dente-de-serra. A função seguinte implementa em Octave a função dente-de-serra com frequência ajustável

function retval=sawtooth(x,w)
  n=length(x);
  retval=2*(x/w-floor(x/w+.5));
endfunction;
O sinal de entrada é dado por
function retval=f(x,a,w)
  retval = a*sin(2*pi*w*x);
endfunction;

A comparação é feita da seguinte forma: se o sinal de entrada é maior ou igual que o sinal dente-de-serra então o resultado da comparação é 1; 0 caso contrário.

function retval=compare(x,y)
  n=min(length(x),length(y));
  for i=1:n
    if (x(i)>=y(i))
     retval(i)=1;
    else
      retval(i)=0;
    endif;
  endfor;
endfunction;

A figura seguinte mostra as funções implementadas acima.

O último gráfico mostra o resultado da comparação, uma função que toma apenas dois valores mas para a qual a duração desses patamares de valores constantes estão relacionados com a amplitude do sinal de entrada.

Como recuperar agora o sinal de entrada. A maneira mais simples seria simplesmente integrar no tempo este último sinal. No entanto, se o fizermos, sem nenhuma correcção, estamos a incluir uma componente linear que surge da acumulação das diversas partes onde o sinal de comparação é não nulo (esta correcção introduz uma oscilação de alta frequência igual à frequência do sinal de dente-de-serra). A função seguinte implementa a integração.

function retval=integrate(x,y)
  n=min(length(x),length(y));
  for i=1:n
    retval(i)=trapz(x(1:i),y(1:i));
  endfor;
endfunction;

Vejamos, para que se perceba as funções seguintes, o resultado final. A figura seguinte mostra a vermelho o sinal original e a azul o resultado da integração com a correcção do crescimento linear.

É claramente visível na curva azul as oscilações impostas pela baixa frequência do sinal de comparação dente-de-serra. O aumento da frequência corrige parte dessas oscilações. Uma das formas de corrigir essas oscilações é fazer uma média móvel com uma periodicidade adequada. Isso pode ser feito com a função

function retval=movmean(x,n)
  m=length(x);
  mp=floor(m/n);
  retval(1)=mean(x(1:n));
  for i=1:mp-1
    l=i*n+1;
    r=(i+1)*n;
    retval(i)=mean(x(l:r));
  endfor;
endfunction;
O resultado final com a correcção das médias móveis dá:

O código usado para gerar estes gráficos é:

# Pulse Width Modulation example
#1;
clf
clear all

# Parameters
nx=10000;
xmin=0;
xmax=4;
x=linspace(xmin,xmax,nx);
T=.1
1/T
sw=1;
np=floor((xmax-xmin)/T);
nt=floor(nx/np);
a=.5

# Plotting
subplot(4,1,1)
hold on
plot(x,sawtooth(x,T))
plot(x,f(x,a,sw),'r')
axis([min(x) max(x) -1.5 1.5])

subplot(4,1,2)
z=compare(sawtooth(x,T),f(x,a,sw));
plot(x,z)
axis([min(x) max(x) -.5 1.5])

subplot(4,1,3)
hold on
w=integrate(x,z-mean(z));
w=(w-mean(w));
w=a*w/max(w);
plot(x,w)
plot(x,f(x,a,sw),'r')

subplot(4,1,4)
hold on
plot(movmean(w,nt),'b')
plot(movmean(w,nt),'or')

No exemplo anterior a frequência do sinal de comparação tem o valor 10 enquanto o sinal de input tem frequência 1. Vejamos o que acontece quando se aumenta a frequência do sinal dente-de-serra. Com frequência igual a 20

e com frequência igual a 50

As oscilações de introduzidas pelo ajuste linear estão agora bastante mais reduzidas e recuperamos o sinal de input quase perfeito.

Claro que, por causa correcção das médias móveis, o vector final não tem o mesmo número de componentes. A função seguinte corrige isso mesmo

function retval=adjust(t,x)
  m=length(t);
  n=length(x);
  l=floor(m/n);
  retval=x(1)*ones(1,l);
  for i=2:n
    retval=[retval x(i)*ones(1,l)];
  endfor;
  k=mod(m,n);
  retval=[retval zeros(1,k)];
endfunction;

O último gráfico é agora obtido através de

plot(x,adjust(x, movmean(w,nt)),'b')
plot(x,adjust(x, movmean(w,nt)),'r.')
Palavras chave/keywords: Amplificador, Classe D, PWM

Criado/Created: NaN

Última actualização/Last updated: 10-10-2022 [14:25]


Voltar à página inicial.


GNU/Emacs Creative Commons License

(c) Tiago Charters de Azevedo