Ir ao conteúdo
  • Cadastre-se
Luan Borges

PIC configurar pwm no pic24fj256gb106

Recommended Posts

Olá a todos. Tudo bem com vcs? Então é o seguinte, eu to com um  PIC24FJ256GB106, e cara, completamente diferente das famílias dos 18F para trás, levei um surra já com ele , virei a noite tentando entender melhor ele, mas o que eu não to dando conta, é de configurar o PWM dele, alguém tem um exemplo de como fazer isso? Já olhei o datasheet e nada, não to conseguindo, e tipo assim, se já tiver mastigadinho e tudo mais kkk seria muito legal kkk Mas é serio, se alguém poder me ajudar, ficaria muito grato. Obrigado pela atenção.  

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual parte do datasheet que você leu e não entendeu? Publique o pdf dele, a página, qual bit te deixou dúvida, desenhos, o que você fez e não deu certo, o que você achou que devera ocorrer e não ocorreu e etc, tudo mastigadinho que pode-se tentar avaliar pra você...

  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

seve o PDF todo? porque eu não entendi nada da parte de PWM, se não eu printo a tela mesmo e mando 

PIC24FJ256GB110.pdf

adicionado 4 minutos depois
agora, Luan Borges disse:

seve o PDF todo? porque eu não entendi nada da parte de PWM, se não eu printo a tela mesmo e mando 

PIC24FJ256GB110.pdf

Eu quero controlar ele da mesma forma que controlo o do 18F4550, que é bem mais fácil, Que o mesmo eu controlo via UART.

         

...

             case '3':{DP +=10; delay_ms(10);}break;
             case '4':{DP -=10; delay_ms(10);}break;
             case 'A':{DP = 255;delay_ms(10);}break;
             case 'S':{DP = 0;  delay_ms(10);}break;

 

....

 PWM1_Set_Duty(DP);

.....

 

aumentar e diminuir a intensidade dele... 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges, bem vindo ao mundo dos MCUS acima de 8bits, as coisas daqui pra frente mudam um pouco quando comparados com os MCUs de 8bits, e a primeira coisa que você deve entender é que, agora os periféricos são fisicamente separados dos pinos de I/O.

O que isso significa? Que basicamente agora você tem duas tarefas em vez de uma, ao mexer com um periférico em nível de registrador, a primeira é configurar o periferico em si, a segunda é rotear os sinais de saida do periferico no pino que ele suporta.

No seu caso específico voce precisa configurar o PWM escolhendo um dos 5 timers disponiveis, cada timer suporta o modo free runing (contagem), capture e compare, esse ultimo é o que gera PWM.

Na seção 14 do datasheet ele descreve os registradores que você precisa configurar para obter o periférico em PWM, são três simples registradores, configure-os e escolha qual timer vai ser o "motor" desse PWM, em seguida va para a seção 11 - 13 dependendo do timer escolhido e configure ele para gerar o periodo desejado do seu PWM, basta colocar ele em moto auto-reload e carregar 1 vez o periodo de expiração dele.

Feito isso, o próximo passo é olhar seu PIC, e dependendo do encapsulamento verificar qual compare sai em cada pino, descoberto isso, va para a seção 10.04 do datasheet e configure o PPS para rotear seu compare para os pinos desejados.

Lembrando que isso que disse ai em cima, é alto nível agora você precisa ler as seções nessa ordem, para conseguir entender como a coisa funciona, nos micros maiores, para configurar um periférico, você sempre deve dividir sua configuração em problemas menores senão a coisa fica confusa mesmo.

Alternativamente você pode simplificar esses passos usando a Peripheral Library da Microchip, que ja possui as funções de configuração implementadinhas em C (esqueça essa lenda de acessar o registrador é mais rápido, os compiladores evoluiram muito em termos de otimização da firmware), vai ai on link:
https://www.microchip.com/SWLibraryWeb/product.aspx?product=PIC24 MCU dsPIC Peripheral Lib
 

Outra opção é usar o Code Configurator do MPLABX para gerar o codigo de inicialização dos periféricos, segue o link:

https://www.microchip.com/mplab/mplab-code-configurator

 

Bom por ora é isso, qualquer coisa da um berro,

Felipe

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dei uma lidinha rápida. De fato a dica do amigo@Felipe Electronic foi muito boa mas mesmo assim você precisa praticar um pouco. Essencialmente você precisa criar seu próprio...

1 hora atrás, Luan Borges disse:

 PWM1_Set_Duty(DP);

Mas olha que fofo...

The PWM duty cycle is specified by writing to the OCxRS and OCxR registers

só isso. Essencialmente, imagine um contador - um timer -  rodando livre e sendo comparado o tempo todo com um valor padrão. Se menor... saída =0, se maior... saída =1. Então seu PWM1_Set_Duty() só vai ter que fazer algo como...

PWM1_Set_Duty(unsigned int DP)

{

OC1R=DP;

//OC1RS=DP;//não me aprofundei sobre este registro auxiliar...

}

e o hw vai fazer o resto sozinho.

Claro isso depois de você ajustar corretamente os registros de controle da saída, pinos, timer, modo pwm e etc diretamente nos registros (minha opção pessoal) ou através dos mastigados inteligentemente sugeridos pelo amigo Felipão...

Vá por partes e tente  uma simulação. O próprio MPlab tem como simular o status do pino. Me lembro que era algo como mplab logic analyser

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

T

1 hora atrás, Luan Borges disse:

tá vamos lá, estou configurando assim:

 

 //TIME5...
   T5CON = 0x8010;
   PR5     ?? (Aqui que eu digo quando vai acontecer o overflow não é?) Mas se eu conseguir entender, quando chegar no numero que eu po ali, a flag T5IF_bit vai ser igual a 1 não é isso? Me corrija se estiver errado, e eu tenho que seta ela pra zero pra reiniciar, mas onde eu farei isso? Gente, é serio, EU TO MUUUUITO PERDIDO, Porque nas outras famílias fazia assim :

 

 if(TMR1IF_bit)
    {TMR1IF_bit = 0x00;
     TMR1L      = 0xB0;
     TMR1H      = 0x3C;
     baset1 +=1;
     baset2 +=1;
     baset3 +=1;
     baset4 +=1;
     basetemp();
    }

Como eu vou rei

Aqui no caso ele se alto reiniciaria é isso? E em qual parte fala sobre esse bit?

 

 

 

Aaaaaah o mais triste é que aulas sobre essa família não encontro nada em PT, não queria dar tanto trabalho pra vcs 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente achei um código, e deu certo, estou brincando com ele, Descobrir o que é PPS e achei muito fo**, Mas assim eu só consigo controlar uma unica saída de PWM???? 

adicionado 22 minutos depois

COnseguiiiiiiiiiiir, Achei em um site, Vocês são fod*s ❤️ amo vcs.

 

Então, Queria mastigadinho porque eu entendo melhor sabe? Eu vejo o código, entendo entender,  e faço o meu em cima do que eu aprendi, to fazendo o mesmo, nem sabia como funcionava esse PPS e conseguir entender, achei brilhante a ideia do PPS, aprendi até  ligas os outros PWM que tava apanhando kkkk Ta ai o Código pra quem  quiser e a ajuda de vcs pra complementar e frisar tudo. 

 

 

 

#define PWM_PERIOD 62500
#define PWM_PERIOD1 62500
void PwmInit(void)
{

/* Reset PWM */
OC1CON1 = 0x0000;
OC1CON2 = 0x0000;
OC2CON1 = 0x0000;
OC2CON2 = 0x0000;

/* set PWM duty cycle to 50% */
OC1R =  PWM_PERIOD >> 5;
OC1RS = PWM_PERIOD - 1; /* set the period */
OC2R =  PWM_PERIOD1 >> 5;
OC2RS = PWM_PERIOD1 - 1; /* set the period */

/* configure PWM */
OC1CON2 = 0x001F;
OC1CON1 = 0x1C0E; /* Clock sourc Fcyc, trigger mode 1, Mode 0 (disable OC1) */
OC2CON2 = 0x001F;
OC2CON1 = 0x1C0E;


RPOR5bits.RP11R=18;
RPOR6bits.RP13R=19;

}


void main()
{

//---------------- PORT's ----------------//
  TRISB = 0x00;
  PORTB = 0x00;

  TRISC = 0x00;
  PORTC = 0x00;

  TRISD = 0x00;
  PORTD = 0x00;

  TRISE = 0x00;
  PORTE = 0x00;

  TRISF = 0x00;
  PORTF = 0x00;

  TRISG = 0x00;
  PORTG = 0x00;

PwmInit();

while(1)
{
//OC1R=PWM_PERIOD;
 //OC2R=PWM_PERIOD1;
//Delay_ms(1000);

//OC1R=0.5*PWM_PERIOD;
OC2R=0.5*PWM_PERIOD1;


//OC1R=0.3*PWM_PERIOD;
//OC2R=0.3*PWM_PERIOD1;
//Delay_ms(1000);

OC1R=0.1*PWM_PERIOD;
//OC2R=0.1*PWM_PERIOD1;
Delay_ms(1000);


}

}

 

 

Vou mexer em muita coisa aqui pra fica como eu quero. E mais uma vez. Muito Obrigadddoooo Pela atenção ❤️ 

 

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×