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!

Exibições: 4881

Responder esta

Respostas a este tópico

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!

Simples, use um Crystal de 20Mhz e configure os fuses dele.

Se for cristal de 2 pinos, teria que ligar capacitores de 33pf entre o capacitor e o terra, eu não uso e nunca tive problemas até agora.

ps: ignore a ligação nos pinos 5 e 6.

É 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

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço