Ir ao conteúdo

Como utilizar o Timer2 do PIC para PWM?


cassiamcorrea

Posts recomendados

Postado

Olá pessoal!

Estou desenvolvendo um trabalho de conclusão de curso, que é basicamente o controle de um sistema de nível, utilizando um microcontrolador comercial. O que eu uso é o PIC 18F4520.

Basicamente, ele tem uma malha PI com T=0,1seg. Preciso ajustar o timer2 pra 0,1 seg, mas não tenho nem ideia de como fazer. Procurei alguns tutoriais, mas não consegui entender. Alguém pode me ajudar? O clock é de 4Mhz!

Obrigada!

Postado

você precisa necessariamente usar o timer2? Porq nao utiliza o pino do PIC q foi feito p gerar o pwm?

Mas se você quer usar o pwm por software, tenho um exemplo aqui. Estou estudando as interrupçoes do PIC esses dias.

Dê uma lida no programa abaixo e estude. Ele utiliza o timer1, mas para usar o timer 2 não será muitas mudanças. Qualquer coisa, pergunte" Se eu souer, respondo :D

Código:


// Andre Broodryk
// Led fader
// 2006/07
//**************************************************************************************************

#include <16F917>
#fuses INTRC_IO,NOPROTECT,NOWDT,PUT
#use delay(clock=8000000)
#use standard_io(d)
#define preload 65458
#define red pin_d0
#define green pin_d1
#define blue pin_d2

//**************************************************************************************************
//Global variables
//**************************************************************************************************

int red_duty;
int green_duty;
int blue_duty;
int Intcount;

//**************************************************************************************************
//100Hz pwm (interrupt at 25.8kHz
//**************************************************************************************************

#INT_TIMER1
void timer_irq()
{
set_timer1(preload);

if (Intcount < 255)
{
if (Intcount == red_duty)
{
output_low(red);
}
if (Intcount == green_duty)
{
output_low(green);
}
if (Intcount == blue_duty)
{
output_low(blue);
}
}

else if(Intcount == 255)
{
Intcount = 0;
output_high(red);
output_high(green);
output_high(blue);
}
Intcount++;
}


//**************************************************************************************************
// Main Program
//**************************************************************************************************

void main()
{
setup_oscillator(OSC_8MHZ);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
red_duty = 63;
green_duty = 1;
blue_duty = 250;
Intcount = 0;

for (;;)
{


}
}
//**************************************************************************************************

flws

Postado

Oi Matheus e Felipe!!

Eu preciso usar o timer2 sim, porque quando defino o meu controlador na forma discreta, eu utilizo o método de Tustin, com um T=0,1seg. Portanto, preciso que as interrupçoes do PWM se dêem nesse intervalo (sim Felipe!!! é o tempo de integração! ) Eu estou utilizando o pino do PWM mesmo, o CCP1, mas preciso do timer2 também.

Por exemplo, para definir o tempo de ciclo do PWM eu preciso saber qual é o clock, e o período. Supondo um clock de 10000000, e um período de 127, eu tenho 3 opções de tempo de ciclo:

1) (1/10000000)*4*1*128 = 51.2us ou 19.5kHz

2) (1/10000000)*4*4*128 = 204.8us ou 4.9kHz

3) (1/10000000)*4*16*128 = 819.2us ou 1.2kHz

Eu preciso de um tempo de ciclo de 0,1seg , mas não estou sabendo qual o valor do clock correto. Isso é uma coisa que eu mesma defino, ou é particular de cada microcontrolador? A mesma coisa seria para o período... Pro PIC18F4520 eu acho que o período é de 255, mas também só ACHO, entende?

Outra dúvida que eu tenho, é sobre a declaração do timer2. Ela é feita dessa forma: setup_timer_2(T2_DIV_BY_1, 127, 1); esse último 1 eu não sei o que significa.....

Deu pra perceber que estou perdidinha da silva com esse timer né?? Coisa de iniciante...

Obrigada pelas respostas anteriores!!

Postado

Vamos la

Vejo que seu problema não é com a malha mas sim com os TImers do PIC em si,

Os calculos do PWM estão corretos, porém para um periodo grande do seu PWM, 0,1s no seu caso você tem de incluir na conta o valor do prescaler do timer2 , sugestão la no datasheet do 4520 tem a formula de calculo do PWM, de uma olhada nela,

E segundo, opte por usar o maior prescaler do timer2 possivel, isso eleva o tempo de incremento do Timer permitindo gerar tempos grandes.

E...putz você ta usando o CCS, o grande problema dele é que seu padrão nao obedece a norma C-ANSI, e alem do mais os registradores ai não seguem o padrão do datasheet.

Se quer programar legal em C eu sugiro que migre seu codigo para o MikroC ou o C18 da propria Mircrochip.

Abs.

Postado

Oi Felipe!

Deixa eu ver se entendi então:

Por exemplo, se estiver usando um tempo de integraçao de 0,01seg e clock de 4Mhz, com periodo de 255, meu timer2 tem q ser definido assim:

setup_timer_2(T2_DIV_BY_16, 255, 3);

porque seria (1/4000000)*4*16*256*3 = 0,01 ???

O que mata, é que pra um tempo de integração de 0,1 seg, meu clock tem que ser de 32kHz... isso confere? foi a unica relação que eu achei:

(1/32000)*4*4*256 = 0,1

porque usando clock de 4Mhz com tudo no talo:

(1/4000000)*4*16*256*16 = 0,065

É isso mesmo??

  • 2 meses depois...
Postado

Olá Cassia?

você resolveu esse seu problema???

Como ficou definido?

Estou tendo problemas com esses calculos tambem, se puder me ajudar eu agradeço.

Valeu

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!