Ir ao conteúdo
  • Cadastre-se

Entendimento do PIC!!


galo_ivi

Posts recomendados

Galera por favor me ajudem a compreender o PWM que tem dentro do PIC 16F628a, no datasheet diz que:

1 - tem que configurar CCP1CON

2 - a base de tempo do PWM é o Timer 2

3 - TMR2 = PR2

4 - fórmula: PWM(periodo) = (PR2+1)*4*T(osc)*TMR2(prescaler)

5 - Duty Cycle é definido pelo registrador CCPR1L

6 - fórmula2: PWM(dutycycle) = (CCP1L:CCP1CON<CCP1X:CCP1Y)*T(osc)*TMR2(prescaler)

7 - o valor do PWM(dutycycle) se encontra entre 0 e 1024

8 - o PWM será gerado no pino RB3

Eu já li e reli todo material que encontrei na net, tópicos e mais tópicos, codigos... mas nao encontrei nada que me fizesse entender como eu devo escrever o codigo, em assembly, de acordo com as informações acima.

Me ajudem por favor, como configuro toda essas coisas, TMR, PR2, CCP**...

A minha aplicação será a seguinte, com um potenciometro controlarei o sentido que o motor girará e a velocidade.

Não quero um código "pronto", quero entender antes de tudo!!:confused::confused:

Link para o comentário
Compartilhar em outros sites

O PWM funciona da seguinte forma:

Quando o valor de TMR2 se iguala ao valor de PR2 +1, o pino CCP1 é colocado em nível alto e o TMR2 é zerado. Neste momento, o ciclo termina e um novo ciclo se inicia.

Quando o valor do TMR2 se iguala ao valor de CCP1L, o pino CCP1 é colocado em nível baixo. Neste momento, termina o ciclo ativo.

O valor de PR2 e do prescaler do TMR2 definem o período do sinal PWM.

O valor de CCPR1L:CCP1CON<5:4> define o ciclo ativo.

Por exemplo, vamos supor que estejamos utilizando o oscilador de 4MHz interno do PIC (Tosc = 250 nanosegundos) e queremos um sinal PWM de 25 KHz com um ciclo ativo de 25%.

O período do sinal será então de 1/25000 = 40 microsegundos.

Vamos definir o prescaler = 1

Usamos a fórmula para calcular o valor de PR2:

PWM period = [(PR2) + 1] x 4 x Tosc x TMR2 prescale value

40 us = [(PR2) + 1] x 4 x 250 ns x 1

PR2 + 1 = 40 us / 1 us

PR2 = 39

O ciclo ativo será 25% de 40 microsegundos o que dá 10 microsegundos.

Aplicando a fórmula para calcular o ciclo ativo temos:

PWM duty cycle = (CCPR1L:CCP1CON<5:4>) x Tosc x TMR2 prescale value

10 us = (CCPR1L:CCP1CON<5:4>) x 250 ns x 1

(CCPR1L:CCP1CON<5:4>) = 10 us / 250 ns

(CCPR1L:CCP1CON<5:4>) = 40

40 em binário é igual a 101000

Portanto, devemos fazer os bits 4 e 5 de CCP1CON igual a 0 e escrever 1010 (binário) no CCP1L.

Link para o comentário
Compartilhar em outros sites

O PWM funciona da seguinte forma:

Quando o valor de TMR2 se iguala ao valor de PR2 +1, o pino CCP1 é colocado em nível alto e o TMR2 é zerado. Neste momento, o ciclo termina e um novo ciclo se inicia.

Quando o valor do TMR2 se iguala ao valor de CCP1L, o pino CCP1 é colocado em nível baixo. Neste momento, termina o ciclo ativo.

O valor de PR2 e do prescaler do TMR2 definem o período do sinal PWM.

O valor de CCPR1L:CCP1CON<5:4> define o ciclo ativo.

Por exemplo, vamos supor que estejamos utilizando o oscilador de 4MHz interno do PIC (Tosc = 250 nanosegundos) e queremos um sinal PWM de 25 KHz com um ciclo ativo de 25%.

O período do sinal será então de 1/25000 = 40 microsegundos.

Vamos definir o prescaler = 1

Usamos a fórmula para calcular o valor de PR2:

PWM period = [(PR2) + 1] x 4 x Tosc x TMR2 prescale value

40 us = [(PR2) + 1] x 4 x 250 ns x 1

PR2 + 1 = 40 us / 1 us

PR2 = 39

