Noções básicas do tutorial introdutório do ESP32-C3 (5. Aplicação RMT - teste de unidade de luz LED RGB colorida SK6812)

测试第五课,本来是准备测试一下PWM驱动 SK6812 RGB灯,
但是研究了一段时间,发现在ESP32-C3 有更好而且现成的方式 实现 SK6812 的控制,
使用PWM也不是不可以,只是对于初学者,需要多花好多时间,
所以本文还是先以ESP32-C3内置的 RMT 进行 SK6812 的控制,毕竟有现成的示例

prefácio

Os seguintes testes funcionais do ESP32-C3 são baseados na placa de desenvolvimento projetada por nós:

Desenhe você mesmo uma placa de desenvolvimento do ESP32-C3 (a primeira vez que usar o Lichuang EDA) (PCB está disponível)

O ambiente de desenvolvimento é o ESP-IDF oficial do Espressif, construído com base no plugin VScode:

O ambiente de desenvolvimento ESP32-C3 VScode é construído (com base no ESP-IDF oficial do Espressif - ambiente duplo Windows e Ubuntu)

Na placa de desenvolvimento, desenhei uma luz RGB SK6812. Como eu não sabia muito sobre o SK6812 na época, escrevi PWMLED:
insira a descrição da imagem aqui

1. Introdução básica do LED SK6812

O cordão da lâmpada SK6812 é uma fonte de luz LED inteligente controlada externamente que integra o circuito de controle e o circuito emissor de luz. A forma é a mesma das contas da lâmpada LED 5050. Mas, ao contrário dos LEDs comuns, ele não controla simplesmente a ativação e desativação através de níveis altos e baixos, ele pode controlar a ativação e desativação de três cores RGB através de uma única linha , usando um método de comunicação chamado protocolo de dados de código de retorno a zero unipolar .

1.1 Princípio de controle SK6812

A introdução básica está disponível nos manuais dos produtos utilizados. Aqui estão algumas fotos dos manuais dos produtos usados ​​pela minha placa de desenvolvimento para explicar:
Após o LED ser ligado e resetado, ele recebe os dados do controlador através da porta DIN.Os dados de 24 bits enviados primeiro são extraídos pelo primeiro cordão da lâmpada.

Para os usuários, o que precisamos saber é entender esse protocolo, e então implementar o código "0" e o código "1" mencionados no manual, e então cada cordão de lâmpada é composto por uma estrutura de dados de 24 bits.
(Observe que o 24 bits mencionado aqui é uma estrutura de dados. Por exemplo, se usarmos SPI para implementar códigos "0" e "1", o barramento SPI envia um byte, mas implementa apenas um código, que é apenas o de 24 bits estrutura de dados acima. 1 bit! Isso será explicado com mais detalhes posteriormente)

Tiramos screenshots dos parâmetros que precisam ser entendidos (determine os parâmetros específicos de acordo com o livro de especificações do produto que você escolher):
insira a descrição da imagem aquiinsira a descrição da imagem aquiinsira a descrição da imagem aqui
adicione algumas explicações adicionais. A adição de diferentes proporções de três cores primárias para obter cores é chamada de mistura de cores aditivas, como Como:

Vermelho + Verde = Amarelo
Vermelho + Azul = Roxo
Azul + Verde = Ciano
Vermelho + Azul + Verde = Branco

Por exemplo: exibir amarelo com valores RGB de 255, 255, 0. Então a estrutura de dados de 24 bits acima é:
1111 1111 1111 1111 0000 0000 (1 e 0 são o código "1" e o código "0" mencionados acima)

Para resumir o acima, não importa qual método seja usado, é necessário fornecer os níveis alto e baixo que atendam aos requisitos de tempo na extremidade DIN para controlar o SK6812 corretamente:
insira a descrição da imagem aqui

1.2 Esquema de controle SK6812

Conhecendo o princípio de controle do SK6812, na placa de desenvolvimento, usamos uma porta IO para conectar o terminal DIN como o terminal de entrada do sinal, então precisamos implementar esta porta IO para atingir níveis altos e baixos que atendam ao tempo, então quais são os métodos de implementação?

1.2.1 Alternar GPIO

O objetivo final é atingir os níveis alto e baixo do tempo especificado, portanto, o pensamento mais direto é definir diretamente a velocidade de inversão do GPIO para o máximo e, em seguida, definir diretamente o GPIO de redefinição para atingir os níveis alto e baixo. = =!

