Boa noite Claudio, tudo bem? Espero que sim, pode me ajudar com uma programa que vc escreveu?
gostaria de mudar a frequência do pwm de 1khz para 10khz teria como me mostrar onde ajusto no programa?
Segue o programa:
//******************************************************************************
//
// PWM_SW_EPP.C
//
//
// CONTROLE DE POTENCIA CARGA CC (METODO PWM)
//
// Utiliza 2 chaves dactilares para controle.
// Frequência PWM de 1khz
//
// Autor: Cláudio Lários
// Data: 04/11/2014
// Alteração: 09/08/2016 - salva na eeprom a situação da saída
//
// Este arquivo é parte integrante do blog "LÁRIOS.TECNOLOGIA.WS'.
// Obs. apenas para fins didáticos.
//
// PINAGENS:
// pino 1 - +5v
// pino 2 - chave dactilar ao gnd
// pino 3 - chave dactilar ao gnd
// pino 4 - desligado
// pino 5 - saída pwm a um resistor de 470 a base do transistor npn. Emissor
// ao gnd e coletor a carga a ser controlada (conforme corrente).
// pino 6 - desligado
// pino 7 - desligado
//
//==============================================================================
#include <12F675.h>
#device adc=8
#use delay(clock=4000000)// OSC INTERNO DE 4MHZ
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT //CONFIG WORD
#rom 0x2100 = {2}
//bytes
#byte gpio = 0x05
#byte trisio = 0x85
#byte tmr0 = 0x01
#byte wpu = 0x95
#bit gwpu = 0x81.7 //geral pullups
#bit out = 0x5.2 //saida pwm
#bit sw_up = 0x5.4 //sw aumenta percentual ligado
#bit sw_dw = 0x5.5 //sw reduz percentual ligado
//VARIÁVEIS GLOBAIS
int8 cont,pwm,passo;
unsigned int1 f_gr,f_t1;
const int8 velocidade = 20; //tempo de 5 segundos para ir do 0 a 100% na saída
#int_timer0
void tmr_isr(){//GERA PWM NA SAIDA
if(!passo){
pwm=cont;
tmr0=~pwm;
passo++;
if(pwm==2){ out=0;}else {out=1;}
}
else
{
tmr0=pwm;
passo=0;
if(pwm==254) {out=1;} else{out=0;}
}
}
//==============================================================================
// CONFIGURAÇÕES
//==============================================================================
void main() {
setup_adc_ports(NO_ANALOGS|VSS_VDD);//DESLIGA COMPARADORES
setup_adc(ADC_OFF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_4);//TIMER 0
setup_timer_1(T1_DISABLED); //DESABILITA TIMER 1
setup_vref(FALSE);//DESLIGA VREF
setup_comparator(NC_NC_NC_NC);//DESLIGA COMPARADORES
wpu=0b110000;//pullup
gpio=0;//ZERA GPIO
trisio= 0b111011; //ACERTA DIREÇÃO DOS PORTS
passo=0;
gwpu=0;//geral dos pullups
cont=read_eeprom(0);
pwm=cont;
enable_interrupts(GLOBAL);//liga geral das interrupções
enable_interrupts(INT_TIMER0);//liga interrupção do tmr0
f_t1=0;
//==============================================================================
// INICIO DO PROGRAMA
//==============================================================================
for(;;){//LOOP INFINITO
f_gr=0;
if(!sw_up){ f_gr=1; if(++cont==255)cont--; //testa chave de incremento
}
if(!sw_dw){ f_gr=1; if(--cont==1)cont++; //testa chave de decremento
}
if(f_gr)f_t1=1;
if(!f_gr&&f_t1){
disable_interrupts(GLOBAL);
f_t1=0;
write_eeprom(0,cont);
enable_interrupts(GLOBAL);
}
delay_ms(velocidade);//velocidade de incrementos/decrementos
}
}
Desde já muito obrigado!
Olá Sergio!
Num pwm de 10 khz teremos um passo de 1 microsegundos (1 % => 1 microsegundo ligado e 99 microsegundos desligado).
O Pic trabalhando com clock interno de 4 mhz resulta em cada instrução gastando 1 microsegundo. Por aqui já vemos que não vamos conseguir gerar este valor de pwm na faixa de 0 a 100 %.
Sugiro que você use um pic que tenha em seu hardware interno um modulo PWM.
Ola Claudio, vou ver isso obrigado!!! forte abraço!!!!!