O ciclo ativo será 25% de 40 microsegundos o que dá 10 microsegundos.

Aplicando a fórmula para calcular o ciclo ativo temos:

PWM duty cycle = (CCPR1L:CCP1CON<5:4>) x Tosc x TMR2 prescale value

10 us = (CCPR1L:CCP1CON<5:4>) x 250 ns x 1

(CCPR1L:CCP1CON<5:4>) = 10 us / 250 ns

(CCPR1L:CCP1CON<5:4>) = 40

40 em binário é igual a 101000

Portanto, devemos fazer os bits 4 e 5 de CCP1CON igual a 0 e escrever 1010 (binário) no CCP1L.

Ta começanso a clarear :D

Mais uma lidas e relidas, comparando com algum código acho que conseguirei entender antes de morrer, brincadeira!!

Obrigado Mulder

Link para o comentário
Compartilhar em outros sites

Por nada.

Continuando de onde cai no sono::lol:

Os passos para configurar o PWM, segundo recomendação da Microchip são:

1) Definir o período escrevendo no registrador PR2;

2) Definir o ciclo ativo escrevendo em CCPR1L:CCP1CON<5:4>

3) Apagar o bit 3 do registrador TRISB, para configurar o pino como saída;

4) Definir o prescaler e ligar o TMR2 em T2CON;

5) Configurar o módulo CCP1 como PWM, setando os bits 3 e 2 do CCP1CON;

No seu programa, quando você quiser mudar o ciclo ativo, você muda o valor de CCPR1L:CCP1CON<5:4>. Se quiser mudar o período, muda o valor de PR2.

Veja este programa:

http://www.esnips.com/doc/b9f6a9ed-e8cb-41de-b1ef-c2377697d005/Programa7

Link para o comentário
Compartilhar em outros sites

Escrevi um trecho do codigo pelo que entendi até agora, está correto?

Coloquei 2 entradas, de olhos vendados, pois quero controlar a largura do pulso da saída com

um potenciometro, Alguém pode me dizer como funciona as entradas com potenciometro???

E outra coisa, cheguei até ai, depois disso não sei como faço pra mandar pra saída, como faço

pra fazer a varredura da variação do potenciometro na entrada???

configurações:

INICIO

MOVLW B'00000000'

MOVWF INTCON ;TODAS AS INTERRUPÇÕES DESLIGADAS

CLRF PORTA ;LIMPA A PORTA A

CLRF PORTB ;LIMPA A PORTA B

BANK1 ;ALTERA PARA O BANCO 1

MOVLW B'00000011'

MOVWF TRISA ;DEFINE RA0 E RA1 COMO ENTRADA E DEMAIS COMO SAÍDA

MOVLW B'00000000'

MOVWF TRISB ;DEFINE TODO O PORTB COMO SAÍDA

MOVLW 0xFF

MOVWF PR2 ;INICIALIZA CCP1

BANK0 ;RETORNA PARA O BANCO 0

MOVLW 0x07

MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO DO COMPARADOR

MOVLW 0x05

MOVWF T2CON ;POSTSCALE 1:1, PRESCALE 4, TIMER 2 LIGADO

MOVLW 0x0F

MOVWF CCP1CON ;INICIALIZA CCP -> PWM

MOVLW 0xFF

MOVWF CCPR1L ;INICIALIZA Duty Cicle EM 100%

me ajudemmmmmmmmmmmmmm!!, please

Link para o comentário
Compartilhar em outros sites

O PIC16F628A não possui conversor A/D.

Terá que escolher outro modelo de microcontrolador.

Quantos pinos de I/O você irá utilizar no total?

Mulder vou usar um 16F877A então, mas me diz como funciona, eu vou criar

entrada que nela varia uma tensão, ai o programa vai ler e guardar numa variável,

esse valor vou setar no PR1?????

Link para o comentário
Compartilhar em outros sites

tem razao

desculpe troquei o site

era este

http://picprojects.org.uk/projects/ledchaserpwm/index.htm

Oceano esse projeto também não usa o PWM interno do uC, mas vou esperimentá-lo assim que tiver um tempo pois achei legal. Alem do que eu preciso controlar a velocidade de um motor ndo, mas mesmo assim muito obrigado pela colaboração!

Pessoal encontrei em um livro um exemplo de PWM, primeiro passo completo.

O próximo passo é associar a entrada do conversor A/D a temporização do PWM, alguém tem alguma sugestão?

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Arquivado

Este tópico foi arquivado e está fechado para 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...