Autor Tema: Ayuda - Tacometro XC8  (Leído 1833 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Ayuda - Tacometro XC8
« en: 06 de Septiembre de 2014, 14:59:15 »
Hola gente como va ? hace poco que empece a programar en XC8 y todavia no estoy del todo ducho , empece a realizar un tacometro realizando el modulo CCP en Capture Mode por lo cual calcularia los RPM teniendo el periodo con el Timer 1 entre pulso y pulso , mi idea es llevarlo luego a una PC  pero por ahora querria saber que opinan del programa y como podria mejorarlo usando XC8 . De hecho lo simule con el proteus y siempre se desborda ya que los tiempos son muy chicos para contar y me gustaria saber como puedo hacer para que lea un valor , me lo devuleva y espere a que le pida otro valor ?

La señal de entrada al pic esta dada por un sensor hall con un smith trigger , el motor tiene una frecuencia desde 0 rpm hasta 1200 rpm . y la idea es aprovechar todo el espectro de medicion lo mejor posible . Al simularlo miro los registros TMR1H y TMR1l los cuales se desbordan constantemente

a todo esto estoy bien encaminado ? recomendaciones ?

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000
/*
 *  Captura tiempo entre pulsos entrantes por RB0
 */


// CONFIG1
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0      // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// CONFIG2
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode enabled)


void main ()
{
    OSCCON = 0x60 ;
    TRISA = 0x00 ;
    TRISB = 0x01 ;
    PORTA = 0x00 ;
    PORTB = 0x00 ;
    CCP1CON = 0x00 ;
    TMR1H = 0x00 ;
    TMR1L = 0x00 ;
    INTCON = 0x00 ;
    PIE1 = 0x00 ;
    PIR1 = 0x00 ;
    CCP1CON = 0x05 ;
    T1CON = 0x01 ;

    while (1){

        if (PIR1bits.CCP1IF == 1)
        {

            PIR1bits.CCP1IF = 0 ;
            PORTBbits.RB3 = 1 ;
            __delay_ms (1000);

        }
        PORTBbits.RB3 = 0 ;
    }
}


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda - Tacometro XC8
« Respuesta #1 en: 07 de Septiembre de 2014, 01:02:15 »
  Como tu indicas, el ciclo de instrucción es muy chico para el tiempo que quieres contar.

  Ten en cuenta que para el caso de máximas RPM (1200), estarías contando 20 pulsos por segundo. Por lo tanto se produce un pulso cada 50mS.

  Tienes el PIC trabajando a 4 MHz, por lo tanto el ciclo de instrucción es de 1 uS.

  Si el timer1 se incrementa con la frecuencia de trabajo (es decir que se incrementa cada 1 uS), al pasar 50 mS tu timer1 habrá contado 50mS / 1uS --> 50 mil ciclos.

  Lo anterior nos hace ver que el timer1 no se desbordará a las máximas RPM, pero al bajarlas (digamos a 600 RPM) el timer1 debería contar 100 mil ciclos. Por lo tanto desbordará ya que sólo puede contar hasta 65535.

  100 mil ciclos * 1uS = 100mS. Si hacemos 1 / 100mS nos da 10 que serían los pulsos por segundo. Si multiplicamos eso por 60 (para obtener las RPM) nos da efectivamente 600.


  Se podría configurar el timer1 con algún prescaler (si es que el pic que estás utilizado lo permite), y así en lugar de incrementarse cada ciclo de instrucción, podría hacerlo digamos cada 16 ciclos.

  Otra forma de implementar un tacógrafo sería contar directamente los pulsos provenientes del sensor por un período digamos de 1 segundo. Luego bastará multiplicar los pulsos obtenidos por 60.
  Claro que de ésta forma la cuenta del tacógrafo variará de 60 en 60.

  Todo dependerá de las prestaciones del pic y las prestaciones que pretendas para el tacógrafo.

  Por cierto ¿Qué PIC estás utilizando?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re: Ayuda - Tacometro XC8
« Respuesta #2 en: 07 de Septiembre de 2014, 13:43:47 »
Muchas Gracias estoy Tomando nota , el pic que uso es un PIC16F88 que se le puede colocar un preescaler de 1/16

Desconectado nahueldiaz1992

  • PIC12
  • **
  • Mensajes: 75
Re: Ayuda - Tacometro XC8
« Respuesta #3 en: 07 de Septiembre de 2014, 23:00:11 »
Hola denuevo he improvisado y mejorado un poco el programa utilizando el vector interrupcion . Lo que me gustaria saber es si estoy realizando bien las cuentas , yo elijo un clock en OSCCON , ej : en este caso 250 khz y luego al activar el TMR1 con preescaler 1:8 quedaria un clock de 31.25 khz ?

el calculo realizado es el siguiente =

{[1/ (250 000)] * 4 }  = 8 us para el clock del microcontrolador

Y Ademas , el clock del timer con preescaler de 1:8 seria =

{[1/(250 000 /8)] * 4} =  128 us para el clock del TMR1

por lo cual para 1200 RPM quedaria

1/1200 = 83 us
1/600   = 1.6 ms
1/100   = 1 ms
1/50     = 0.02 s
1/10     = 0.1 s

por lo tanto verificamos que el clock no se desborda ==>

TMR1 (CLK = 31.25 khz)

16 BITS = 65536 cuentas con las cuales desbordaria el contador para lo cual vemos que

65536 * 128 us = 8.3886 seg

con lo cual el clock nunca desboradara y en cuanto al periodo entre pulso y pulso que me da el timer 1 sera medianamente exacto .

Programa

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000
/*
 *  Captura tiempo entre pulsos entrantes por RB0
 */


// CONFIG1
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB0      // CCP1 Pin Selection bit (CCP1 function on RB0)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

// CONFIG2
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON        // Internal External Switchover bit (Internal External Switchover mode enabled)


void interrupt isr (void)
{
    if (PIR1bits.TMR1IF == 1){
        TMR1H = 0 ;
        TMR1L = 0 ;
        PIR1bits.TMR1IF = 0 ;
       
    }
   
    if (PIR1bits.CCP1IF == 1){
     PORTBbits.RB3 = 1 ;
     
     PIR1bits.CCP1IF = 0 ;
     PORTBbits.RB3 = 0 ;
    }
   

}


void main ()
{
    OSCCON = 0x10 ;
    TRISA = 0x00 ;
    TRISB = 0x01 ;
    PORTA = 0x00 ;
    PORTB = 0x00 ;
    CCP1CON = 0x00 ;
    TMR1H = 0x00 ;
    TMR1L = 0x00 ;
    INTCON = 0xD0 ;
    PIE1 = 0x05 ;
    PIR1 = 0x00 ;
    CCP1CON = 0x05 ;
    T1CON = 0x31 ;

    while (1){

}


igualmente me da error el codigo y no se el xq me dice que espera un end al final de todo ... ? ?



Estoy en lo correcto ?? falta algo alguna mejora ?? Y por supuesto muchas gracias a todo el que me de una mano ! :)
« Última modificación: 07 de Septiembre de 2014, 23:04:52 por nahueldiaz1992 »


 

anything