Ciclo de trabalho para PWM:
set_pwmx_duty(valor);
valor: dados de 8 ou 16 bits que determinam o ciclo de trabalho. Esse valor, juntamente com o valor do TMR2 preescaler, determina o valor do ciclo de trabalho. Na configuração T1MER2, o pós-aquecimento deve ser 1.
Exemplo 1: Meça a largura de um pulso usando o módulo CCP. Componentes ISIS: Utiliza-se o modo de captura do CCP, configurando-o para detectar a borda de subida ou descida do pulso a ser medido.
Toda vez que ocorre uma detecção de borda, o valor de TMRl irá para o registro do módulo CCP.
CÓDIGO FEITO EM CCS C Compiler
#include <16F877A.h>
#fuses XT, NOWDT
#use delay(clock = 4MHz)
#ifndef lcd_enable
#define lcd_enable pin_E1 // pino enable do LCD
#define lcd_rs pin_E2 // pino rs do LCD
//#define lcd_rw pin_e2 // pino rw do LCD
#define lcd_d4 pin_D4 // pino de dados d4 do LCD
#define lcd_d5 pin_D5 // pino de dados d5 do LCD
#define lcd_d6 pin_D6 // pino de dados d6 do LCD
#define lcd_d7 pin_D7 // pino de dados d7 do LCD
#endif
#include <mod_lcd.c>
#byte PIR1 = 0x0C
int1 nuevopulso = 0;
int16 TFB = 0, TFS = 0, TF = 0;
float AP = 0.0, frequencia;
int1 cambio = 0;
#int_ccp1
void ccp1_int(){
if(cambio == 0){
TFS = CCP_1;
setup_ccp1(CCP_CAPTURE_RE);
cambio = 1;
}else{
TFB = CCP_1;
setup_ccp1(CCP_CAPTURE_RE);
cambio = 0;
if(nuevopulso == 0){
nuevopulso = 1;
}
}
}
void main(){
lcd_ini();
setup_timer_1(T1_INTERNAL);
setup_ccp1(CCP_CAPTURE_RE);
cambio = 0;
enable_interrupts(int_ccp1);
enable_interrupts(global);
while(TRUE){
if(nuevopulso >= 1){
TF = (TFB - TFS);
AP = TF * 1.0 / 1000.0;
frequencia = 1.0 / (AP/1000.0);
printf(lcd_escreve,"\f Pulso = %f ms\n Freq = %01.2f Hz",AP, frequencia);
nuevopulso = 0;
//delay_ms(100);
}
}
}
Saída de frequência usando CI 555 |
Logo, usando um outro exemplo com clock fixo verá que a precisão é siguinificativa.
Nenhum comentário:
Postar um comentário