Olhe aqui @aphawk e pessoal o meu código para calcular o valor RMS de corrente e tensão. o medidor de corrente tem na sua saída um ruido de 0.05, já o de tensão marca certinho... se eu utilizar a interrupção por timer acho que resolveria o problema... Alguém aqui no grupo a partir desse meu código saberia me dizer como fazer isso?
Já li algumas coisas sobre o timer, mas acabo não sabendo colocar no meu código. Se alguém puder ajudar fico grato.
int n;
float Corrente_media_quadratica, Valor_rms_C, Corrente_instantanea, soma_corrente_quadratica, corrente_quadratica, VreadADC_C;
float Tensao_media_quadratica, Valor_rms_T, tensao_instantanea, soma_tensao_quadratica, tensao_quadratica, VreadADC_T;
void main()
{
setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(1023);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
// TODO: USER CODE!!
while(true)
{
soma_corrente_quadratica = 0;
soma_tensao_quadratica = 0;
for (n=0; n<101; n++)
{
set_adc_channel(0);
delay_us(20);
VreadADC_C = read_adc();
set_adc_channel(1);
delay_us(20);
VreadADC_T = read_adc();
Corrente_instantanea = (5*(VreadADC_C - 511.5))/(1023);
corrente_quadratica = corrente_instantanea*corrente_instantanea ;
soma_corrente_quadratica = soma_corrente_quadratica+corrente_quadratica;
tensao_instantanea = (5*((VreadADC_T/1023)))-2.5; //retira o ofsset inserido, como resultado uma senoide que varia de +2.5 à -2.5
tensao_quadratica = tensao_instantanea*tensao_instantanea ;
soma_tensao_quadratica = soma_tensao_quadratica+tensao_quadratica;
delay_us(127);
}
Corrente_media_quadratica = soma_corrente_quadratica/100.0;
Valor_rms_C = (sqrt(Corrente_media_quadratica))/(0.185);
Tensao_media_quadratica = soma_tensao_quadratica/100;
Valor_rms_T = (sqrt(Tensao_media_quadratica));
delay_ms(200);
printf(lcd_putc,"\f %1.2f",Valor_rms_C);
printf(lcd_putc,"\nVrms: %1.3f",Valor_rms_T);
}
}
Segue o circuito também mostrando os resultador.