Índice:

Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32: 3 etapas
Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32: 3 etapas

Vídeo: Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32: 3 etapas

Vídeo: Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32: 3 etapas
Vídeo: Arduino para Controle de Motor 2024, Novembro
Anonim
Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32
Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32
Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32
Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32
Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32
Geração de sinal PWM de alta resolução para servos RC com dispositivos STM32

Atualmente, estou construindo um transmissor / receptor RC baseado no chip SX1280 RF. Um dos objetivos do projeto é que eu quero uma resolução de servo de 12 bits desde os bastões até os servos. Em parte porque os servos digitais modernos têm resolução de 12 bits, em segundo lugar, um transmissor de última geração usa 12 bits de qualquer maneira. Eu estava investigando como posso gerar sinais PWM de alta resolução em dispositivos STM32. Estou usando a pílula preta (STM32F103C8T8) no momento para o protótipo.

Etapa 1: Lista de peças

Hardware

  • Qualquer placa de desenvolvimento STM32F103 (comprimido azul, comprimido preto, etc.)
  • Um banco de energia USB como fonte de alimentação
  • Programador STM32 (Segger j-links, ST-LINK / V2 ou simplesmente um clone st-link)

Programas

  • STM32CubeMX
  • Atollic TrueSTUDIO para STM32
  • Fonte do projeto do github

Etapa 2: a solução óbvia

A Solução Óbvia
A Solução Óbvia
A Solução Óbvia
A Solução Óbvia
A Solução Óbvia
A Solução Óbvia

Provavelmente a solução mais fácil é usar um dos temporizadores que podem gerar sinais PWM, como TIM1-3 em um STM32F103. Para um servo digital moderno, a taxa de quadros pode cair para 5 ms ou mais, mas para um servo analógico antigo deve ser de 20 ms ou 50 Hz. Então, como o pior cenário, vamos gerar isso. Com relógio de 72 MHz e resolução de contador de temporizador de 16 bits, precisamos definir o pré-escalador do temporizador para, no mínimo, 23, a fim de cobrir a taxa de quadros de 20 ms. Selecionei 24 porque então, por 20 ms, preciso definir o contador exatamente para 60000. Você pode ver a configuração do CubeMX e os sinais PWM de 1 e 1,5 ms gerados nas capturas de tela. Infelizmente, por 1 ms, o contador do temporizador deve ser definido para 3000, o que nos daria uma resolução de apenas 11 bits. Não é ruim, mas o objetivo era de 12 bits, então vamos tentar outra coisa.

Claro, se eu selecionasse um microcontrolador com contador de temporizador de 32 bits, como o STM32L476, essa resolução pode ser muito maior e o problema estaria resolvido.

Mas aqui, gostaria de propor uma solução alternativa que aumentará ainda mais a resolução, mesmo no STM32F103.

Etapa 3: temporizadores em cascata para resolução mais alta

Temporizadores em cascata para resolução mais alta
Temporizadores em cascata para resolução mais alta
Temporizadores em cascata para resolução mais alta
Temporizadores em cascata para resolução mais alta
Temporizadores em cascata para resolução mais alta
Temporizadores em cascata para resolução mais alta

O principal problema com a solução anterior é que a taxa de quadros (20 ms) é relativamente alta em comparação com o sinal PWM realmente gerado (entre 1 e 2 ms), então estamos desperdiçando alguns bits valiosos pelos 18 ms restantes enquanto aguardamos o próximo quadro. Isso pode ser resolvido por cronômetros em cascata usando o recurso de link de cronômetro para sincronização.

A ideia é usar TIM1 como mestre para gerar a taxa de quadros (20 ms) e TIM2, TIM3 para lidar com os sinais PWM como escravos. Quando o mestre dispara os escravos, eles geram apenas um sinal PWM em um modo de pulso. Portanto, só preciso cobrir 2 ms nesses temporizadores. Felizmente você pode colocar esses temporizadores em cascata no hardware para que esta sincronização não precise de nenhuma intervenção do processador e é muito precisa também, o jitter está na região ps. Você pode ver a configuração do CubeMX nas imagens.

Como você pode ver, selecionei 3 como pré-escalar, portanto, para os 2 ms, preciso definir 48000 no contador do temporizador. Isso nos dá 24000 para 1 ms, que é mais o que precisamos para uma resolução de 14 bits. Tadaaaa …

Por favor, dê uma olhada nas capturas de tela do osciloscópio na introdução para ver o resultado final. O canal 3 (roxo) é a interrupção do temporizador mestre que acionará os pomadas para gerar um pulso. Os canais 1 e 4 (feixe amarelo e verde) são os sinais PWM reais gerados por diferentes temporizadores. Observe que eles estão em sincronia, mas estão sincronizados nas bordas posteriores, isso por causa do modo PWM 2. Isso não é um problema, porque a taxa de PWM para o servo em particular ainda está correta.

Outro benefício dessa solução é que alterar a taxa de quadros significaria alterar o período apenas no TIM1. Para servos digitais modernos, você pode ir até 200-300 Hz, mas consulte o manual do servo se quiser fazer o ajuste fino.

Recomendado: