Olá! Preciso gerar uma onda PWM com uma frequência não fixa, ou seja, vou variando ela conforme necessário, pensei em utilizar um potenciômetro, mas também podem ser botões. A frequência deve variar entre 50kHz até 100kHz. Também preciso variar o duty cycle, mas isso é bem mais fácil (de fato, usarei outro potenciômetro). Alguém tem alguma ideia do que e como utilizar para fazer essa tarefa? Obrigado!
Tags:
Pessoal,
O que está acontecendo é o seguinte;
As freqüências obtidas são muito baixas por causa de alguns fatores:
1. O clock do PIC12F675 foi configurado com interno (4Mhz), e como cada instrução "come"4 ciclos,
sobram 1Mhz.
2. As instruções de AD e matemáticas em C estão consumindo (+-800us) (+- 1,2Khz), que será
o máximo que teremos na saída do PWM.
A primeira solução seria aumentar o clock para 20Mhz (com cristal externo), mas mesmo assim a freqüência máxima será de +- 5Khz.
A segunda é reescrever o código para assembler, (é mais optimizado que o C), e é isto que vou começar a fazer.
Mando mais noticias depois.
Rui
E no caso de um gerador de sinal sem pwm, a frequência máxima estaria limitada aos 1,2khz por causa do A/D?
Rodrigo,
acho que não está limitada à 1,2Khz, pois quem está "gastando" clock são as rotinas de A/D e as rotinas
matemáticas em C.
Acho que voce consegue frequências em toda faixa de aúdio sem as referidas rotinas.
Rui
Rui, com o código da sua primeira resposta o pwm consegue variar de 50kHz até 100kHz? obrigado
Assim que chegar em casa posso conferir para você. Só preciso que alguém compile e gere o hexadecimal para mim... pois não tenho compilador com hi-tech c .
Oi Tales,
com o código abaixo e o clock de 4Mhz, o melhor que consegui foi 23kz de saída.
Mas com clock de 20Mhz, acredito que voce consiga próximo de 100Khz.
Rui
//*******************************************************************
// PWM_12F675.C
#include <htc.h> // Biblioteca geral do Hi-tech
//Configuração do 12F675
__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF & CP_OFF & CPD_OFF );//Interno
#define PWM GP2 //saida pwm
unsigned int Tempo2, Tempo3;
//*******************************************************************
void main()
{
TRISIO= 0b00111011; // Define direção do GPIO
INTCON = 0; //Disable interrupt
CMCON = 0x07; //Turn off analog comparator
GPIO = 0; // Zera GPIO
ANSEL = 0x53;
while(1) // Loop
{
Tempo2 = 1;
Tempo3 = 1;
PWM = 1; // Set out Hi
while(Tempo2){Tempo2--;} // Tempo de Pulso Hi
PWM = 0; // Set out Low
while(Tempo3){Tempo3--;} // Set out Low
}
}
Entendi, mas como faço para conseguir um clock de 20 Mhz? sou leigo em PIC. Obrigado!
É pessoal,
mesmo em assembler por causa do A/D e os cálculos, os tempos foram muito grandes,
na ordem de 120us o que dá uma frequência máxima de +- 8Khz.
Vou tentar com um chip com PWM e depois com Arduino. Mas sem muita expectativa.
Rui
Se migrarmos para um pic16f73 ou algo similar, conseguimos melhorar esses tempos?
Oi Rodrigo e Tales,
eu tenho o PIC16F818, que tem PWM , A/D, e clock interno de 8MHz,
Estou reescrevendo o código para ele.
Rui
Oi Pessoal, bom dia.
Acho que estou ficando doido.
Ontem eu apanhei por +- 4 horas, pois a saída PWM do PIC12F675 ficava intermitente.
Configurei o chip com MCLR ON e esqueci de colocar um resistor de 10k do pino 4 para +VCC.
Este forum é muito bom, deixa "agente" pirada da cabeça, mas nos faz aprender muito.
E eu que pensava que conhecia PWM, descobri que "só sei que nada sei". (© Socrátes).
Estou reaprendedo o PWM.
Com o PIC16F1847 com clock de 32Mhz, voce consegue PWM de até 333Khz,
O clock interno dele pode ser configurado até 32Mhz, tem A/D e a pinagem é igual
a do PIC16F628A (18 pinos). (R$ 14,00 no ML) (US$ 1,98 Mouser)
O clock dele tb pode ter a frequencia trocada mesmo com ele em operação.
Estou escrevendo o código para ele. Por sorte eu tenho 2 dele para teste no proto.
Rui
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por