Ir ao conteúdo

Controlar tensão com PIC


Pedrolobo8

Posts recomendados

Postado

Bom, esse é meu primeiro tópico aqui, sou iniciante na eltrônica e faço por Hobby. Uma dúvida que já tenho a algum tempo é como controlar a tensão em uma porta de um PIC, por exemplo: Controlar o brilho de um LED pelo PIC sem usar potenciômetro. Já tentei usar o PWM mas o LED fica apenas piscando, então ta ai minha dúvida, se alguém puder me ajudar ficarei muito grato.

OBS: Uso o MikroC 8.2

  • Coordenador
Postado

Você deve estar usando uma frequência no PWM muito baixa!

Poste aqui seu programa e o PIC que esta usando e logo terá ajuda!

Pela sua descrição não tem nem como ter ideia do problema!!!...

Postado

Boa noite, estou usando o PIC18F4520 a 4MHz

ai está o código.

void main(){

ADCON1 = 0x0F;

pwm1_init(4000);

pwm1_change_duty(127);

pwm_start();

do{

}while(1);

}

Obrigado pela resposta, aguardo, se possível, uma ajuda. :D

Postado

Este codigo lhe permite controlar via botao a tensão em cima de 3 led atraves de pwm


#include <16F628a.h> //Microcontrolador utilizado
#fuses hs,nowdt,noprotect,put,brownout,mclr,nolvp,nocpd
#use delay(clock=8000000,RESTART_WDT)

// Constante para o uso dos botões
#define t_filtro 400
#define min 0
#define max 10

// Variáveis globais
long int filtro1 = t_filtro; // Filtro do botão 1 (Incremento Vermelho)
long int filtro2 = t_filtro; // Filtro do botão 2 (Decremento Vermelho)
long int filtro3 = t_filtro; // Filtro do botão 3 (Incremento Verde)
long int filtro4 = t_filtro; // Filtro do botão 4 (Decremento Verde)
long int filtro5 = t_filtro; // Filtro do botão 5 (Incremento Azul)
long int filtro6 = t_filtro; // Filtro do botão 6 (Decremento Azul)
int flags = 0; // Flags de controle dos botões
int contador_red = 0; // Contador do perÃ*odo para o LED vermelho
int contador_green = 0; // Contador do perÃ*odo para o LED verde
int contador_blue = 0; // Contador do perÃ*odo para o LED azul
int pwm_red = 0; // Duty Cicle para o LED Vermelho
int pwm_green = 0; // Duty Cicle para o LED Verde
int pwm_blue = 0; // Duty Cicle para o LED Azul

// Definição dos flags de software
#bit botao_red_up_press = flags.0 // Marca se o botão 1 está pressionado
#bit botao_red_down_press = flags.1 // Marca se o botão 2 está pressionado
#bit botao_green_up_press = flags.2 // Marca se o botão 3 está pressionado
#bit botao_green_down_press = flags.3 // Marca se o botão 4 está pressionado
#bit botao_blue_up_press = flags.4 // Marca se o botão 5 está pressionado
#bit botao_blue_down_press = flags.5 // Marca se o botão 6 está pressionado

//Definição e inicialização dos port's
#use fast_io(a)
#use fast_io(
#byte porta = 0x05
#byte portb = 0x06

// Entradas para o microcontrolador
#bit botao1 = porta.2
#bit botao2 = porta.3
#bit botao3 = porta.0
#bit botao4 = porta.1
#bit botao5 = portb.4
#bit botao6 = portb.5

void main()
{
// Inicialização dos pinos de I/O
set_tris_a(0b11101111); //Configuração dos pinos de I/O para o PORTA
set_tris_b(0b11111000); //Configuração dos pinos de I/O para o PORTB

// Inicialização do TIMER0
setup_timer_0(RTCC_INTERNAL);
setup_wdt(WDT_2304MS);

// Inicialização do timer1
// Ele servirá para gerar o "passo" do PWM
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);

// Inicialização do TIMER2
// Ele deve estourar a cada 10ms para gerar um PWM de 100Hz Para efeito de visualização do LED,
// esta freqüência é suficiente para garantir o efeito de persistência da visão.
setup_timer_2(T2_DIV_BY_16,78,16);

