DC motor forgásirány és fordulatszám szabályozás

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

DC motor forgásirány és fordulatszám szabályozás

HozzászólásSzerző: learner » 2018. március 27. kedd, 13:08

Sziasztok!
Segítségeteket szeretném kérni, egy egyenáramú motornak szeretném a fordulatszámát és az irányát szabályozni. Jelenleg azt szeretném elérni, hogy két nyomógomb segítségével tudjam a motor forgórészének a forgási irányát megváltoztatni és egy potméter segítségével a fordulatszámát szabályozni mindkét irányban. Készítettem egy programot, de nem úgy működik ahogyan elképzeltem:

Kód: Egész kijelölése

const int pinA = 5;
const int pinB = 6;
const int PotPin = A0;
int PotVal = 0;
int pwm = 0;
int modeval;
const int GombPIN1 = 2;
const int GombPIN2 = 3;
enum estate {Stop, Jobb, Bal};
estate State = Stop;

void setup() {
  Serial.begin(9600);
  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);
  pinMode(GombPIN1, INPUT_PULLUP);
  pinMode(GombPIN2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(GombPIN1), jobb, FALLING);
  attachInterrupt(digitalPinToInterrupt(GombPIN2), bal, FALLING);
}

void loop() {
switch (State) {
  case Stop:
  analogWrite(pinA, 0);
  analogWrite(pinB, 0);
  if (modeval == 1) {State = Jobb;}
  if (modeval == 2) {State = Bal;}
  break;
  case Jobb:
  while (modeval == 1) {
  PotVal = analogRead(PotPin);
  pwm = map(PotVal, 0, 1023, 0, 255);
  analogWrite(pinA, pwm);
  delay(10);
  break;
  case Bal:
  while (modeval == 2) {
  PotVal = analogRead(PotPin);
  pwm = map(PotVal, 0, 1023, 0, 255);
  analogWrite(pinB, pwm);
  delay(10);
  break;
  }
  }
}
}
void jobb() {modeval = 1;}
void bal() {modeval = 2;}


A probléma az, hogy egy nyomógomb lenyomását követően a motor elindul az egyik irányba, és a fordulatszámát is tudom szabályozni, de forgásirányt nem tudok váltani.
Egyéb információ: A kapcsolásban H-hidat használok a forgásirány megváltoztatásához.
Válaszokat előre is köszönöm!

learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

Re: DC motor forgásirány és fordulatszám szabályozás

HozzászólásSzerző: learner » 2018. március 27. kedd, 16:59

Megoldva. A hiba egy rosszul elhelyezett zárójel. A programba a Jobb: while a Bal: while után lett lezárva.

learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

Re: DC motor forgásirány és fordulatszám szabályozás

HozzászólásSzerző: learner » 2018. március 31. szombat, 10:31

Jelenleg így néz ki a programom:

Kód: Egész kijelölése

const int pinA = 5;
const int PotPin = A0;
int pin7 = 7;
int pin8 = 8;
int modeval = 0;
int PotVal = 0;
int pwm = 0;
int TimeStop = 0;
const int GombPIN1 = 2;
const int GombPIN2 = 3;
enum estate {Stop, Jobb, Bal};
estate State = Stop;

void setup() {
  Serial.begin(9600);
  pinMode(pinA, OUTPUT);
  pinMode(GombPIN1, INPUT_PULLUP);
  pinMode(GombPIN2, INPUT_PULLUP);
  pinMode(pin7, OUTPUT);
  pinMode(pin8, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(GombPIN1), jobb, FALLING);
  attachInterrupt(digitalPinToInterrupt(GombPIN2), bal, FALLING);
}

void loop() {
  switch (State) {
    case Stop:
    digitalWrite(pin7, LOW);
    digitalWrite(pin8, LOW);
          if (modeval == 1) {
            if (TimeStop == 2) {delay(3000);}
            State = Jobb;         
          }
          if (modeval == 2) {
            if (TimeStop == 2) {delay(3000);}
            State = Bal;
          }
          break;
      case Jobb:
      if (modeval == 1) {
          digitalWrite(pin7, HIGH);
          PotVal = analogRead(PotPin);
          pwm = map(PotVal, 0, 1023, 0, 255);
          analogWrite(pinA, pwm);
      }
      else {State = Stop;}
          break;
      case Bal:
      if (modeval == 2) {
          digitalWrite(pin8, HIGH);
          PotVal = analogRead(PotPin);
          pwm = map(PotVal, 0, 1023, 0, 255);
          analogWrite(pinA, pwm);
      }
      else {State = Stop;}
      break;
      }
  }
  void jobb() {
    modeval = 1;
    if (TimeStop < 2) {TimeStop ++;}
  }
  void bal() {
    modeval = 2;
   if (TimeStop < 2) {TimeStop ++;}
  }


Kicsit változtattam az áramkörön is, ugyanis most már egy L298N H-híddal oldom meg a forgásirány váltást, emiatt nincs szükségem 2 pwm jelre. A probléma az, hogy tudtommal az Arduino UNO-nak 2 interrupt pinje van, ezeket felhasználtam a forgás irányváltoztatáshoz , de a motort meg is kellene állítani, ehhez pedig egy újabb interrupt pin kellene. Valaki erre, ha tudna nekem egy megoldást, leírni esetleg azt megköszönném. :)

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9908
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: DC motor forgásirány és fordulatszám szabályozás

HozzászólásSzerző: Robert » 2018. március 31. szombat, 11:35

Rosszul tudod:
- 2 dedikált INT PIN (INT0/INT1 azaz D2/D3).
- Minden 8-as lábcsoport egy közös INTet is tud. PCINT0...2 néven. PortB, portC, PortD 1-1 PCINTre kötve.
Megmondhatod melyik lábon figyelje a 8-ból (1 vagy több is lehet). Rising és Falling módja van csak (Azaz PinChange: Mindkettőre jelez).

https://github.com/NicoHood/PinChangeInterrupt
https://github.com/neu-rah/PCINT
http://www.tavir.hu - a gazda :)

learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

Re: DC motor forgásirány és fordulatszám szabályozás

HozzászólásSzerző: learner » 2018. április 1. vasárnap, 9:13

Köszönöm, tökéletesen működik. :D :D :D


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég