Ir ao conteúdo
  • Cadastre-se

PWM PIC18F4520


Ir à solução Resolvido por MatheusLPS,

Posts recomendados

Olá, queria tirar uma duvida, eu queria saber como fazer um PWM para funcionar com uma ventoinha com 9 hélices a 200RPM, porém ao transformar RPM em Hz para o período do PWM, meu PR2 do TIMER 2 sempre da um valor muito mais alto que 255 alguém poderia me ajudar ?

 

 

No caso 200RPM = 3.33... Hz = 3.33... RPS

 

Eu usei a formula PR2 = [(FOSC)/(F(pwm)*4*Prescaler do TMR2)]-1

 

 

???????????????????????

Link para o comentário
Compartilhar em outros sites

  • Solução

@Lucas Pereira de Souza

 

A rotação da ventoínha não tem ligação nenhuma com a frequência do PWM. O PWM normalmente tem uma frequência bem mais alta.  Para motores, costumo usar entre 100 e 200Hz, pois já vence a inercia do mesmo. Mas pode ser que você escute um zumbido. Nesse caso, terá que trabalhar acima do áudio que podemos escutar. Algo em torno de 20Khz.

 

E sim. Se você tentar fazer o PWM no PIC com uma frequência tão baixa (3,3Hz), o PR2 dará muito alto mesmo e nem funcionará pois o PIC só consegue um PWM mínimo de 244Hz com cristal de 4MHz.

 

Falou

Link para o comentário
Compartilhar em outros sites

@Lucas Pereira de Souza

 

A rotação da ventoínha não tem ligação nenhuma com a frequência do PWM. O PWM normalmente tem uma frequência bem mais alta.  Para motores, costumo usar entre 100 e 200Hz, pois já vence a inercia do mesmo. Mas pode ser que você escute um zumbido. Nesse caso, terá que trabalhar acima do áudio que podemos escutar. Algo em torno de 20Khz.

 

E sim. Se você tentar fazer o PWM no PIC com uma frequência tão baixa (3,3Hz), o PR2 dará muito alto mesmo e nem funcionará pois o PIC só consegue um PWM mínimo de 244Hz com cristal de 4MHz.

 

Falou

Muito obrigado Matheus por ter me ajudado, eu tive um ideia aqui, é que eu estou fazendo um projetinho e queria saber se eu poderia usar o valor carregado no TMRL e jogar no PWM ? esta aqui o código do contador de RPM

#include <p18f4520.h>

#include <Delays.h>

#include <xc.h>

#include "defines.h"

#include <pwm.h>

#include <timers.h>

 

//inicializações

#pragma config LVP = OFF

#pragma config WDT = OFF // watch dog desativado

#pragma config OSC = HS  // oscilador externo.

#pragma config MCLRE = ON //reset externo ativo

#pragma config CP0 = OFF

#pragma config CP1 = OFF

#pragma config CP2 = OFF

#pragma config CP3 = OFF

#pragma config PBADEN = OFF //set i/o digitais

#pragma config DEBUG = OFF

//===================================================================

//Prototipos de função

void lcd_init();                // Protótipo da funçãolcd_init

void lcd_cmd(char cmd);         // Protótipo da funçãolcd_cmd

void lcd_data(char data);       // Protótipo da funçãolcd_data

void lcd_number(int number);    // Protótipo da funçãolcd_number

void liga_led(char led);

//===================================================================

//===================================================================

void interrupt                  // Interrupção de Alta Prioridade

my_isr_high(void)

{

}

//===================================================================

void interrupt low_priority     // Interrupção de BaixaPrioridade

my_isr_low(void)

{

}

//===================================================================

//=========================

//VARIAVEIS DO TIPO GLOBAL

unsigned long int rpm;

int m,c,d,u;

//=========================

//===================================================================

//Programa principal

 

void main()