// Inicialização das interrupções
enable_interrupts(INT_TIMER1); //Habilita a interrupção de overflow do timer1
enable_interrupts(INT_TIMER2); //Habilita a interrupção de overflow do timer2
enable_interrupts(GLOBAL); //Habilita as interrupções globais (GIE)
#priority timer1, timer2 // Define a prioridade das interrupções

// Limpeza dos PORTs
porta=0x00; //Limpa porta
portb=0x00; //Limpa portb

while(true) //Loop infinito que garante a funcionalidade do uC
{
RESTART_WDT(); // Limpa o Watch Dog timer

//Comandos para o PWM
// Assim que o valor do contador para um LEDs se equiparar ao estabelecido para o seu perÃ*odo,
// desligue o LED (nÃ*vel lógico 0)
if (contador_red >= pwm_red) output_low(pin_B0);
if (contador_green >= pwm_green) output_low(pin_B1);
if (contador_blue >= pwm_blue) output_low(pin_B2);

// Comandos para o botão 1 (RED_UP)
if (!botao1)
{
if (!botao_red_up_press)
{
if (filtro1 != 0) filtro1--;
else
{
botao_red_up_press = 1;
if (pwm_red != max) pwm_red++;
}
}
}
else
{
filtro1 = t_filtro;
botao_red_up_press = 0;
}


// Comandos para o botão 2 (RED_DOWN)
if (!botao2)
{
if (!botao_red_down_press)
{
if (filtro2 != 0) filtro2--;
else
{
botao_red_down_press = 1;
if (pwm_red != min) pwm_red--;
}
}
}
else
{
filtro2 = t_filtro;
botao_red_down_press = 0;
}


// Comandos para o botão 3 (GREEN_UP)
if (!botao3)
{
if (!botao_green_up_press)
{
if (filtro3 != 0) filtro3--;
else
{
botao_green_up_press = 1;
if (pwm_green != max) pwm_green++;
}
}
}
else
{
filtro3 = t_filtro;
botao_green_up_press = 0;
}


// Comandos para o botão 4 (GREEN_DOWN)
if (!botao4)
{
if (!botao_green_down_press)
{
if (filtro4 != 0) filtro4--;
else
{
botao_green_down_press = 1;
if (pwm_green != min) pwm_green--;
}
}
}
else
{
filtro4 = t_filtro;
botao_green_down_press = 0;
}


// Comandos para o botão 5 (BLUE_UP)
if (!botao5)
{
if (!botao_blue_up_press)
{
if (filtro5 != 0) filtro5--;
else
{
botao_blue_up_press = 1;
if (pwm_blue != max) pwm_blue++;
}
}
}
else
{
filtro5 = t_filtro;
botao_blue_up_press = 0;
}


// Comandos para o botão 6 (BLUE_DOWN)
if (!botao6)
{
if (!botao_blue_down_press)
{
if (filtro6 != 0) filtro6--;
else
{
botao_blue_down_press = 1;
if (pwm_blue != min) pwm_blue--;
}
}
}
else
{
filtro6 = t_filtro;
botao_blue_down_press = 0;
}

} // Fim do while(true)
} // Fim do programa


// Aqui entra a configuração da função de interrupção do TIMER1 (quando ele "estoura").
#int_TIMER1
void TIMER1_isr()
{
contador_red++;
contador_green++;
contador_blue++;
set_timer1(63535); // O TIMER1 vai estourar a cada 1,0ms
}

//Aqui entra a configuração da função de interrupção do TIMER2 (quando ele "estoura").
#int_TIMER2
void TIMER2_isr()
{
if(pwm_red != 0) output_high(pin_B0); // LED RED
if(pwm_green != 0) output_high(pin_B1); // LED GREEN
if(pwm_blue != 0) output_high(pin_B2); // LED BLUE
contador_red = 0;
contador_green = 0;
contador_blue = 0;
set_timer1(63535); // O TIMER1 vai estourar a cada 1,0ms
}

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

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!