Sari la conținut
ELFORUM - Forumul electronistilor

control motorase cc


Postări Recomandate

buna ziua. folosesc un arduino uno si o placa cu semipunti cu tle94112el de la infineon pentru a comanda independent 6 motorase din telecomanda IR. atunci cand vreau ca la o apasare a unui buton, un motor sa porneasca, acesta se invarte fin, fara pulsatii. dupa ce am implementat codul de mai jos, prin care comand rotirea motorului doar atat timp cat tin apasat butonul alocat motorului respectiv, aceste nu se mai invarte fin, ci este alimentat in impulsuri, aproximativ 2 impulsuri pe secunda. am folosit toate cele 3 frecvente pwm oferite de place (80, 100, 200hz) si diferiti factori de umplere, fara rezulatat. adaugand inca 2 motoare, am observat ca perioada impulsurior s-a marit, chiar daca eu comand rotatia unui singur motor din cele 3, astfel motorul este alimentat cu aproximativ un impuls la 0,8 secunde. aveti vreo idee care ar putea fi cauza? sau daca mai stiti o alta metoda de a comanda rotirea motorului inafara de cea utilizata de mine, va rog.

#include <TLE94112.h>
#include <Tle94112Motor.h>
#include <IRremote.h>

#define unu 0x1
#define doi 0x2
#define trei 0x3
#define cinci 0x5

unsigned long timestamp = 0;
#define TIMEOUT   200

int RECV_PIN = 2;

Tle94112 controller = Tle94112();

Tle94112Motor motor1(controller);
Tle94112Motor motor2(controller);
Tle94112Motor motor3(controller);


IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{

   irrecv.enableIRIn();
  controller.begin();

  motor1.connect(motor1.HIGHSIDE, controller.TLE_HB1);
  motor1.connect(motor1.LOWSIDE, controller.TLE_HB2);

  motor1.setPwm(motor1.HIGHSIDE, controller.TLE_PWM1);
 
  motor1.setPwmFreq(motor1.HIGHSIDE, controller.TLE_FREQ200HZ);


  motor2.connect(motor2.HIGHSIDE, controller.TLE_HB3);
  motor2.connect(motor2.LOWSIDE, controller.TLE_HB4);

  motor2.setPwm(motor2.HIGHSIDE, controller.TLE_PWM2);

  motor2.setPwmFreq(motor2.HIGHSIDE, controller.TLE_FREQ200HZ);

  
  motor3.connect(motor3.HIGHSIDE, controller.TLE_HB5);
  motor3.connect(motor3.LOWSIDE, controller.TLE_HB6);

  motor3.setPwm(motor3.HIGHSIDE, controller.TLE_PWM3);

  motor3.setPwmFreq(motor3.HIGHSIDE, controller.TLE_FREQ200HZ);

  motor1.begin();
motor2.begin();
motor3.begin();

}

void loop()
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); 

if (results.value == unu)
    {
motor1.start(255);
timestamp < millis();

}

 if(results.value == unu){
        timestamp < millis();
    }
    
if(millis() - timestamp > TIMEOUT){

  motor1.start(0);
}

if (results.value == doi)
    {
motor2.start(255);
timestamp < millis();

}

 if(results.value == doi){
        timestamp < millis();
    }
    
if(millis() - timestamp > TIMEOUT){

  motor2.start(0);
}

if (results.value == trei)
    {
motor3.start(255);
timestamp < millis();

}

 if(results.value == trei){
        timestamp < millis();
    }
    
if(millis() - timestamp > TIMEOUT){

  motor3.start(0);
}

if (results.value == cinci)
    {
motor3.start(255);
motor2.start(255);
motor1.start(255);
timestamp < millis();

}

 if(results.value == cinci){
        timestamp < millis();
    }
    
if(millis() - timestamp > TIMEOUT){

  motor3.start(0);
  motor2.start(0);
  motor1.start(0);
}
}
}

 

Link spre comentariu
  • Răspunsuri 28
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

daca am inteles eu bine de la cel care mi-a zis sa folosesc comanda asta, compara durata intre doua coduri consecutive trimise de telecomanda si TIMEOUT. cand am pus egal in loc de mai mic, cum de altfel a fost recomandarea celui care m a ajutat, motorul pornea cand apasam tasta unu si se oprea cand o apasam din nou. cu < in loc de egal merge cum am scris mai sus. stii alta metoda de a obtine functionarea pe care o vreau? dupa cum am spus, intampin probleme cu configuratia actuala.

 

Link spre comentariu

Eu nu am inteles foarte bine cand doriti sa porneasca un  motor si cand doriti sa se opreasca motorul respectiv.

Doriti sa functioneze doar cat timp este apasata tasta respectiva ? De exemplu apasa 1 porneste motor 1, cat timp tin apasata tasta 1 motorul sa functioneze continuu (cu factorul pwm fixat), cand nu mai tin apasata tasta 1 motorul 1 se opreste.

Pentru exemplu dat de mine (nu stiu exact ce date trimite telecomanda, dar preluand din programul dvs ) ar trebui ca in foarte scurt timp de la momentul incare nu mai apasati tasta 1 de exemplu, in 200ms sa se opreasca motorul 1.

Nu e cel mai optim cod dar e modificat la minim cel pus de dvs, asa puteti observa modificarile facute. Nu l-am testat neavand instalate librariileTLE. Daca tot apar intreruperi la motoare, puteti incerca sa cresteti valoarea TIMEOUT sa vedeti daca se rezolva. (am adaugat si initializarea portului serial care lipsea Serial.begin() )

#include <TLE94112.h>
#include <Tle94112Motor.h>
#include <IRremote.h>

#define unu 0x1
#define doi 0x2
#define trei 0x3
#define cinci 0x5

unsigned long timestamp1 = 0;
unsigned long timestamp2 = 0;
unsigned long timestamp3 = 0;
unsigned long timestamp5 = 0;
#define TIMEOUT   200

int RECV_PIN = 2;

Tle94112 controller = Tle94112();

Tle94112Motor motor1(controller);
Tle94112Motor motor2(controller);
Tle94112Motor motor3(controller);


IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{

   irrecv.enableIRIn();
  controller.begin();

  motor1.connect(motor1.HIGHSIDE, controller.TLE_HB1);
  motor1.connect(motor1.LOWSIDE, controller.TLE_HB2);

  motor1.setPwm(motor1.HIGHSIDE, controller.TLE_PWM1);
 
  motor1.setPwmFreq(motor1.HIGHSIDE, controller.TLE_FREQ200HZ);


  motor2.connect(motor2.HIGHSIDE, controller.TLE_HB3);
  motor2.connect(motor2.LOWSIDE, controller.TLE_HB4);

  motor2.setPwm(motor2.HIGHSIDE, controller.TLE_PWM2);

  motor2.setPwmFreq(motor2.HIGHSIDE, controller.TLE_FREQ200HZ);

  
  motor3.connect(motor3.HIGHSIDE, controller.TLE_HB5);
  motor3.connect(motor3.LOWSIDE, controller.TLE_HB6);

  motor3.setPwm(motor3.HIGHSIDE, controller.TLE_PWM3);

  motor3.setPwmFreq(motor3.HIGHSIDE, controller.TLE_FREQ200HZ);

  motor1.begin();
motor2.begin();
motor3.begin();

Serial.begin(9600);

}

void loop()
{
  if (irrecv.decode(&results)) 
  {
    Serial.println(results.value, HEX);
    irrecv.resume(); 
//******************motor 1***********************************
          if (results.value == unu)
             {
                motor1.start(255);
                timestamp1 = millis();
             }
          if(millis() - timestamp1 > TIMEOUT)
             {
                motor1.start(0);
             }
//******************motor 2***********************************
          if (results.value == doi)
             {
               motor2.start(255);
               timestamp2 = millis();
             }
          if(millis() - timestamp2 > TIMEOUT)
             {
                motor2.start(0);
             }
//*****************motor 3************************************
          if (results.value == trei)
            {
              motor3.start(255);
              timestamp3 = millis();
            }   
          if(millis() - timestamp3 > TIMEOUT)
          {
            motor3.start(0);
          }
//****************toate motoarele*************************************
         if (results.value == cinci)
          {
            motor3.start(255);
            motor2.start(255);
            motor1.start(255);
            timestamp5 = millis();
          }
        if(millis() - timestamp5 > TIMEOUT)
        {
            motor3.start(0);
            motor2.start(0);
            motor1.start(0);
        }
  }
}

Pe viitor foloseste butonul "<>" din editor pentru a posta cod!

Editat de nico_2010
Link spre comentariu
Acum 1 oră, Tincu Ioan a spus:

daca am inteles eu bine de la cel care mi-a zis sa folosesc comanda asta, compara durata intre doua coduri consecutive trimise de telecomanda si TIMEOUT.

Nu, cu mai mic (<) nu face nimic. Egalul initial dadea valoarea millis() lui timestamp. < coompara timestamp cu millis() si atat. timestamp ramane nemodificat (0). De-aia, if-ul

if(millis() - timestamp > TIMEOUT){

nu mai functioneaza cum trebuie.

 

Link spre comentariu
Acum 11 ore, sebip a spus:

Eu nu am inteles foarte bine cand doriti sa porneasca un  motor si cand doriti sa se opreasca motorul respectiv.

Doriti sa functioneze doar cat timp este apasata tasta respectiva ? De exemplu apasa 1 porneste motor 1, cat timp tin apasata tasta 1 motorul sa functioneze continuu (cu factorul pwm fixat), cand nu mai tin apasata tasta 1 motorul 1 se opreste.

Pentru exemplu dat de mine (nu stiu exact ce date trimite telecomanda, dar preluand din programul dvs ) ar trebui ca in foarte scurt timp de la momentul incare nu mai apasati tasta 1 de exemplu, in 200ms sa se opreasca motorul 1.

Nu e cel mai optim cod dar e modificat la minim cel pus de dvs, asa puteti observa modificarile facute. Nu l-am testat neavand instalate librariileTLE. Daca tot apar intreruperi la motoare, puteti incerca sa cresteti valoarea TIMEOUT sa vedeti daca se rezolva. (am adaugat si initializarea portului serial care lipsea Serial.begin() )

 

#include <TLE94112.h>
#include <Tle94112Motor.h>
#include <IRremote.h>

#define unu 0x1
#define doi 0x2
#define trei 0x3
#define cinci 0x5

unsigned long timestamp1 = 0;
unsigned long timestamp2 = 0;
unsigned long timestamp3 = 0;
unsigned long timestamp5 = 0;
#define TIMEOUT   200

int RECV_PIN = 2;

Tle94112 controller = Tle94112();

Tle94112Motor motor1(controller);
Tle94112Motor motor2(controller);
Tle94112Motor motor3(controller);


IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{

   irrecv.enableIRIn();
  controller.begin();

  motor1.connect(motor1.HIGHSIDE, controller.TLE_HB1);
  motor1.connect(motor1.LOWSIDE, controller.TLE_HB2);

  motor1.setPwm(motor1.HIGHSIDE, controller.TLE_PWM1);
 
  motor1.setPwmFreq(motor1.HIGHSIDE, controller.TLE_FREQ200HZ);


  motor2.connect(motor2.HIGHSIDE, controller.TLE_HB3);
  motor2.connect(motor2.LOWSIDE, controller.TLE_HB4);

  motor2.setPwm(motor2.HIGHSIDE, controller.TLE_PWM2);

  motor2.setPwmFreq(motor2.HIGHSIDE, controller.TLE_FREQ200HZ);

  
  motor3.connect(motor3.HIGHSIDE, controller.TLE_HB5);
  motor3.connect(motor3.LOWSIDE, controller.TLE_HB6);

  motor3.setPwm(motor3.HIGHSIDE, controller.TLE_PWM3);

  motor3.setPwmFreq(motor3.HIGHSIDE, controller.TLE_FREQ200HZ);

  motor1.begin();
motor2.begin();
motor3.begin();

Serial.begin(9600);

}

void loop()
{
  if (irrecv.decode(&results)) 
  {
    Serial.println(results.value, HEX);
    irrecv.resume(); 
//******************motor 1***********************************
          if (results.value == unu)
             {
                motor1.start(255);
                timestamp1 = millis();
             }
          if(millis() - timestamp1 > TIMEOUT)
             {
                motor1.start(0);
             }
//******************motor 2***********************************
          if (results.value == doi)
             {
               motor2.start(255);
               timestamp2 = millis();
             }
          if(millis() - timestamp2 > TIMEOUT)
             {
                motor2.start(0);
             }
//*****************motor 3************************************
          if (results.value == trei)
            {
              motor3.start(255);
              timestamp3 = millis();
            }   
          if(millis() - timestamp3 > TIMEOUT)
          {
            motor3.start(0);
          }
//****************toate motoarele*************************************
         if (results.value == cinci)
          {
            motor3.start(255);
            motor2.start(255);
            motor1.start(255);
            timestamp5 = millis();
          }
        if(millis() - timestamp5 > TIMEOUT)
        {
            motor3.start(0);
            motor2.start(0);
            motor1.start(0);
        }
  }
}

multumesc, insa si acest cod functioneaza la fel, adica motoarele sunt alimentate tot cu impulsuri. da, vreau ca motoarele sa se opreasca imediat ce eliberez butonul.  am modificat TIMEOUT si nu s-a observat nicio diferenta in functionare.

 

Link spre comentariu

Vedeti pe teminalul serial ce cod va da la apasarea tastei1,2,3 si 5.

Comparatia tastei apasate din programul dvs presupunea ca la apasarea atstei 1 va fi valoarea "unu" ... ori nu cred ca aceasta este valoare.

results.value == unu

 

Trebuie sa gasiti codul tastei 1 la telecomanda dvs, altfel nu stim ce numar transmite telecomanda la apasarea tastei 1 (la fel si la celelalte taste).

Pe urma codurile respective ar trebui schimbate in locul unu, doi, trei si cinci 

Link spre comentariu
Acum 3 minute, sebip a spus:

Vedeti pe teminalul serial ce cod va da la apasarea tastei1,2,3 si 5.

Comparatia tastei apasate din programul dvs presupunea ca la apasarea atstei 1 va fi valoarea "unu" ... ori nu cred ca aceasta este valoare.

results.value == unu

 

Trebuie sa gasiti codul tastei 1 la telecomanda dvs, altfel nu stim ce numar transmite telecomanda la apasarea tastei 1 (la fel si la celelalte taste).

Pe urma codurile respective ar trebui schimbate in locul unu, doi, trei si cinci 

telecomanda chiar transmite 1 pentru butonul 1 samd. de fapt, transmite la o apsare 1, la a doua 2049,  si tot asa. iar cand mentin apasat butonul, transmite repetitiv 2049 sau unu, nu alterneaza aceste 2 valori.

Link spre comentariu
Acum 12 minute, sebip a spus:

Aveti o varianta imbunatatita da tot trebuie sa schimbati valorile tastelor, de exemplu in loc de 

results.value==1 cu results.value== 0xFF30CF  presupunand ca FF30CF este codul tastei 1 !

 

In programul atasat trebuie inlocuit doar unde este "results.value=="

motoare_si_ir2.ino 2 kB · 1 download

multumesc mult, dar in continuare functionarea este aceeasi.

Link spre comentariu
Acum 10 minute, Tincu Ioan a spus:

telecomanda chiar transmite 1 pentru butonul 1 samd. de fapt, transmite la o apsare 1, la a doua 2049,  si tot asa. iar cand mentin apasat butonul, transmite repetitiv 2049 sau unu, nu alterneaza aceste 2 valori.

nu stiu daca chiar transmite doua valori 1 sau 2049 ...nu are logica, doar daca libraria are probleme si nu furnizeaza codul corect si constant

 

inseamna ca la tasta 1 trimite codul 2049 .... results.value == 0x2049

similar si la tastele celelate: 2,3,5

 

la celelate taste ce numere furnizeaza ?  

oricum, daca furnizeaza cifra 1, in comparatii sa folositi cifra 1 nu "unu" !!!

"unu" este un sir de caractere pe cand cifra 1 este un numar , sunt interpretate total diferit

telecomanda ar trebui sa transmita un cod hexazecimal la apasarea fiecarei taste, cod din mai multe cifre

Puteti sa puneti o captura cu terminalul serial sa se vada codurile ?

Link spre comentariu
Acum 10 minute, sebip a spus:

nu stiu daca chiar transmite doua valori 1 sau 2049 ...nu are logica, doar daca libraria are probleme si nu furnizeaza codul corect si constant

 

inseamna ca la tasta 1 trimite codul 2049 .... results.value == 0x2049

similar si la tastele celelate: 2,3,5

 

la celelate taste ce numere furnizeaza ?  

oricum, daca furnizeaza cifra 1, in comparatii sa folositi cifra 1 nu "unu" !!!

"unu" este un sir de caractere pe cand cifra 1 este un numar , sunt interpretate total diferit

la o apasare 2, la urmatoarea 2050

la o apasare 3, la urmatoarea 2051 si tot asa.

am incercat toate permutarile cu unu si cu 2049 si cu 1.

nicio diferenta

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări