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:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por