Mas pense com cuidado que o requisito de tempo acima está no nível dos EUA, então para chips diferentes, não apenas por causa de diferentes frequências principais, mas também a velocidade de inversão da porta IO será diferente. Verifique na Internet (para referência só):

1, STM32

  • Eu vi uma postagem no blog que opera diretamente o registro em 222ns testar a velocidade de inversão da porta IO STM32F103RCT6
  • Tomando como exemplo a frequência principal de 72MHz, a instrução controla o flip do GPIO, até 18MHz.
  • Operação direta de registradores, ciclo de instrução único, quando 407 é overclock para 200M, a porta IO é apenas 100M

Os eventos acima podem ser calculados por si mesmos através da fórmula: f=1/T. (T está em segundos (s), f está em hertz (Hz)).

2, ESP32

  • A velocidade da porta IO do ESP32, uma simples busca não encontrou a descrição.

3, ESP8266

  • Leva cerca de 2,5us (0,4MHz) para inverter efetivamente o GPIO do ESP8266
  • GPIO0 do ESP8266 tem a velocidade de flip mais rápida, que pode ser alcançada com operações de registro

Afinal, atualmente, o desenvolvimento do MCU ainda tem condições de controlar diretamente o nível da porta IO. Este método simples e rude requer testes e ajustes repetidos, pois muitos fatores precisam ser considerados para o controle do tempo. Então aqui está a introdução, mas mais exploração.

1.2.2 Modo SPI

No modo SPI, a velocidade de comunicação SPI pode atingir várias dezenas de Mbps. Em geral, a frequência máxima de clock do módulo SPI é 1/2 da frequência de clock do sistema.
Existem muitos conhecimentos básicos de SPI na Internet, e também está registrado no meu blog "Bus Protocol Record".

Portanto, enviar através do barramento SPI é uma maneira mais viável. Desde que o clock SPI seja ajustado para cerca de 8MHz (menor ou igual a 8Mhz), ele pode ser realizado em diferentes MCUs.

Usando SPI de 8Mhz, o tempo necessário para enviar um byte é de 1,25us, que atende ao tempo de um bit da estrutura de dados de 24 bits do SK6812 acima:

Então de acordo com o código "1" < 1us && >0.6us nível alto, >0.2us nível baixo, conclui-se que o SPI envia um byte 11111100b, que significa código "1", 0XF0.

Da mesma forma, o byte de envio SPI 11000000b significa código "0", 0xC0.

Então, de acordo com o exemplo dado na parte principal acima, a estrutura de dados de 24 bits em amarelo é: 1111 1111 1111 1111 0000 0000

Em seguida, o barramento SPI envia os seguintes 24 bytes de dados (em hexadecimal) para tornar o display de LED amarelo:

F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 F0 C0 C0 C0 C0 C0 C0 C0 C0

1.2.2 Método PWM

O método PWM também é uma maneira comum de controlar os níveis alto e baixo. Do exposto, sabemos que a proporção dos níveis alto e baixo do código "1" e do código "0" é 3:1. é ajustar o ciclo de trabalho e o código "1" O ciclo de trabalho é de 75% e o ciclo de trabalho do código "0" é de 25%. Então o resto só precisa definir o período PWM para o período de símbolo de SK6812 > 1.2us. Preste atenção ao ciclo de trabalho, que pode ser ajustado de acordo com a situação real.

Duas conclusões online são fornecidas apenas para referência:

  • ciclo (ciclo) = 1.2us, ciclo de trabalho = 50% é 1, ciclo de trabalho = 30% é 0;
    (833Khz, parece bom)
  • O ciclo está definido para 3MHz, o ciclo de trabalho = 66% é 1 e o ciclo de trabalho = 33% é 0;
    (ciclo de 0,33us, estima-se que a escrita esteja errada, 1MHZ é quase o mesmo, 1us)

Em relação ao método PWM do ESP32-C3, não tenho certeza se ele pode ser usado ou não. Afinal, o PWM do ESP32-C3 não foi aprendido e testado de acordo com nosso processo de postagem do blog. A próxima postagem do blog falará sobre o registro de teste de aprendizado PWM do ESP32-C3.

1.2.3 Modo RMT (ESP32)

O RMT é um controlador de envio e recebimento de infravermelho exclusivo da série ESP 32. O protocolo infravermelho é convertido em um sinal, que é refletido no IO, que são os níveis alto e baixo.

Tomando o código "1" e o código "0" mencionados acima como sinais infravermelhos, o controle do SK6812 também pode ser realizado. Vamos primeiro entender o RMT do ESP32-C3.

2. Introdução ao ESP32-C3 RMT

2.1 Introdução aos fundamentos do RMT

Há uma introdução detalhada ao RMT no documento oficial do chip ESP32-C3 do Espressif "esp32-
Seção RMT manual ESP32-C3
c3_technical_reference_manual_cn "

Assim, as informações detalhadas ainda podem ser visualizadas através dos canais acima, aqui precisamos atentar para:

Como o RMT controla o SK6812?

Do princípio de controle anterior do SK6812, sabemos que controlar o SK2812 é atingir os níveis alto e baixo que atendem aos requisitos de tempo. Então, no manual do chip ESP32-C3, é mencionado como o RMT realiza essa função. A parte é tão segue: (Claro, se você quiser saber mais, você deve verificar as informações oficiais com cuidado)

insira a descrição da imagem aqui
Fica mais fácil de entender com as fotos do site oficial:
insira a descrição da imagem aqui

2.2 Introdução ao uso do RMT (relacionado à API)

As etapas básicas de uso do RMT são as seguintes, mas neste artigo, precisamos controlar o SK6812, portanto, precisamos apenas entender a configuração e o uso do envio:
insira a descrição da imagem aqui

A primeira coisa a entender é uma estrutura, a estrutura da configuração de transmissão rmt_tx_config_t:
insira a descrição da imagem aqui
o conteúdo da estrutura acima é: frequência da portadora RMT, nível de saída RMT, estado do nível ocioso, ciclo de trabalho, contagem máxima de ciclos, habilitação da portadora, habilitação do ciclo, habilitação de saída de nível ocioso.

Através do exemplo de inicialização da estrutura, pode-se entender melhor:
insira a descrição da imagem aqui
A configuração padrão da estrutura de saída do RMT é a seguinte:
insira a descrição da imagem aqui
Para controlar o SK6812, basta conhecer a configuração de entrada do RMT.

3. Teste de exemplo RMT

3.1 Teste de Exemplo de IDF

No programa de amostra IDF, o exemplo oficial de controle do WS2812 é fornecido RMT Transmit Example -- LED Strip:
insira a descrição da imagem aqui

O processo do programa é relativamente simples, o driver do SK6812 é o mesmo do ws2812 e o código relevante está no components/led_strip/src/led_strip_rmt_ws2812.carquivo.

Para sua própria placa de desenvolvimento e, em seguida, para o projeto de exemplo, você pode ver o efeito simplesmente modificando-o, porque todos no exemplo são iguais, aqui está uma captura de tela para indicar o que precisa ser modificado:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

É muito rápido no exemplo, EXAMPLE_CHASE_SPEED_MSe meus olhos estão piscando um pouco, então mudei desta vez para 300:

#define EXAMPLE_CHASE_SPEED_MS (300)//

Na minha placa de desenvolvimento, havia realmente apenas um LED, mas para testar, soldei um fio voador:
insira a descrição da imagem aqui

Os resultados do teste mostram que o fenômeno do exemplo é que as diferentes cores do LED piscam alternadamente e não há efeito de gradiente. Aqui estão algumas fotos para dar uma olhada:

insira a descrição da imagem aqui

3.2 Exemplo para alterar o efeito gradiente

No início, não analisei o código do driver pouco a pouco. O código de exemplo também olhou para a configuração do RMT. A parte do driver do SK6812 não foi cuidadosamente estudada, então o teste foi um efeito de oscilação. Mais tarde, pensei não era bom, e não piscava gradualmente. , isso não deve ser ofuscante = =!

Então ainda tenho que alterá-lo, então olhei o exemplo, que na verdade é uma modificação simples (a última vTaskDelay(50)não é necessária, aqui está o código que foi alterado antes e esqueci de removê-lo):
insira a descrição da imagem aqui

De acordo com as instruções na ilustração acima, alterar todos os tempos para o seguinte é o gradiente mais suave e rápido com base na rotina:
insira a descrição da imagem aqui

Nenhum vídeo não pode ver = =! A imagem acima mal dá conta disso:
insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/weixin_42328389/article/details/122558050
Recomendado
Clasificación