CENTRAL DE ATENDIMENTO
De segunda à sexta das 8:00 às 17:30
(11) 3522-7626 / vendas@robocore.net
Retornar
ao topo

Classifique este tópicoPéssimoRuimMedianoBomÓtimo
Autor
Mensagem
3
jwr

Level 0
329010 xp

Registrado em:
19/03/2013





Mensagens:
5
3
jwr

Responder com citações
Mensagem Sex Abr 03, 2020 6:21 pm
Controle de motor através de pulsos
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++;
  } 
}
Mostrar mensagens desde a última:




Ir para:  
Todos os horários são GMT - 3 HorasVocê não tem permissão para escrever novas mensagens
v não tem permissão para responder às mensagens
Você não tem permissão para editar suas mensagens
Você não tem permissão para deletar suas mensagens
Você não tem permissão para classificar tópicos
Você não tem permissão para classificar mensagens
Você não tem permissão para votar em enquetes
Anexar downloads : Proibido
Fazer Download de Arquivos: Proibido
Powered by phpBB © 2001 phpBB Group