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

Oi Tales, boa tarde.

Pode ser em PIC?

Rui

alterar a duty cycle é facil, mas alterar a frequencia como vc citou é mais complexo.

Olá, Rui. Pode sim! Desde que funcione tá valendo! 

Sim, Jonas. Variar a frequência é onde tenho a dificuldade. valeu!

Oi Tales

Hi-Tech c;

PIC12F675

Rui

//*******************************************************************
// PWM_12F675.C
//
// GPIO:
// pino 1 - +5v
// pino 2 - desligado
// pino 3 - desligado
// pino 4 - desligado
// pino 5 - saída pwm .
// pino 6 - Centro do Potenciomentro 2 Duty cycle
// pino 7 - Centro do Potenciomentro 1 Frequencia
// pino 8 - Gnd
//
//*******************************************************************
#include <htc.h> // Biblioteca geral do Hi-tech
#include <math.h> // Biblioteca Matemática
//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

float Pot2;
unsigned int High, Low, Tempo1, 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

ADCS2 = 1; // ADCON0 // 16 TOSC
ADCS1 = 0; // ADCON0 // 16 TOSC
ADCS0 = 1; // ADCON0 // 16 TOSC
ADFM = 1; // ADCON0 // Right justified
VCFG = 0; // ADCON0 // Internal VDD
ADON = 1; // ADCON0 // Liga conversor AD

ANS3 = 0; // ANSEL // Digital
ANS2 = 0; // ANSEL // Digital
ANS1 = 1; // ANSEL // Analógica
ANS0 = 1; // ANSEL // Analógica

while(1) // Loop
{
// Le primeiro potenciometro e define a frequencia.
CHS1 = 0; // Select Analógica 00 = Channel 00 (AN0)
CHS0 = 0; // 01 = Channel 01 (AN1)
// 10 = Channel 02 (AN2)
// 11 = Channel 03 (AN3)

GO = 1; // Inicia leitura anaógica

while(GO_DONE){} // Aguarda fim de conversão

Tempo1 = ADRESH8; // Salva e desloca Hi
Tempo1 = Tempo1 + ADRESL; // Soma os dois registradores para obter resultado

// Le segundo potenciometro e define otempo de Hi e Low.
CHS1 = 0; // Select Analógica 00 = Channel 00 (AN0)
CHS0 = 1; // 01 = Channel 01 (AN1)
// 10 = Channel 02 (AN2)
// 11 = Channel 03 (AN3)

GO = 1; // Inicia leitura anaógica
while(GO_DONE){} // Aguarda fim de conversão

Tempo2 = ADRESH8; // Salva e desloca Hi
Tempo2 = Tempo2 + ADRESL; // Soma os dois registradores para obter resultado

Pot2 = Tempo1/10.23; // Define percentual de medida (Max 1023)
// 1023 = 100% cada 1% = 10,23
High = (unsigned int)(Pot2) %1000; // Percentual de tempo em Hi
Low = 100 - High; // Percentual de tempo em Low

Tempo2 = Tempo1*High/5; // Tempo2 = Tempo do Pulso * Percentual High
Tempo3 = Tempo1 - 253; // subtrair 235 pelo processo anterior
Tempo3 = Tempo3*Low/5; // Tempo3 = Tempo do Pulso * Percentual Low

PWM = 1; // Set out Hi
while(Tempo2){Tempo2--;} // Tempo de Pulso Hi
PWM = 0; // Set out Low 12 vezes o tempo de exec

while(Tempo3){Tempo3--;} // Set out Low
}
}

Muito obrigado Rui! vou testar isso amanhã no laboratório, abraço

Aí Ruizão ! Batendo um bolão hein!

Testou em algum simulador ?

Parabéns !

Abraços

Bom dia Rui, acho que até conversei com você na sala principal esses dias sobre esse mesmo circuito eheheheh

mas estou fazendo em CCS.

Saberia me dizer qual é a frequência máxima e minima e se teria como alterar? Ao contrario do Tales, eu preciso no máximo de 25khz (afinal de contas, dificilmente alguém escuta mais de 22.5khz)

meu código em CCS não tem pwm ainda, e só na frequência ele controla entre 5hz e 1100hz,

Oi Gustavo e Rodrigo, bom dia.

Gustavo muito obrigado pelo elogio, mas é só milhagem acumulada PIC. KKKKK

Eu montei o circuito no proto e medi a saída com o analisador lógico.

Para ficar mais exato ele precisa de algum ajuste no valor nestas linhas.

Tempo2 = Tempo1*High/5; // Tempo2 = Tempo do Pulso * Percentual High
Tempo3 = Tempo1 - 253; // subtrair 235 pelo processo anterior
Tempo3 = Tempo3*Low/5; // Tempo3 = Tempo do Pulso * Percentual Low 

Rodrigo, A frequencia além do pot tb vai ser definida nas próximas linhas, variando o divisor.

Ainda não verifiquei a faixa de frequência.

Tempo2 = Tempo1*High/5; // Tempo2 = Tempo do Pulso * Percentual High
Tempo3 = Tempo1 - 253; // subtrair 235 pelo processo anterior

Com um pot de 10k posicionado com +- 4k/6k, e divisor por 5 obtive a frequencia de +- 10Hz.

Vou estudar mais o circuito e ver os bugs. (Que droga,eles sempre existem).

Abaixo  saída do analisador:

Rui

Se eu for utilizar um PIC12F1572 o que devo alterar no código para funcionar? abraço

Oi Pessoal,

claro que não podia deixar de chamar a atençao para ele.  O Bug está presente.

Estou analisando com o scope. Breve news.

Tales vou verificar e post a modificação

Rui

também tenho em mãos o PIC1822 se achar melhor. Obrigado!

Oi Tales, bom dia.

Eu não tenho estes chips (PIC12F1572, PIC12F1822), mas analisando rapidamente o datasheet deles, posso dizer que talvez somente os parâmetros do oscilador devem ser modificados.

Tales, o PIC12F1572 tem PWM incorporado,portanto não precisa deste malabarismo todo para gerar o pseudo PWM.

Boa sorte. Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço