Menú
Foros
Nuevos mensajes
Buscar en foros
Novedades
Nuevos mensajes
Nuevos recursos
Última actividad
Recursos
Últimas revisiones
Buscar recursos
Acceder
Registrarse
Novedades
Buscar
Buscar
Buscar sólo en títulos
De:
Nuevos mensajes
Buscar en foros
Menú
Acceder
Registrarse
Install the app
Instalar
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Mostrar voltaje sin usar ADC
JavaScript está desactivado. Para una mejor experiencia, por favor, activa JavaScript en el navegador antes de continuar.
Estás usando un navegador obsoleto. No se pueden mostrar este u otros sitios web correctamente.
Se debe actualizar o usar un
navegador alternativo
.
Responder al tema
Mensaje
[QUOTE="callecuatro1976, post: 1236674, member: 17716"] Si veo que no se puede hacer una función voy a probar de adaptarlo y subo lo que hice, gracias [CODE] #include <16f886.h> #device ADC=10 #use delay(internal = 8MHz) #define LCD_DATA_PORT getenv("SFR:PORTC") #include <flex_lcd.c> #define LCD_RW_PIN PIN_C3 //#include <internal_eeprom.c> int1 flagHayDatos=0; float const ticks_us = 4.0; // microsegundos por Tick del Timer 1 @ 8 MHz. (Osc. Interno) //float const ticks_us = 8.0; // microsegundos por Tick del Timer 1 @ 8 MHz. (Osc. Cristal) long int var2=0; int8 flancos; int8 flag_flanco; int16 periodo1,periodo2,periodo3; int16 tiempo_alto,tiempo_bajo,tiempo_total; float us_alto,us_bajo,us_total,valor2,amper, duty; int porcentaje; int frecuencia; int8 ciclo_activo=1; int16 cont3; #define pin_decr PIN_a5 #define pin_incr PIN_a4 int16 cont4; float conteo = 0; void energia2() { // set_adc_channel(11); // delay_us(50); // ene = read_adc(); // if(ene<200) if(input(pin_B4)==0){ cont4++; delay_ms(1); if (cont4 >10) { write_eeprom(04,conteo); delay_ms(50); cont4 = 0; } } } #INT_EXT void sdi_externa_RB0 (void) { flancos++; // Incrementar la variable "flancos" if(!flag_flanco) // Si el flanco del pulso es bajo... { if(flancos == 1) // Si el conteo de flancos es 1... { set_timer1(0); // Limpiar el Timer 1 periodo1 = get_timer1(); // "periodo1" tendrá el tiempo del pulso en alto. } if(flancos == 3) // Si el conteo de flancos es 3... periodo3 = get_timer1(); // "periodo3" tendrá el tiempo del pulso en alto. EXT_INT_EDGE(H_TO_L); // Establecer la interrupción por flanco de bajada. flag_flanco = 1; // Indicar que el próximo flanco será de bajada. } else // Caso contrario. (Pulso en estado alto)... { periodo2 = get_timer1(); // "periodo2" tendrá el valor del pulso en bajo. EXT_INT_EDGE(L_TO_H); // Establecer la interrupción por flanco de subida. flag_flanco = 0; // Indicar que el próximo flanco será de subida. if(flagHayDatos==0){ // Si los datos anteriores han sido procesados ... flagHayDatos=1; // Indico que ya hay nuevos datos de flancos para calcular } } if(flancos > 2)flancos = 0; // Si la variable "flancos" llega a 3, ponerla a 0. } void establecer_ciclo (int8 ciclo) { set_pwm1_duty(ciclo); // Establecer el ciclo activo } void pulsadores() { if (input(PIN_A4)==0) { while(!input(pin_a4)){ ciclo_activo ++; // Incrementar el ciclo activo. if (ciclo_activo > 249) ciclo_activo = 249; // No permitir que el ciclo activo suba de 249 delay_ms(10); establecer_ciclo(ciclo_activo); } } if (input(PIN_A5)==0) { while(!input(pin_a5)){ ciclo_activo --; // Disminuir el ciclo activo. if (ciclo_activo <= 1) ciclo_activo = 2; // No permitir que el ciclo activo baje de 1 delay_ms(10); establecer_ciclo(ciclo_activo); } } } void energia() { // set_adc_channel(11); // delay_us(50); // ene = read_adc(); // if(ene<200) if(input(pin_B4)==0){ cont3++; delay_ms(1); if (cont3 >10) { write_eeprom(03,ciclo_activo ); delay_ms(50); cont3 = 0; } } } void mostrar_conteo (float conteo) { if(conteo < 10) { lcd_gotoxy(11,1); printf(lcd_putc,"V: %0.1f ", conteo); } else { lcd_gotoxy(11,1); printf(lcd_putc,"V: %0.1f ", conteo); } } void main() { ciclo_activo =read_eeprom(03); establecer_ciclo(ciclo_activo); setup_ccp1(CCP_PWM); setup_timer_2(T2_DIV_BY_4,249,1); // 1000 Hz. @ 4 MHz. set_pwm1_duty(1); // Ciclo activo al mínimo setup_adc_ports(sAN1|san3|san11); setup_adc(ADC_CLOCK_INTERNAL); setup_timer_1(T1_INTERNAL | T1_DIV_BY_8); enable_interrupts(int_ext); ext_int_edge(0,L_TO_H); enable_interrupts(global); #ZERO_RAM // Limpiar RAM. (Variables en 0) lcd_init(); establecer_ciclo(ciclo_activo); float conteo = 0; int16 cont_r = 0, retardo; while (true) { if(flagHayDatos==1){ if((periodo3 > periodo2) && (periodo2 > periodo1)) { tiempo_alto = periodo2 - periodo1; // Obtener el periodo del pulso en estado alto. tiempo_bajo = periodo3 - periodo2; // Obtener el periodo del pulso en estado bajo. tiempo_total = tiempo_alto + tiempo_bajo; // Obtener el periodo de la frecuencia. us_alto = ticks_us * tiempo_alto; // Obtener el periodo en microsegundos del pulso en alto. us_bajo = ticks_us * tiempo_bajo; // Obtener el periodo en microsegundos del pulso en bajo. us_total = ticks_us * tiempo_total; // Obtener los microsegundos en total de la frecuencia. frecuencia = 1 / (us_total / 1000000); // Obtener la frecuencia. duty = ((float) tiempo_bajo / (float)(tiempo_bajo + tiempo_alto)); porcentaje = (duty * 100) + 10; // Físicamente el + 0.5 puede no ser necesario. (Ajusta desviación pero consume ROM) } flagHayDatos=0; } lcd_gotoxy(1,1); printf(lcd_putc,"Hz:%03u ",frecuencia); if(porcentaje < 3)porcentaje = 0; if(porcentaje > 95)porcentaje = 99; lcd_gotoxy(1,2); printf(lcd_putc,"Duty:%02u%% ",porcentaje ); flagHayDatos=0; delay_ms(100); // Retardo para disminuir parpadeos en la pantalla. (No afecta interrupción externa.) if(flagHayDatos==0){ frecuencia = 0; porcentaje=0; } pulsadores(); energia(); energia2(); set_adc_channel(1); delay_us(30); amper=0; for(var2=0;var2<50;var2++) { amper=amper+ read_adc(); delay_us(62); } valor2 = amper / 50; valor2 = valor2 * 20 / 1023; lcd_gotoxy(11,2); printf(lcd_putc,"A=%4.2f",valor2); delay_ms(60); retardo = 200; if(!input_state(pin_decr)) { while(!input_state(pin_decr)) { cont_r ++; if(cont_r > 9) // Si "cont_r" llega a 10, se reduce el retardo. retardo = 50; else retardo = 250; conteo -= 0.1; if(conteo <= 0) { conteo = 0; cont_r = 0; // Para evitar el desborde por mantener el pulsador presionado. } mostrar_conteo(conteo); delay_ms(retardo); } cont_r = 0; // Limpiar "cont_r" si no se entra al bucle. } if(!input_state(pin_incr)) { while(!input_state(pin_incr)) { cont_r ++; if(cont_r > 9) // Si "cont_r" llega a 10, se reduce el retardo. retardo = 50; else retardo = 250; conteo += 0.1; if(conteo > 18) { conteo = 18; cont_r = 0; // Para evitar el desborde por mantener el pulsador presionado. } mostrar_conteo(conteo); delay_ms(retardo); } cont_r = 0; // Limpiar "cont_r" si no se entra al bucle. } } }[/CODE] Acá está todo el trabajo pero cómo me imaginaba no funciona bien , no van de la mano el voltaje que es el contador y el ciclo activo , hay que seguir trabajando. [/QUOTE]
Verificación
Responder
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Mostrar voltaje sin usar ADC
Arriba