Quero criar um oscilador de onda quadrada simples, semelhante ao que seria feito com um 555, mas quero usar o suporte PWM baseado em interrupção para controlar a largura e a frequência do pulso.
Estudei a folha de dados, as APIs do AVR e quaisquer exemplos de PWM que encontrei, mas ainda não consegui reunir tudo.
É possível criar um oscilador com a funcionalidade integrada do AVR PWM e, em caso afirmativo, como? Meu amigo fez algo semelhante com um PIC de 8 pinos.
Meu raciocínio é que vou obter sons interessantes alterando a largura de pulso e, portanto, a forma de onda em uma determinada frequência. Semelhante à maneira como o Atari Punk Console funciona, mas esperançosamente, de uma maneira mais estável, ou seja, alterando a largura do pulso, mas deixando a frequência constante ou vice-versa.
Respostas:
Isso deve levar você muito longe e o resto você pode fazer com a folha de dados. Comece a construir peça por peça, de intermitente a forma de onda e forma de onda que muda ao longo do tempo para tons. Alguma fonte pode ajudar a filtrar e direcionar as saídas de áudio (o LPF ativo pode funcionar perfeitamente).
Sugiro voltar com perguntas mais específicas.
fonte
O período do PWM é determinado pela taxa de transbordamento do seu timer. Existem muitas configurações na seção Modos de Operação para pensar. Se tudo o que você quer fazer é gerar uma onda quadrada de período constante, com ciclo de trabalho variável, acho que você desejará usar o modo CTC (Clear Timer on Compare Match). A idéia básica é definir OCR0A para o número de marcações do timer até que você queira que o pino alterne a seguir e use a interrupção Compare Match para alterar esse valor pela próxima vez. Portanto, no avr-gcc, seria algo como:
Aviso, este é um código não testado, mas acho que a idéia está correta. De maneira alguma é também a única maneira de fazê-lo.
Há uma coisa que você deve saber sobre o ATTiny13, a propósito. O oscilador RC interno é garantido apenas com precisão de 10% do chão de fábrica. Há um processo de calibração do usuário pelo qual você pode passar (descrito por um appmelote da atmel ) que fornecerá uma precisão de 2% para o ATTiny13. Se você quer fazer melhor do que isso, provavelmente precisará usar um chip que acomoda um cristal externo ...
fonte
Não é uma resposta direta à sua pergunta, mas isso pode ser apropriado e fornecer algumas dicas -
Acabei de criar um oscilador controlado numericamente (NCO) usando um ATmega uC e um DAC. Uma matriz de números inteiros é usada para armazenar um ciclo de uma forma de onda (tabela de ondas). Um acumulador de fase (int longo) é usado para determinar o endereço dos dados de saída na tabela de ondas. Cada interrupção do temporizador incrementa o acumulador de fase por um valor fixo. O incremento de fase determina a frequência.
No meu aplicativo, usei uma tabela de ondas de 64 bytes que continha um ciclo de uma onda senoidal. É fácil estender a tabela de ondas e adicionar mais resolução às amostras. Minha nota de inscrição está em http://wiblocks.com/docs/app-notes/nb1a-nco.html
fonte
Basicamente, um PWM não altera a frequência. O PWM é usado principalmente para controlar a "intensidade" de um sinal.
Para gerar uma interrupção para diferentes frequências, sugiro que você use o timer no modo CTC.
Ele será executado no seu valor de comparação, alternará uma interrupção, cancelará e será reiniciado - até que seja executado novamente no seu valor de comparação ...
A cada interrupção, você pode alternar uma ou mais portas e o resto do tempo (o temporizador ainda funciona automaticamente), você pode assistir suas entradas de qualquer tipo ...
Você ainda pode "modular" sua onda quadrada com um PWM para controlar o "ganho". Mas um deles deve ser feito "manualmente", porque o ATtiny13 possui apenas um temporizador de hardware ...
fonte