Escrita bit a bit no PIN analógico

Dec 02 2020

Estou apenas começando a aprender operandos bit a bit e aqui está minha pergunta. Para fazer isso:

pinMode (13, OUTPUT);    
digitalWrite (13, HIGH);

bit a bit eu posso fazer assim:

DDRB |= B00100000;   //set PIN13 as OUTPUT
PORTB |= B00100000;  //set PIN13 HIGH

mas como posso fazer isso:

analogWrite(9, 200);

Eu sei como converter números DEC para BIN, mas como enviar este número para PWM PIN? Não consigo encontrar nenhum bom exemplo na web .. Obrigado!

Respostas

3 chrisl Dec 02 2020 at 15:05

Observe, você não especificou qual Arduino está usando. Estou assumindo um Arduino baseado em Atmega328p (Uno, Nano, Mini) aqui, embora o princípio funcione com todo microcontrolador AVR, que tem este hardware).

Com analogWrite()não estão enviando dados bit a bit de um pino. Ele configura o temporizador de hardware para definir esse pino em uma frequência específica e com um ciclo de trabalho específico. Assim, analogWrite()ativa uma peça de hardware totalmente diferente dentro do microcontrolador.

Para fazer isso sem a função Arduino analogWrite(), primeiro você precisa decidir qual caminho seguir:

  • Você pode gerar uma interrupção por meio do temporizador de hardware e, em seguida, definir o pino desejado pelo software dentro do ISR (o que lhe dá escolha livre do pino, mas também introduz algum jitter no sinal)
  • ou você pode deixar o próprio temporizador de hardware alternar o pino, o que não envolve nenhum software para funcionar (isso significa que você só pode usar um dos 2 pinos, que estão associados ao temporizador correspondente, mas você receberá um sinal muito mais estável )

Existem muitos tutoriais na web sobre como fazer isso. Uma pesquisa por "arduino timer register pwm" me deu alguns resultados promissores, por exemplo este , onde eles explicam como obter o PWM com os registradores Timer1 e uma frequência livre para escolher. (Essa é uma série de 3 partes, uma parte para cada Timer. A Parte 1 para o Timer 0 está aqui , embora você possa querer manter o Timer 0 como está, para que funcione como delay()e millis()ainda funcione normalmente). Também há muitas perguntas desse tipo neste site, por exemplo, este aqui .

Outra fonte muito importante para qualquer coisa relacionada ao hardware é a folha de dados do microcontrolador correspondente. Para o Uno, Nano ou Mini que é o Atmega328p, cujo datasheet pode ser encontrado no site do microchip aqui (ou ao pesquisar o nome do microcontrolador)