Este tópico contém 0 resposta, possui 1 voz e foi atualizado pela última vez por  johnny.rabelo 3 meses .

Visualizando 1 post (de 1 do total)
  • Autor
    Posts
  • #382464

    johnny.rabelo
    Participante

    Olá estou fazendo um controle de um motor, onde ele reconhece pulsos e aciona a partida e atinge a velocidade conforme está setado o valor do potenciômetro.

    O grande problema é que só consegui fazer com que ele pare de 50 ms sem gerar pulsos e gostaria de fazer que ele também pare se os pulsos em um determinado tempo reduzam , ou o tempo entre pulsos aumente em 10% , por exemplo , em um determinado tempo. Podem me ajudar?

    //Hardware constants
    const int PASPin = 2; // entrada do PAS
    const int ledPin = 13, PWMOut=11; // o pino que o LED esta conectado e o pino de saida PWM

    const int PinoPotenciometro = A0;
    int ValorPot = 0;
    int pwm1 = 0;

    //Software constants
    const unsigned long activityTimeoutMS = 50; // Allowed PAS signal inactivity time before turning off
    const int startPulses = 8; // Number of PAS pulses needed before turning on
    const int lowPWMValue = 0; // PWM values to drive throttle input, default 56 (1,1 V) and 170 (3,4 V), U=n/255*5V, n=U/5V*255

    int highPWMValue =0;

    // Variables
    volatile int inputEdges = 0; // counter for the number of pulses since last reset
    volatile unsigned long lastEdgeTime = 0; // timestamp of last PAS pulse
    bool state=false; // variable holding information about the state of the output

    void setup() {
    pinMode(PASPin, INPUT); // initialize the PAS pin as a input
    attachInterrupt(digitalPinToInterrupt(PASPin), pulse, RISING); //Each rising edge on PAS pin causes an interrupt
    pinMode(ledPin, OUTPUT); // initialize the LED as an output
    pinMode(PWMOut, OUTPUT); // initialize the PWM pin as an output
    }

    void loop() {

    ValorPot = analogRead(PinoPotenciometro);
    pwm1 = map(ValorPot, 0, 1023, 0, 255);

    //If PAS signal is inactive for too long, turn off everything
    unsigned long curTime=millis();
    if ((curTime>lastEdgeTime)&&((curTime-lastEdgeTime)>activityTimeoutMS)) {
    turnOff();
    }

    //If system is off, check if the impulses are active
    if ((!state)&&((millis()-lastEdgeTime)<activityTimeoutMS)) {
    //if impulses are active, check if there were enough pulses to turn on
    if (inputEdges>startPulses) {
    turnOn();
    }
    }

    //Use LED for status info
    digitalWrite(ledPin, state);
    }

    //Turn off output, reset pulse counter and set state variable to false
    void turnOff() {
    noInterrupts();
    analogWrite(PWMOut,0 );
    inputEdges=0;
    state=false;
    interrupts();
    }

    //Turn on output and set state variable to true
    void turnOn() {
    analogWrite(PWMOut, pwm1);

    }

    //Interrupt subroutine, refresh last impulse timestamp and increment pulse counter (until 10000 is reached)
    void pulse() {
    lastEdgeTime=millis();
    if (inputEdges<100) {
    inputEdges++;
    }
    }

Visualizando 1 post (de 1 do total)

Você deve fazer login para responder a este tópico.