50 tons de toco * Recepção de hardware de sinais codificados em PWM por microcontroladores Microchip


* NIP - Periféricos independentes de núcleo em microcontroladores de microchip, também conhecidos como CIP - Core Independent Peripheral.

Parte 4


Os artigos anteriores [ 1 ], [ 2 ] e [ 3 ] foram dedicados aos microcontroladores Microchip Periféricos dos Núcleos Independentes (NEV): células lógicas configuráveis, portas de entrada / saída com uma função limitadora de corrente e ADCs com um computador; alguns recursos desses periféricos foram mostrados. Deixe-me lembrá-lo de que a independência não está implícita no tipo de núcleo PIC dos microcontroladores (BaseLine, Mid-Range, Enhanced Mid-Range, PIC18, 16-, 32 bits), mas na operação do núcleo, ou seja, execução independente de tarefas atribuídas à periferia do estado da CPU. Esses periféricos, e em particular a possibilidade de configurá-lo para colaboração e síntese de funções de hardware, são projetados para descarregar a parte do software e reduzir o consumo de energia.

Neste breve artigo, quero mostrar exemplos da implementação da recepção de interfaces de comunicação não personalizadas “personalizadas” usando os Periféricos Independentes do Kernel.

A codificação de informações PWM é muito comum quando sinais discretos, log. 1 e log. 0, são codificados pela largura do pulso. Considere a opção de receber e decodificar esses sinais usando os controladores PIC independentes de núcleo periférico.

Decodificação PWM do sinal do sensor AM2302


Em projetos de bricolage, o sensor de temperatura e umidade DHT22 (AM2302) é frequentemente usado. O sensor possui 3 saídas, a informação é transmitida através de um único fio. Em resposta a uma solicitação (nível baixo com duração de aproximadamente 1ms), o sensor responde com um bit de início e, em seguida, uma sequência de 40 bits, onde as informações são codificadas na duração do pulso: log. "0" - impulso 30mk seg, log. "1" - 70mk seg (valores típicos). A resposta do sensor contém 5 bytes: 2 bytes de dados de umidade, 2 bytes de temperatura e 1 byte de controle.


Fig. 1. Explicações do princípio de geração de sinal do sensor DHT22.

A rede tem muitos exemplos de como trabalhar com esses sensores no Arduino. Algumas implementações de bibliotecas usam construções como:

loopCnt = TIMEOUT; while(PIN) { if(--loopCount == 0) return ErrorTimeout; } if (loopCnt < cntOne) { // bit =1 … } else { // bit =0 … } 

Em tais implementações, vejo os seguintes problemas:

- o programa para todo o tempo de medição (> 5 ms) "trava" no código de medição;
- a ocorrência de uma interrupção suficientemente longa interromperá a leitura dos dados do sensor;
- possíveis problemas com o trabalho em baixa freqüência do microcontrolador;

O algoritmo do programa de tais soluções tem aproximadamente a seguinte forma (ver Fig. 2)


Fig. 2. Um algoritmo para receber e decodificar sinais do sensor de forma programática.

A seguir, é considerada uma variante da recepção / decodificação de hardware do protocolo com sobrecarga mínima de software.

A idéia é isolar pulsos de clock do fluxo de bits, seguidos pela direção do sinal original e pulsos de clock no módulo de hardware SPI. Nesse caso, o programa do microcontrolador pode levar apenas sequencialmente 5 bytes de dados do SPI.

Parte do CIP é um cronômetro com a capacidade de acionar eventos (alterações no status de entrada ou outros periféricos). I.e. alterar o estado de entrada pode acionar um temporizador, consulte o sinal TMR6 na Fig. 3. Quando o cronômetro atinge o valor ajustado, sua contagem para e o cronômetro está no estado TMR6 = PR6 (registro de período PR). O status do timer pode ser uma entrada para uma célula lógica configurável (CLC, consulte a parte 1).

Assim, usando um timer e células lógicas, podemos gerar um sinal adequado para aplicar à entrada de relógio do SCK do módulo SPI. Para extrair informações, a duração desse bloco deve ter um valor médio entre a duração de zero e um. Então o SPI pode fixar o bit de acordo com a deterioração do bloco (veja a Fig. 3 sinal SCK).

O sinal do sensor terá pulsos falsos gerados a partir da solicitação e pulsos de início. Para que esses pulsos não interfiram na operação, você precisa habilitar o SPI apenas pela duração dos pulsos de informação ou cortar pulsos desnecessários. Também podemos resolver esse problema usando o CIP.

Outro temporizador atua como um contador de pulsos com comutação durante a recessão: escreva o número 2 no registro de período, o temporizador conta os 2 primeiros pulsos (veja o sinal TMR4 na Fig. 3) e interrompe a contagem (veja o sinal EN na Fig. 3), que através de o bloco de células lógicas permite a emissão dos pulsos restantes para o SPI de entrada.


Fig. 3. Diagramas explicando a recepção do sinal do sensor DHT22.

A função lógica da geração do sinal SCK é implementada em uma célula lógica (CLC), o circuito completo na configuração AND-OR é mostrado na Fig. 4.

A saída da célula lógica é conectada à entrada SCK e o sinal do sensor DHT22 é conectado ao MOSI do módulo SPI. Todas as conexões são feitas dentro do microcontrolador (Fig. 5). Para monitoramento e depuração, os sinais podem ser enviados para as portas do microcontrolador.


Fig. 4. Configuração da célula lógica do CLC no microcontrolador PIC.


Fig. 5. A estrutura completa da configuração da periferia.

Se parece que 2 temporizadores para a tarefa de decodificar o protocolo do sensor são um desperdício de recursos, um contador de até dois pode ser "coletado" em células lógicas CLC livres.

No total, a tarefa de decodificação se resume a um algoritmo muito simples: o microcontrolador e seus periféricos são inicializados, se necessário, o módulo SPI é ativado e uma solicitação de medição é gerada (log. "0" por ~ 1ms).

Resta ler os dados do buffer quando ocorre uma interrupção do SPI.


Fig. 6. O algoritmo para trabalhar com o sensor DHT22 ao usar o tronco.


Fig. 7. Sinais das portas do microcontrolador. Sinal SSP1IF - interrupções na recepção de um byte pelo módulo SPI.

A Figura 7 mostra os diagramas de sinal, em que:
DHT (dat) - sinal na linha de sinal do sensor - alimenta a entrada do módulo MOSI SPI;
TMR6! = RP6 - relógio dedicado - envia para o SCK do módulo SPI;
SSP1IF - sinal de interrupção (prontidão dos dados no buffer SPI) - na verdade, esse sinal mostra a carga do núcleo do microcontrolador - lendo os dados do resultado.

Decodificando outros protocolos PWM


Protocolos PWM de "fio único" similares são usados ​​em controles remotos por infravermelho para eletrodomésticos. Frequentemente, durante a transmissão por infravermelho, a codificação pela posição do pulso é usada quando a duração é constante e a pausa é variável. Essa opção também é chamada de "Codificação de pausa variável". De fato, esta é a mesma codificação PWM, mas com um sinal invertido. Na presença de células lógicas, a inversão não é um problema; além disso, os receptores de infravermelho invertem o sinal recebido. Na fig. A Figura 8 mostra os sinais após o receptor receber de dois consoles diferentes.



Fig. 8. Opções de codificação para controles remotos por infravermelho.

Ambos os consoles têm protocolos diferentes, mas esses protocolos são facilmente decodificados da maneira descrita acima, a única coisa é que é necessário determinar o início do envio para sincronizar a inclusão do SPI, pois o receptor de IR pode capturar interferências.



Fig. 9. Sinais decodificados usando SPI.

Nem todos os controles remotos IR possuem codificação PWM. Alguns protocolos, por exemplo RC5, possuem codificação de fase (o código Manchester, “0” é transmitido como 10 e “1” como 01) [4]. A decodificação do código de Manchester usando a periferia de um kernel independente já foi considerada anteriormente na primeira parte [1].

Sumário


Em vez de quase 100% da carga da CPU do microcontrolador para a tarefa de decodificar o protocolo PWM na versão Arduino (sim, eu sei, o problema pode ser resolvido com mais eficiência usando módulos de captura ou outros periféricos), transferimos a recepção do pacote de informações para o hardware. A frente do sinal de entrada inicia o timer, o status do timer determina a saída do bloco de células lógicas, a saída da célula lógica é alimentada ao SPI.

O uso de periféricos independentes do núcleo permite otimizar o uso de recursos, transferir algumas das tarefas para o hardware, simplificar o código e reduzir o consumo.

Literatura


1. Células lógicas configuráveis ​​nos controladores PIC.
2. 50 tons de toco. Portas de entrada / saída
3. 50 tons de toco. ADC e ADC com computador microcontrolador Microchip
4. sbprojects.com/knowledge/ir/rc5.php

Source: https://habr.com/ru/post/pt401541/


All Articles