Ir ao conteúdo
  • Cadastre-se

PWM com PIC16F628A, duty cicle


jcrazy

Posts recomendados

Oi pessoal estou com duvidas na questão de variar meu duty cicle e não em gerar meu PWM

-Gerei meu pwm com 200Hz pelo hardware do pic com o ccs

-Quero variar o duty cicle, ex: ao ligar o pic fica com o duty em 10% apos 10 segundos vai para 20%, mais 10 segundos 30% e assim em diante até 100%

Fiz de varias maneiras mas ainda não me caiu a ficha em relação a conseguir mudular o duty, normalmente da erro ou não funciona

Um das maneiras que tentei, setei para estouro timer em 104ms

Freq 20MHz do pic

Freq que to usando 200Hz

Sera para variar o brilho de um led

Assim 10s/0,104=96 interrupções certo ?

#int_TIMER1

int x;

TIMER1_isr()

{

x=0;

x++;

if(x>=200)set_pwm1_duty(100);

else{set_pwm1_duty(0);}

}

void main()

{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

setup_timer_2(T2_DIV_BY_1,255,1);

setup_ccp1(CCP_PWM);

setup_comparator(NC_NC_NC_NC);

setup_vref(FALSE);

enable_interrupts(INT_TIMER1);

enable_interrupts(GLOBAL);

setup_oscillator(False);

// TODO: USER CODE!!

while(1){}

}

To bem perdido enquanto a isso

Link para o comentário
Compartilhar em outros sites

Fiz para o 16F877A. Fica como liçao de casa mudar para o 16F628A.

Fiz também aumentando o duty a cada 1 segundo. Mude para 10 segundos.

#include <16f877A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading

#use delay (clock=4000000)

int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1.
int8 duty;

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
q++; //Variável q incrementada a cada estouro do Timer1
if (q == 2)
{
duty+=10;
if (duty > 255)
{
duty = 0;
}
set_pwm1_duty(duty);
q=0;
}
set_timer1 (3036); //Preload do Timer1
}


void main()
{
setup_ccp1(ccp_pwm);
setup_timer_2(T2_DIV_BY_4,249,1);
set_pwm1_duty(duty);

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
enable_interrupts(INT_TIMER1); //Habilita interrupção timer1
enable_interrupts(global); //habilita interrupcão global

while(TRUE);
}

Link para o comentário
Compartilhar em outros sites

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

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!