{

    lcd_init();                     // Inicializa LCD

    ADCON1 = 0b00001111;

    TRISD = 0x00;

    TRISB = 0X00;                   // Porta B como saida

    //CONFIG TMR0

    T0CONbits.TMR0ON = 0;

    T0CONbits.T08BIT = 1;

    T0CONbits.T0CS = 1;

    T0CONbits.T0SE = 0;

    T0CONbits.PSA = 1;

    //CONFIG TMR1

    T1CONbits.RD16 = 0;             //TMR1 modo 8bits

    T1CONbits.T1CKPS0 = 1;          // PRESCALER 8

    T1CONbits.T1CKPS1 = 1;

    T1CONbits.TMR1ON = 0;           //TMR1 Desabilitado

   

    lcd_cmd(0x80); // Posiciona LCD na primeira linha

    lcd_data('P'); // Escreve

    lcd_data('R');

    lcd_data('O');

    lcd_data('J');

    lcd_data('E');

    lcd_data('T');

    lcd_data('O');

  

    while (1)

    {

        //obs: amostragem em 0.5 segundos

        TMR0L = 0;

        TMR0H = 0;

        TMR1L = 0x24;

        TMR1H = 0x1E;

        PIR1bits.TMR1IF = 0;

        //start

        T0CONbits.TMR0ON = 1;

        T1CONbits.TMR1ON = 1;

        while(!PIR1bits.TMR1IF);    //ESPERA 0.5s

        T1CONbits.TMR1ON = 0;

        T1CONbits.TMR1ON = 1;

        while(!PIR1bits.TMR1IF);   //ESPERA 0.5s

        T1CONbits.TMR1ON = 0;

        T0CONbits.TMR0ON = 0;

       

        rpm = TMR0L;

        rpm = rpm*60;

        rpm = rpm /9;

       

        lcd_cmd(0b00000001);  // Limpa o display

        lcd_cmd(0xc0);          // Posiciona LCD na segunda linha

        lcd_number(rpm);

        lcd_cmd(0x80); // Posiciona LCD na primeira linha

        lcd_data('R'); // Escreve

        lcd_data('P');

        lcd_data('M');

        lcd_data(' ');

        lcd_data('C');

        lcd_data('A');

        lcd_data('N');

        Delay1KTCYx(100);

       

    }

}

//===================================================================

//Prototipos de função

void lcd_number(int number)

{

     lcd_data((unsigned char) ((number/1000)%10)+ '0');

     lcd_data((unsigned char) ((number/100)%10) + '0');

     lcd_data((unsigned char) ((number/10)%10) + '0');

     lcd_data((unsigned char) (number%10) + '0');

}

void lcd_init()

{

     TRISBbits.RB4 = 0;         // Configura pino RS como saída

     TRISD = 0x00;              // Configura porta do LCD de saída

     TRISBbits.RB1 = 0;         // Configura pino EN como saída

     TRISBbits.RB2 = 0;         // Configura pino RS como saída

     e = 0;                     // EN = 0

     rs = 0;                    // RS = 0

     lcd_cmd(0b00111000);       // Modo 8 bits, 7x5 e 2 linhas

     lcd_cmd(0b00010110);       // Cursor para a Direita

     lcd_cmd(0b00001100);       // Liga display e desiga cursor

     lcd_cmd(0b00000001);       // Limpa o display

     Delay1KTCYx(30);

}

void lcd_cmd(char cmd)

{

     rs = 0;  // Comando

     PORTD = cmd;

     e = 1;

     Delay1KTCYx(3);

     e = 0;

}

void lcd_data(char data)

{

     rs = 1;  // Dado

     PORTD = data;

     e = 1;

     Delay1KTCYx(3);

     e = 0;

}

// ligar led

void liga_led(char led)

{

//Start

    switch(led)

    {

        case 0:

            PORTD = 0b00000001;

            Delay1KTCYx(1);

            ctrl1 = 1;

            Delay1KTCYx(1);

            ctrl1 = 0;

            break;

        case 1:

            PORTD = 0b00000010;

            Delay1KTCYx(1);

            ctrl1 = 1;

            Delay1KTCYx(1);

            ctrl1 = 0;

            break;

        case 2:

            PORTD = 0b00000100;

            Delay1KTCYx(1);

            ctrl1 = 1;

            Delay1KTCYx(1);

            ctrl1 = 0;

            break;

        case 3:

            PORTD = 0b00001000;

            Delay1KTCYx(1);

            ctrl1 = 1;

            Delay1KTCYx(1);

            ctrl1 = 0;

            break;

        case 4:

            PORTD = 0b00010000;

            Delay1KTCYx(1);

            ctrl1 = 1;

            Delay1KTCYx(1);

            ctrl1 = 0;

            break;

        case 5:

            PORTD = 0b00100000;

            Delay1KTCYx(1);

            ctrl1 = 1;

            Delay1KTCYx(1);

            ctrl1 = 0;

            break;

        case 6:

            PORTD = 0b01000000;

            Delay1KTCYx(1);

            ctrl1 = 1;

            Delay1KTCYx(1);

            ctrl1 = 0;

            break;

        case 7:

            PORTD = 0b10000000;

            Delay1KTCYx(1);

            ctrl1 = 1;

            Delay1KTCYx(1);

            ctrl1 = 0;

            break;

    }

}

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!