Como o Arduino Uno suporta até 12 servos se tiver apenas 6 pinos PWM digitais?


10

De acordo com isso :

A biblioteca Servo suporta até 12 motores na maioria das placas Arduino e 48 na Arduino Mega. Em placas diferentes da Mega, o uso da biblioteca desabilita a funcionalidade analogWrite () (PWM) nos pinos 9 e 10, independentemente de haver um Servo nesses pinos. No Mega, até 12 servos podem ser usados ​​sem interferir na funcionalidade do PWM; o uso de 12 a 23 motores desabilitará o PWM nos pinos 11 e 12.

No entanto, de acordo com isso :

Pinos de E / S digitais 14 (dos quais 6 fornecem saída PWM)

Então, como o Uno pode controlar mais de 6 servos se tiver apenas 6 pinos de E / S digitais que podem fornecer saída PWM?

Respostas:


8

A biblioteca Servo não usa PWM. Quando você chama write (), ele calcula uma largura de pulso em microssegundos e a armazena em uma matriz global. Depois, há um único timer que aciona regularmente uma interrupção que altera os sinais de saída de acordo com a largura de pulso desejada de cada canal.

Você pode encontrar o código fonte abaixo: Link do Github


1
Então, simula essencialmente o PWM? Qual é o sentido dos pinos digitais nos canais PWM?
precisa saber é o seguinte

2
Em geral, os servo pulsos têm cerca de 1 ms de comprimento. Portanto, eles devem ser acionados por frequências em torno de 1 kHz, o que é muito fácil de gerar por software em qualquer saída com um micro funcionando a vários MHz. As saídas PWM do AVR são geradas por hardware dedicado e podem atingir a frequência da CPU, mas o número de canais é limitado. Eu acho que os autores do módulo Servo decidiram usar um único timer para lidar com tantos canais quanto pinos e salvar o hardware PWM para outros usos.
Grapsus #

1
O PWM das saídas do Arduino é para saídas de potência variável com ciclos de trabalho entre 0 e 100%. O controle "PWM" no estilo RC tem uma faixa de ciclo de serviço muito limitada - 1000 nós a 50 Hz é de 5%, 2000 nós a 50 Hz são 10%. Pense no RC PWM como um "trem de pulso" em vez do tradicional "PWM".
Jon Watte

@ user41158 Se você tiver um tempo ilimitado de CPU, poderá usar qualquer saída digital como PWM e controlá-la em software, não apenas PWM. Em teoria, você pode criar qualquer sistema de comunicação digital escrevendo um programa e alternando essas saídas, chamado " bit- batendo ". Mas, na prática, o tempo de CPU não é ilimitado e é melhor resolver tarefas de hardware por hardware. Para o servocontrole, a frequência PWM é bastante baixa, por isso é prático usar o PWM em bits para criar saídas adicionais.
比尔盖子

2

Os 6 pinos PWM usam o UART embutido no ATmega328P para produzir sua saída. Isso torna os pulsos muito rápidos para uma saída "analógica" de qualidade superior. Como os servos se comunicam a uma velocidade suficientemente lenta, eles podem ser acionados usando interrupções de software. As interrupções de software afastam-se do código que você está executando e executam o código incluído na biblioteca servo. Este código usa meios padrão para alterar o estado dos pinos. Ao fazer isso usando interrupções, em vez de usar o UART, você perde algum tempo de processamento, mas ganha a capacidade de gerar mais servos.


Você pode explicar (ou criar um link para) mais? Como o UART é usado para o PWM?
Martin Thompson

Eu acho que seria melhor dizer que a biblioteca PWM pode usar os pinos de E / S UART, se desejado. a biblioteca PWM não usará o próprio UART, mas os pinos usados ​​pelo UART também podem ser usados ​​como E / S digital padrão, se não for necessário para o UART.
Peter Bennett
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.