<style> .reveal { font-size: 32px; } </style> ## Programação de microcontrolador para conversão AD e modulação PWM ---- ### Introdução Os microcontroladores consistem em um único circuito integrado que apresenta um núcleo de processador, memórias (voláteis e não voláteis) e determinados periféricos de entrada e de saída de informações. Dentre as capacidades do microcontrolador se encontra, devido a presença de um conversor analógico-digital, a possibilidade de converter sinal analógico em digital. ---- ### Avaliação da conversão AD Com o objetivo de estudar sobre a conversão A/D, buscou-se, a priori, realizar uma leitura analógica através da função analogRead, por meio da porta analógica A0. Usando como suporte o código a seguir, realizou-se a digitalização da entrada $V_{in}$ promovendo uma varredura de 0 a 5V com um passo de 0.5V #### Código para realizar a leitura analógica ```c++=1 void setup() { Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); Serial.println(sensorValue); } ``` Como mecanismo de alterar a entrada analógica optou-se pela utilização de um potenciômetro que representa uma variável analógica que pode assumir diversos valores. ---- | Esquemático do Circuito | | :--------: | | <img src="https://i.imgur.com/j417ya1.png"/> | | Figura 1 - Esquemático para avaliação da conversão AD | ---- | Saída do monitor serial | | :--------: | | <img src="https://i.imgur.com/slh5g9J.png"/> | | Figura 2 - Saída serial para entrada de 1.0V | ---- | Tensão de entrada $V_{in,DC}\space(V)$ | Valor decimal | |:--------------------------------------:|:-------------:| | 0.5 | 102 | | 1.0 | 204 | | 1.5 | 306 | | 2.0 | 408 | | 2.5 | 511 | | 3.0 | 613 | | 3.5 | 715 | | 4.0 | 818 | | 4.5 | 920 | | 5.0 | 1022 | ###### Tabela 1 - Varredura da tensão de entrada ---- | Gráfico $V_{in,DC} \times Valor\space decimal$ | | :--------: | | <img src="https://i.imgur.com/vS9FbkZ.png" width="700px"/> | | Figura 3 - Gráfico comparativo tensão de entrada e valor serial decimal | ---- ### Avaliação da operação do PWM O próximo passo do trabalho, após realizar a conversão AD foi, implementar a modulação por largura de pulso (PWM) através da função analogWrite, responsável por acionar uma onda PWM num pino qualquer. ```c++=1 void setup() { pinMode(5,OUTPUT); } void loop() { analogWrite(5, 0); // Segundo parâmetro // variado (D) } ``` ---- | Esquemático do circuito para avaliação do PWM | | :--------: | | ![](https://i.imgur.com/IhFgkzj.png) | | Figura 4 - Esquemático do circuito para avaliação do PWM | ---- #### Resultados da simulação | D=0 | D=51 | D=102 | |:------------------------------------:|:------------------------------------:|:------------------------------------:| | ![](https://i.imgur.com/4ONILkQ.png) | ![](https://i.imgur.com/qJySWdp.png) | ![](https://i.imgur.com/QmqOW7b.png) | | **D=153** | **D=204** | **D=255** | | ![](https://i.imgur.com/rVlhK56.png) | ![](https://i.imgur.com/5pNssEF.png) | ![](https://i.imgur.com/BaNOQdT.png) | ###### Figura 5 - Avaliação dos resultados para cada ciclo de trabalho ---- Para além das observações feitas acima, é fundamental realizar o cálculo do ciclo de tarefa relacionado para cada valor testado acima. Com uma frequência e período definidos, calculou-se o ciclo de tarefa relacionado: $$ \left\{ \begin{array}{c} f=976.7Hz \\ T=1.02ms \\ \end{array} \right.\tag{2} $$ ---- A seguir, na tabela 2, para cada valor testado durante a varredura, determinou-se o ciclo de tarefa relacionado e, como já previsto, aumenta-se o tempo em que a variável se encontra em nível lógico alto, conforme eleva-se a varredura: | D | $t (\mu s)$ | $D_{\%}$ | |:---:|:-----------:|:--------:| | 0 | 0 | 0% | | 51 | 210.9 | 20.67% | | 102 | 421.9 | 41.36% | | 153 | 616.6 | 60.45% | | 204 | 820.7 | 80.46% | | 255 | 1020.3 | 100.00% | ###### Tabela 2 - Cálculo do ciclo de trabalho ---- ### Modulação PWM de um entrada senoidal O código responsável por exercer essa ação está elucidado a seguir. Para implementar a tarefa fez-se uso da função map, esta última faz com que a leitura analógica da função senoidal (que varia de 0 a 1023) seja recebida pela variável output numa escala de 0 a 255: ```c=1 void setup() { pinMode(5,1); } void loop() { int input = analogRead(A0); int output = map(output, 0, 1023, 0, 255); analogWrite(5, output); } ``` ---- O circuito responsável por realizar a modulação PWM de uma entrada senoidal está elucidado na figura 6 a seguir: | Esquemático do circuito para modulação PWM | | :--------: | | ![](https://i.imgur.com/zhaFPko.png) | | Figura 6 - Esquemático do circuito para modulação PWM de uma entrada senoidal | ---- | $f=10Hz$ | $f=100Hz$ | |:-------------:|:--------------:| | <img src="https://i.imgur.com/vpgMPk7.png" width="350px"/> | <img src="https://i.imgur.com/15I16e3.png" width="350px"/> | | **$f=500Hz$** | **$f=1000Hz$** | | <img src="https://i.imgur.com/VgpkrxE.png" width="350px"/> | <img src="https://i.imgur.com/6p2Gdk4.png" width="350px"/> | ###### Figura 7 - Avaliação da modulação da senoide para diversas frequências ---- | Análise dos registradores TCCR0B e ADCSRA | | :--------: | | ![](https://i.imgur.com/ugmMrX0.png) | | Figura 8 - Valores dos registradores TCCR0B e ADCSRA do ATMega328P | ---- ### Configuração dos bits do registrador TCCR0B | Divisor de frequência | | :--------: | | ![](https://i.imgur.com/x17W04C.png) | | Figura 11 - Tabela 14.9 do datasheet, configuração dos registradores para prescaler | ---- Como sabemos o valor atual do registrador, essa operação será realizada a seguir alterando somente os bits necessários, por isso essa configuração (instrução em código) poderia ser diferente se nos deparássemos com um outro microcontrolador em uma situação prática. O código final pode ser visto abaixo: ```c=1 void setup() { pinMode(5,1); TCCR0B&=~(1<<CS01); } void loop() { int input = analogRead(A0); int output = map(output, 0, 1023, 0, 255); analogWrite(5, output); } ``` ---- | Resultados anteriores | Resultados após ajuste | | :----------------: | :--------------------: | | ![](https://i.imgur.com/cORf6m1.png) | ![](https://i.imgur.com/dTEy6Oo.png) | ###### Figura 12 - Comparação dos resultados anteriores e após ajuste no registrador TCC0B É possível perceber pela figura 12 que o sinal após o ajuste consegue representar melhor a senoide. Esta senoidel utilizada possui frequência $f=1kHz$. ---- | Análise dos registradores TCCR0B e ADCSRA | | :--------: | | ![](https://i.imgur.com/y0XUWz6.png) | | Figura 13 - Valores dos registradores TCCR0B e ADCSRA do ATMega328P | Analisando os registradores, podemos ver a mudança realizada. ---- ### Configuração dos bits do registrador ADCSRA para fs = 76.9KHz | Bits para prescaler do clock do ADC | | :--------: | | ![](https://i.imgur.com/zqwOgvO.png) | | Figura 15 - Bits ADSP2, ADSP1, ADSP0 para prescaler do clock do ADC | Estes bits se encontram nos espaços de memória dos bits menos significativos do registrador ADCSRA. ---- Assim, para obter um fator de divisão de 16, deve-se configurar os bits com os valores **0b100**, como é de conhecimento o valor anterior deste registrador, o código para mudar os bits para os desejados (para esta ocasião) está descrito abaixo: ```c=1 void setup() { TCCR0B&=~(1<<CS01); ADCSRA&=~(1<<ADPS1); ADCSRA&=~(1<<ADPS0); pinMode(5,1); } void loop() { const int output = map(analogRead(A0), 0, 1023, 0, 255); analogWrite(5, output); } ``` ---- Para se avalizar o resultado, tomamos um intervalo de $\frac{\lambda}{4}$ como mostra o gráfico abaixo: | Resultado anterior | Resultado após ajuste em ADCSRA | | :--------: | :--:| | <img src="https://i.imgur.com/EpFQCZN.png" width="300px"/> | <img src="https://i.imgur.com/QpaZh2m.png" width="320px"/> | ###### Figura 17 - Comparação dos resultados após ajuste no registrador ADCSRA ---- ### Conclusões A partir do presente trabalho foi possível compreender diversas funcionalidades de um microcontrolador, entre elas, a sua capacidade de converter sinais analógicos em digitais com uma precisão de 10 bits, no caso do microcontrolador utilizado. Além disso, pode-se compreender conceitos importantes como modulação por largura de pulso (PWM) de um sinal senoidal e a possibilidade de alterar registradores de um microcontrolador com o objetivo de aumentar a frequência do PWM e a taxa de amostragem. --- ## Projeto de um filtro e conversão DA a partir do PWM ---- ### Introdução Os filtros são os responsáveis por realizar a operação de atenuação ou eliminar uma determinada faixa, enquanto permite a passagem de componentes com outras faixas de frequência. Entre as aplicações, pode-se citar: recortar uma faixa de frequência para que se observe o comportamento de um determinado sistema, ou ainda, melhorar a resposta de um determinado sistema após a retirada de componentes específicos de frequência. Dessa forma, após compreender sobre filtros e conversão analógica digital (AD), a presente etapa do trabalho busca realizar o projeto de dois filtros de ordens diferentes para promover conversão D/A a partir de um sinal PWM. ---- ## Projeto dos filtros O procedimento inicial para o trabalho foi o estudo, estruturação e desenvolvimento dos dois filtros solicitados conforme os requisitos a seguir: - Arquiteturas: filtros RC passivo e RC-Ativo - Seletividade: passa-baixas e passa banda - Frequência central (de corte): $f_0 = 1 kHz$ - RC-Ativo: $N = 2$, $K_{\omega_0} = 1$, $Q = 10$. ---- ### Projeto do Filtro RC O primeiro filtro implementado foi o de primeira ordem, também conhecido como filtro RC (Resistor - Capacitor) passivo, com frequência central de 1kHz. A seguir vê-se o procedimento realizado para o dimensionamento dos componentes: $$ f=1000Hz\\ w_{0}=1000\cdot2\pi\\ RC=\frac{1}{w_{0}}=0.0001592 \tag{5} $$ Assumindo $C=100nF$ obtemos $R=1591.549\Omega$ ---- ### Projeto do Filtro Ativo Para o projeto do filtro passa faixa de segunda ordem, utilizamos a equação de transferência: $$ T\left(s\right)\ =\ \frac{K_{max}\frac{w_{0}}{Q}s}{s^{2}+\frac{w_{0}}{Q}s+w_{0}^{2}}\tag{6} $$ De posse das espeficicações apresentadas, pode-se determinar os coeficientes numéricos da função de transferência do filtro. $$ T\left(s\right)\ =\ \frac{200\pi\ s}{s^{2}+200\pi s+4000000\pi^{2}}\\ T\left(s\right)\ =\ \frac{628.3185\ s}{s^{2}+628.3185s+39478417.60}\tag{7} $$ ---- A topologia utilizada para implementação deste filtro será a **Sallen-&-Key**. ![](https://i.imgur.com/Pr2wmhV.png) ###### Figura 19 - Filtro Ativo passa faixa ---- A função de transferência deste filtro está representada abaixo: $$ T\left(s\right)=\frac{ks\left(R_{1}C_{1}\right)}{s^{2}+s\left(\frac{1}{R_{1}C_{1}}+\frac{1}{R_{3}C_{2}}+\frac{1}{R_{3}C_{1}}+\frac{1-k}{R_{2}C_{1}}\right)+\frac{1}{\left(R_{1}//R_{2}\right)R_{3}C_{1}C_{2}}}\tag{8} $$ ---- A solução encontrada foi: - $C=100nF$ - $R_1=R_2=R_3=2250.79\space\Omega$ - $k=3.85857864376$ - $R_{4}=1000\Omega$ - $R_{5}=2858.57\Omega$ - $K_{max}=\frac{k}{4-k}=27.28$ - $R_{12}=\frac{R_{2}}{1-\alpha}=2336.42\Omega$ - $R_{11}=R_{12}\cdot\frac{1-\alpha}{\alpha}=61411.18\Omega$ ---- ### Descrição das simulações solicitadas e análise dos resultados O resultado do filtro passa baixa implementado analiticamente pode ser observado a seguir na figura 19: ![](https://i.imgur.com/QuUm1hM.png) ###### Figura 19 - Filtro passa baixa ---- Na figura 20, a seguir, é possível também, verificar a topologia do filtro passa faixa, sem, contudo, realizar a alteração promovida para definir um K máx igual a 1: ![](https://i.imgur.com/FXB5Eu3.png) ###### Figura 20 - Filtro Ativo passa faixa ---- Nas figura 21 e 22 abaixo pode-se comparar o comportamento dos dois filtros, o de primeira ordem com o seu comportamento característico e o passa faixa centralizado em 1KHz. ![](https://i.imgur.com/k41e60a.png) ###### Figura 21 - Comparação da magnitude dos filtros ---- ![](https://i.imgur.com/8KuC6ji.png) ###### Figura 22 - Comparação da fase dos filtros ---- O resultado da implementação do filtro RC dimensionado no ADS em conexão com o osciloscópio pode ser visualizado a seguir: ![](https://i.imgur.com/VRDcfPW.png) ###### Figura 23 - Simulação do filtro passivo ---- ![](https://i.imgur.com/NXSHphk.png) ###### Figura 24 - Osciloscópio do filtro passivo ---- #### Filtro ativo passa faixa O resultado da implementação do filtro RC dimensionado no ADS em conexão com o osciloscópio pode ser visualizado a seguir: <img src="https://i.imgur.com/Oihn7JQ.png" width="700px"/> ###### Figura 25 - Simulação do filtro ativo ---- ![](https://i.imgur.com/a19f4eT.png) ###### Figura 26 - Osciloscópio do filtro ativo ---- O resultado da atuação do circuito ativo é a satisfatória reconstrução do sinal senoidal com frequência 1kHz, sem, contudo, provocar uma defasagem entre os sinais. | $f=500Hz$ | $f=1000Hz$ | $f=5000Hz$ | | :---: | :-: |:----------------:| | ![](https://i.imgur.com/X0zG0wt.png) | ![](https://i.imgur.com/oyFVJLO.png) | ![](https://i.imgur.com/5i0tI3Q.png) | ###### Figura 27 - Atuação do filtro ativo passa faixa para diversas frequências ---- ### Conclusões Através da pesquisa pode-se compreender a atuação de dois tipos de filtros diferentes: o passa baixa RC e o filtro ativo passa faixa de segunda ordem. Como descrito anteriormente, o filtro passa baixa causou uma defasagem de 45° no sinal de saída com relação ao sinal de entrada PWM, por outro lado, o filtro RC ativo não causa defasagem entre a saída e a entrada. Por fim, pode-se concluir, não somente a importância dos filtros, mas também a capacidade de se utilizá-los em conjunto com microcontroladores para filtrar sinais e auxiliar na obtenção de dados desejados. --- ## Referências Noceti-Filho, Sidnei, “Filtros Seletores de Sinais,” Editora da UFSC, Florianópolis, 2003. Arduino Language Reference https://www.arduino.cc/reference/en/. LATHI, B. P. Sinais e Sistemas Lineares. 2ª Ed., Porto Alegre, Editora Bookman, 2006. 856p.
{"metaMigratedAt":"2023-06-16T12:48:09.392Z","metaMigratedFrom":"YAML","title":"Slide Programação de microcontrolador para conversão AD e modulação PWM","breaks":true,"description":"View the slide with \"Slide Mode\".","slideOptions":"{\"theme\":\"moon\",\"transition\":\"slide\"}","contributors":"[{\"id\":\"09cd127c-faed-47a5-8f63-7a0843045d46\",\"add\":25410,\"del\":10416}]"}
    429 views