medición de RPM utilizando interrupción

0

Estoy controlando la velocidad del motor y midiendo las RPM usando el módulo IR.

El método que utilicé funciona bien (giré el motor manualmente). Estoy enfrentando problemas cuando conecto el motor a la fuente de alimentación. Solo quiero detener el motor una vez que la velocidad alcance un cierto límite. Estoy contando los pulsos durante 5 segundos, una vez que el número de pulsos cruza 11. Detengo el motor.

Sin embargo, cuando proporciono voltaje al motor, el temporizador nunca llega al final (desbordamientos).

Fuente de alimentación para motor: 48V.

//This code is for ATMEGA 16

#include<avr\io.h>
#include<avr\interrupt.h>
#define F_CPU 1000000UL
#include <util/delay.h>

int del;
int x,x1,z,z1,a;
volatile int rpm;

int main (void){

DDRA = 0x00;
DDRD = 0xFF;
DDRC = 0xFF;    
DDRB = 0xFB;
ADCSRA = 0x87;
ADMUX = 0xC0;               // Selecting ADC0

TCNT1H = 0xAC;              //5 seconds timer for rpm
TCNT1L = 0x54;

TCCR1A = 0x00;
TCCR1B = 0x04;

MCUCSR = 0x40;
GICR = 0x20;                 //Enable interrupt 2
sei();

    while (1)
{   




    ADCSRA |= (1<<ADSC);
    while ((ADCSRA & (1<<ADIF)) == 0);
    {
        x = ADCL;
        PORTD = x;
        x1 = ADCH;
        PORTC = x1;
        del = ADCL;
        del |= ADCH << 8;       //ADC value from pin 40 (throttle)
        del = (del-512)/50;  


        if (del >=7)
        {
            PORTB = 0x08;   // if throttle is completely turned, rotate at 
                            //full speed
        }           

        else if (del > 0)  //if throttle at midway, send PWM pulses 
                           //accordingly
        {
        PORTB = 0x08;
        _delay_ms(del);
        PORTB = 0x00;
        _delay_ms(10-del);
        }

        if (del < 0)
        {
        PORTB = 0x00;     //motor stopped when throttle is at initial 
                           //position
        }
    }


    if ((TIFR & (0x1<<TOV1)))    //if timer flag HIGH
    {   

        if (rpm >= 11)   // if rpm is greater than 11 during five seconds
        {
            PORTD = 0xAA;
            PORTB = 0x00;   //stop the motor
            PORTC = rpm;
            _delay_ms(2000);
            rpm = 0;
        }

        else               //else continue 
        {
        PORTD = 0xFF;
        PORTC = rpm;
        _delay_ms(1000);
        rpm = 0;
        }   


        TCCR1B = 0;      //restart the timer
        TIFR = 0x1<<TOV1;

        TCNT1H = 0xAC;
        TCNT1L = 0x54;

        TCCR1A = 0x00;
        TCCR1B = 0x04;
        PORTD = 0x00;
        PORTC = 0x00;

    }
    }
}

ISR (INT2_vect)
    {
        rpm++;
    }

El sensor IR está en el pin 3. Estoy usando el módulo tal como está: enlace

Estoy usando este circuito para reducir el voltaje de Atmega16. hobby-hour.com/electronics/lm2576-5v-buck-regulator.png Los mosfets funcionan bien. Ya los he comprobado con carga pesada y carreras largas.

    
pregunta David Flo

2 respuestas

2

Su motor está creando emfs que pueden hacer que su circuito se reinicie. Debe, como mínimo, conectar un diodo inverso a través del motor. Esto no es solo una práctica estándar, sino que es casi obligatorio si desea evitar dañar el MOSFET. Intente agregar también algunos condensadores de desacoplamiento de la fuente de alimentación en los rieles de alimentación de los chips.

Los reguladores de voltaje también necesitan capacitores de entrada y salida. Si realmente los tiene ajustados pero considera que este detalle no es importante para mostrarlos en su diagrama, aquí comienza su experiencia de aprendizaje.

    
respondido por el Andy aka
0

Por lo que puedo ver, y es realmente difícil descifrar ese código, estás usando un método bastante extraño para medir la velocidad del motor.

El método normal es utilizar la interrupción de impulso de índice del sensor de RPM para capturar el valor actual de un temporizador, luego restablecer dicho temporizador listo para la siguiente interrupción de impulso. De esa manera, puede capturar el tiempo entre los pulsos independientemente de la rutina principal y las latencias de la misma.

La rutina principal debe comparar el período de pulso capturado actual con la velocidad de la demanda, utilizando las matemáticas apropiadas, y modular la unidad de manera apropiada para mantener la frecuencia de pulso requerida.

Su código actual parece tener grandes retrasos allí donde reinicia el número de RPM DESPUÉS de esos retrasos. Cuántas interrupciones suceden durante esos retrasos que se tiran ... quién sabe.

    
respondido por el Trevor_G

Lea otras preguntas en las etiquetas