Escrita bit a bit no PIN analógico
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
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)