Atualmente, posso definir quatro pinos PWM para cerca de 31 kHz com o seguinte código:
void setup()
{
TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:
pinMode(pwmPin9, OUTPUT); // Sets the pin as output
pinMode(pwmPin10, OUTPUT); // Sets the pin as output
TCCR2B = TCCR2B & B11111000 | B00000001; // Set PWM for D3 & D11
pinMode(pwmPin3, OUTPUT); // Sets the pin as output
pinMode(pwmPin11, OUTPUT); // Sets the pin as output
}
Encontrei essa configuração em algum lugar, mas não sei como definir esses quatro pinos PWM para cerca de 25 kHz. Como isso é possível?
Respostas:
Estou postando esta segunda resposta desde que percebi que é possível ter 4 canais PWM a 25 kHz com 161 etapas em um único Arduino Uno. Isso envolve alterar a freqüência do relógio principal para 8 MHz , o que tem alguns efeitos colaterais, já que todo o programa será executado com metade da velocidade. Também envolve a reconfigurar os três temporizadores, o que significa que afrouxam as funções de temporização (Arduino
millis()
,micros()
,delay()
edelayMicroseconds()
). Se esses trade-offs são aceitáveis, eis como segue:Diferente da outra resposta , isso não precisa de uma versão modificada de
analogWrite()
: a padrão funcionará bem. Apenas deve-se tomar cuidado para que:analogWrite()
pinos 6 ou 11 não apenas falhará na saída de uma saída PWM, mas também mudará a frequência nos pinos 5 ou 3, respectivamente.fonte
Você pode configurar o Timer 1 para pedalar a 25 kHz no modo PWM de fase correta e usar suas duas saídas nos pinos 9 e 10 da seguinte maneira:
Escrever um valor de 0 com
analogWrite25k()
significa que o pino será sempre BAIXO, enquanto 320 significa sempre ALTO. O regularanalogWrite()
deve quase funcionar, mas interpretará 255 o mesmo que 320 (ou seja, sempre ALTO).Este código pressupõe uma placa Arduino Uno ou similar (ATmega168 ou 328 a 16 MHz). O método usado aqui requer um timer de 16 bits e, portanto, usa o Timer 1, pois é o único disponível no Uno; é por isso que apenas duas saídas estão disponíveis. O método pode ser adaptado a outras placas baseadas em AVR com um temporizador de 16 bits. Como Gerben observou, esse timer deve ter um registro ICRx correspondente. Existem 4 desses temporizadores no Arduino Mega, cada um com 3 saídas.
fonte
ICRx
registro. No máximo, você só pode ter um pino PWM por timer, para temporizadores 0 e 2.COM4C1
emTCCR4A
? 2. Se esse não é o problema, leia Como faço uma boa pergunta? , atualize sua pergunta incluindo seu código-fonte completo e afirmando claramente o que você espera que o programa faça e o que ele faz ("Não vejo sucesso" não é considerado uma declaração de problema válida).