Motor vezérlése STM32 blue pill board-al, és tb6612fng motor vezérlővel

Sziasztok!

Egy motort szeretnék vezérelni, egy STM32 blue pill board-al, és furcsa dolgok történnek:

- Ha a PWM-et 255-re állítom, akkor úgy hallatszik, mint ha működne valami a motorban, de nem forog a kerék.
- Ha a PWM-et 100-ra, vagy 10-re állítom, akkor egy sípoló hangot ad a motor (két motorral is kipróbáltam, ugyanaz a jelenség, szerintem nem a motor a rossz)

Ha valaki tudja, hogyan kell ezeket használni, akkor szeretnék segítséget kérni, hogy mit ronthatok el? Elég sok mindent kipróbáltam, és tuti, hogy valami alap dolgot rontok el.

A következőt műveltem:

1. Ez a motor:

https://www.banggood.com/DC-6V-210RPM-Encoder-Motor-Set-DC-Gear-Motor-w…

2. Ez a motorvezérlő:

https://www.banggood.com/Dual-Motor-Driver-Module-1A-TB6612FNG-For-Ardu…

3. Ez a board:

https://wiki.stm32duino.com/index.php?title=Blue_Pill

4. A motorhoz külső 4s1p lipo aksi, ezzel 6V-ra konvertálva:
https://www.aliexpress.com/item/10pcs-lot-LM2596-DC-5V-12V-24V-Adjustab…

5. A board a PC USB portjáról kap áramot.

6. Az arduinó keretrendszert használom, a PlatformIO IDE-vel, genericSTM32F103C8 board-al.

7. A board-ot a következő módon kötöttem a motorvezérlőre:

    STM32 board <---> Motor vezérlő


PA6 <---> STBY
PB1 <---> AIN1
PB2 <---> AIN2
PA7 <---> PWMA
GND <---> GND
3.3V <---> VCC

    4S1P aksi step down voltage regulator-ral 6V-ra konvertálva <---> Motorvezérlő


OUT+ <---> VM
OUT- <---> GND

    Motor vezérlő <---> Motor


VCC (3.3V) <---> 3V3 Encoder
GND <---> GND Encoder
AO1 <---> M1 motor -
AO2 <---> M2 motor -

8. Ez a program:

#include

#define STAND_BY_PIN PA6
#define IN1_PIN PB1
#define IN2_PIN PB0
#define PWM_PIN PA7

void setup()
{

pinMode(IN1_PIN, OUTPUT);
pinMode(IN2_PIN, OUTPUT);
pinMode(PWM_PIN, PWM);
pinMode(STAND_BY_PIN, OUTPUT);

digitalWrite(STAND_BY_PIN, HIGH);
digitalWrite(IN1_PIN, HIGH);
digitalWrite(IN2_PIN, LOW);
analogWrite(PWM_PIN, 255);

void loop()
{
delay(1000);
}

Köszi szépen
Dávid

Hozzászólások

Elírtam, az STM32 board-ot, és a motor vezérlőt így kötöttem össze:

    STM32 board <---> Motor vezérlő


PA6 <---> STBY
PB0 <---> AIN1 (...és nem PB1 <---> AIN1)
PB1 <---> AIN2 (...és nem PB2 <---> AIN2)
PA7 <---> PWMA
GND <---> GND
3.3V <---> VCC

Mindenféle tudományosság nélkül: PB0 vagy PB2?

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ennek a TB729A-nak nem találom az adatlapját. Néhány kereskedőnél is néztem, ott sem. A kép csak illusztráció, vagy tényleg ez az IC típusa?

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Nem ertek az STM32-hoz. Nezd meg, hogy PWM nelkul (sima digitalWrite, esetleg fizikailag a board nelkul tapra kotve) mit csinal a motorvezerlo, forgatja-e a motort. Ha ezzel megy, akkor a PWM frekit probald meg atallitani. Ha sipol, akkor gondolom valami jopar (10-15?) kHz-es frekin probalja hajtani a motort, es ez lehet, hogy nem tetszik neki, tul gyors.
A motorvezerlod nem melegszik?

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Szörnyű gyanúm támadt. Szerintem ez a motor nem egy szimpla motor, hanem van benne elektronika, meghajtó, s tippem szerint kér fix tápfeszültséget, egyik lábán pwm-et, illetve van egy enkóder kimenete. Ha a tápját pwm-ezzük, szerencsétlen épp elindulna, majd összeesik, s így tovább. Tehát ez nem egy passzív DC motor lesz.

Szerk.: Úgy tűnik, mégsem. Viszont elég rosszul specifikált ez az izé.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A következő lábak vannak:

1. M1 motor -
2. GND Encoder
3. Encoder A phase
4. Encoder B phase
5. 3V3 Encoder +
6. M1 motor +

Most foglalkozok először ilyesmivel, de gondolom, hogy a 2, 3, 4, 5-ös láb azért kell, hogy egy elektronika visszajelzést tudjon adni, hogy mennyit fordult a motor. Ez az elektronika a 2-es és 5-ös lábon kap 3.3V-os, a 3-as és 4-es lábat szerintem egy interrupt lábra kellene kötni az STM32 board-on. De nem vagyok biztos benne, csak ezt gondolom.

Szerkesztve: És nem teljesen világos, hogy miért van kettő: Encoder A phase, és Encoder B phase.

Egyébként kezdd el debugolni! Közvetlenül táppal megkínálva a motort, megy? Mivel az álló motor gyakorlatilag rövidzár, nem lehet, hogy a DC/DC konverter áramkorlátja szólal meg, ami miatt nem tud elindulni ez a villamosgép?

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Akkor most a motorvezérlőn keresztül nézd meg, de a mikrokontroller nélkül. Kösd statikusan 3.3 V-ra, GND-re, amiket kell. Azaz szimulálj 100 % pwm kitöltést, az inputokkal a megfelelő üzemmódot, standby is úgy, hogy menjen. Meg persze kapjon 6 V-ot a végfok.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Sajna nem működik, úgy hogy mikrokontroller nélkül kötögetem be a motor vezérlőt (mindent portot a motorvezérlőn, ahogy a mikrokontrollerrel is menne PWM 255-el) :/ De még egyszer át fogom nézni, hogy mindent jó helyre kötöttem-e, és kipróbálom a PWMB-vel, és a B motorral is. Van még egy ilyen vezérlőm itthon, max azzal is kipróbálom.

Próbáld azt, hogy 0 %-os kitöltésről indulva mondjuk 2 másodperc alatt éred el a 100 % kitöltést. Tehát lágyan indítsd a motort, mert álló helyzetben lényegében rövidzár, s lehet, valaminek megszólal a túláram védelme.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ha nincs benne áramkorlát, így kinyírhatod a végfokot. Ha meg van, akkor csak szimplán nem fog elindulni. Ahhoz, hogy egységugrás szerinti fordulatszámmal járjon a forgórész, végtelen nagy szöggyorsulás kell, ehhez végtelen nagy nyomaték, s végtelen nagy áram tartozik egy ideális világban. Nyilván van a tekercsnek induktivitása és ellenállása is, ami valamelyest segít ezen. Ezért is mondtam, hogy próbáld folyamatosan emelni a feszültség középértékét az egyre nagyobb kitöltésű négyszögjellel.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE


#include

#define STAND_BY_PIN PA6
#define IN1_PIN PB1
#define IN2_PIN PB0
#define PWM_PIN PA7

int pwm = 0;

void setup()
{

pinMode(IN1_PIN, OUTPUT);
pinMode(IN2_PIN, OUTPUT);
pinMode(PWM_PIN, PWM);
pinMode(STAND_BY_PIN, OUTPUT);

digitalWrite(STAND_BY_PIN, HIGH);
digitalWrite(IN1_PIN, HIGH);
digitalWrite(IN2_PIN, LOW);
}

void loop()
{
analogWrite(PWM_PIN, pwm);
if (pwm < 255)
{
pwm++;
}
delay(10);
}

Nem indult a motor. Elkezd "sípolni" a motor, nem hangosan, kb mint amikor valakinek elkezd a füle csengeni, majd elhalkul, és utána csend.

Biztos, hogy nincs valami idétlen kontakthibád? Valamelyik GND-re vagy tápra gondolok.

Azt csinálnám, hogy miközben szépen emeled a kitöltést, nem a motor feszültségét, hanem a Vm tápfeszültséget mérném, hogy lássam, nem a kapcsolóüzemű táp kimenetén esik össze a feszültség.

Az elhalkulás érthető, hiszen 50 % kitöltés fölött az alsó „félperiódus” lesz egyre kisebb, 100 %-nál meg nyilván egyáltalán nem kell sípolnia.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Most az lenne jó, ha lenne oszcilloszkópod, meg kellene nézni, pontosan mi történik. Viszont gyanítom, hogy nincs. Amit tennék, az az, hogy valami kis áramú műterhelést hajtanék vele a motor helyett. Teszem azt, egy 100 Ω-os ellenállást. A multiméterek jellemzően integráló típusú mérést végeznek, így a pwm esetén középértéket fog mutatni. Meg lehetne nézni, műterheléssel a tápfeszültség kitöltési tényezőszerese lesz-e hozzávetőlegesen a kimeneti feszültség.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Köszi szépen a segítséget, amúgy. Közben találtam egy ilyen leírást is: https://learn.sparkfun.com/tutorials/tb6612fng-hookup-guide/all Szerintem ez alapján jól kötöttem be, és mivel közvetlenűl 6V-al megy a motor, szerintem rossz a motorvezérlőm. Kipróbálom a másikkal.

Ami még eszembe jutott... Van ebben under voltage detektálás. Ha a táp felőli impedanciád nagy, a nyákon lévő tantál kondenzátorban tárolt energia kevés lehet, így a tápfeszültség rövid összeomlása inicializálhatja a motor driver IC-t. Ekkor a rövid és vastag táp hozzávezetések, valamint a tápfeszültségre tett néhány száz µF kapacitás segíthetnek. Viszont a motorral párhuzamosan ne tégy kondenzátort! Ha kell a zavarvédelem, így a kondenzátor, akkor kell soros induktivitás is a pwm teljesítmény kimenet felől.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A szakadásokat végignéztem sokszor, és összedugdostam próbapanel nélkül is. Átforrasztgattam a motor vezérlő nyákján a lábaknál a tüskesort, hátha csak az volt a gond, hogy a kis kínaiak lefújták valami sprayvel a furatokat (is), és nem jól forrasztottam meg, de nem találtam végül ilyen jellegű problémát. Illetve csak a motor lábaknál találtam furcsaságokat, az AO1, AO2, BO2, BO2-nél.

Köszi szépen. A szűrő kondikat kipróbálom.

A PWM frekvenciában azért nem vagyok biztos, hogy az lehet a probléma, mert ha "teljes kitöltés" van, akkor az egy sima 1-es jel, teljesen mindegy a frekvencia, és akkor kellene teljes erővel mennie a motornak, nem?

De próbáltam állítani a HardwareTimer-el, illetve programozottan is próbáltam a PWM jelet kapcsolgatni a többféle frekvenciával, és semmi.

Jó, akkor ezt tegyük tisztába! A gond az, hogy a kondenzátoron ugrásszerű feszültségváltozás végtelen nagy áramot indít el: i = C*du/dt. Ennélfogva ez egy igen kellemetlen üzemállapot lesz a motort meghajtó MOSFET-eknek, a tápegységnek, EMC szempontból is borzalmas, sugározni fog.

Lehet a motorral párhuzamosan kondenzátort tenni, de akkor az egész kócerájjal sorba kell kötni induktivitást. Ezt nyilván méretezni kell.

Ha elhagyjuk a kondenzátorokat, akkor a motor tekercse egyben az induktivitás. Ugyanakkor most nem az a legnagyobb problémánk, hogy halkan sípol, hanem az, hogy alig van nyomatéka, nem forog. Most erre fókuszáljunk, a sípolás jelenleg másodlagos.

Az, hogy valamit leírnak egy fórumban, még nem jelenti automatikusan azt, hogy az a valami egyben helyes is. Akkor sem jelenti ezt, ha fénykép is van róla, sőt akkor sem, ha működik. Más az, hogy valami jól működik, vagy úgy, hogy bármikor tönkremehet. Vagy csak a hatásfokát rontottuk el. (Ahogyan önmagában az, hogy valami összeesküvés-elmélet, semmit nem mond annak igazságtartalmáról. Lehet akár igaz is.)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Bizonyára igazad van, de nem kell leszólni a fórumokat. A linux is így indult, fórumbejegyzéssel (levlistán anno) és mi lett belőle. Arról nem is beszélve, hogy maga a gyártó helyezte el saját FAQ-jában, feltehetően nem ok nélkül. Aztán azt se feledd, ez hobby projekt, nem a NASA eszköze készül idegen bolygón való üzemelésre. Mi történik, ha nem jön be a kondenzátor? Elfüstöl egy motor, vezérlő, esetleg mikrovezérlő? Nagy kaland, néhány dollárért van másik és tanul belőle az ember. CSak egy ötlet volt, de még most is inkább a pwm frequenciára gondolnék, szerintem túl magas.

Nem szólom le, épp fórumra írogatok. :) Csak óvatosan jeleztem, hogy helytelen volt az a hozzászólás. Illetve lehet bizonyos körülmények mellett valami igaz, de sokszor elkopnak a peremfeltételek, amelyek nélkül már ostobaság az állítás.

PWM freki nem nagy, ha hallja. A középérték attól még ugyanannyi.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Én ezzel játszadozom jelenleg:

http://wiki.seeedstudio.com/Grove-I2C_Motor_Driver-TB6612FNG/

Kerestem alacsony feszültségű (2,8V)léptetőmotor vezérlést és ez volt az egyik találatom. Modellvasúttal kapcsolatban barkácsolgatom az alapokat, ugyanezzel a vezérlővel van szerelve, rendesen működik, bár dc motort nem kergettem még vele.

Szia!

Jelenleg én is enkóderes DC motorok vezérlésével foglalkozok (egyetemi feladat részeként) szintén Blue Pill board-dal, Arduino környezetben, viszont másfajta motorvezérlővel (L298N típusú, hasonló a vezérlése tiédhez, csak nincs rajta standby bemenet).
Amit vasárnap este írtál, hogy a motorvezérlő nem működik, az azóta már megoldódott?
Én a PB0 / PB1 kimenetekről veszem a motorvezérlő PWM jelét, a PWM frekvencia 550Hz alapesetben, a PA7-hez is ugyanaz a belső PWM modul tartozik, szóval ha a motorvezérlőd és a bekötése jó, akkor szerintem működnie kéne a kiírásban szereplő programmal is.

Szia!

Sajnos még nem oldódott meg. A szűrő kondenzátorok sem oldották meg, nem működik.

Ha kicserélem a motort egy ellenállásra, akkor 1,5V-ot mérek az ellenállásnál ha a PWM > 0, PWM==0-nál pedig 0V-ot.

Jelenleg semmi ötletem, eddig egy motorral próbálkoztam, lehet, hogy mindkettőnek rajta kell lenni, akkor fog működni?

Szia!

Az 1,5 V-ot az ellenálláson méred, vagy az ellenállás egyik lába és a GND között? Szerintem érdemes lenne megnézni azt, hogy a standby pin működik-e, vagyis PWM > 0 esetén ha a standby pin jelét LOW-ra viszed, akkor az ellenállásnál mért feszültség lemegy-e 0 V-ra ahogy várható lenne. A motorvezérlőnek 1 motorral is működnie kellene.

Off. Szerintem igy ne programozz. Standard periph lib ezt az ardunionot meg felejtsd el /off
------------------------
uint8_t *data; // tipussal megszorozzuk az adatot. wtf?

-1
Ha visszaolvasol, a motorvezerloje akkor sem hajtja a motort, ha teljesen kiiktatja a mikrokontrolleret. Ehhez nem sok koze van annak, hogy egy 16MHz-es 8 bites uC-t lecserelt egy 72MHz-es ARMra.

--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin

Köszi a tippet, meg fogom nézni a periph libet.

Programozásról igazából még nem volt itt szó, tudom, hogy több lehetőség is van, de itt a cél most az volt, hogy az STM32 lapka működik-e, a lehető leggyorsabban be legyen kapcsolva 3 pin, egy meg ki, és az egy PWM-es, hogy a motor vezérlőt kipróbáljam, legyen soros kommunikáció, meg az I2C-re valami egyszerű library, ezeket próbáltam.

Itt azt írják az stm32 - nek 16 bites a pwm-je. Esetleg 255 helyett a 65535?

Találtam a itthon két tárgyat, egy ULN2803A-t, és egy IRLZ44N mosfet tranzisztort (+ IN4001 dióda + ellenállás), amire azt gondoltam, hogy fogom tudni vele állítani PWM-el a motor sebességét, és szerettem volna már valami sikerélményt is:

Mindkettővel tökéletesen működik PWM-el a motor sebességállítás. (de gondolom ez nem ugyanaz, mint amit ez a kis motorvezérlő tudna)

Sajnos ezekkel nem tudok irányt váltani, illetve ez egy-egy rövid próba volt, ampereket, stb nem néztem...

A PWM szerintem működik az STM32-vel. (Az STM32 blue pill lapkáról egyébként 2-3 nap alatt nagyon jó lett a véleményem, amit próbáltam, az működik.)

Ezt a táblázatot néztem, hogy hogyan tudok frekvenciát állítani:

http://stm32duino.com/viewtopic.php?p=12493#p12493

Például:


...
HardwareTimer pwmtimer(3);

void setup()
{
pwmtimer.setPeriod(3600000);
pwmtimer.setPrescaleFactor(55);
pwmtimer.setOverflow(65455);
...
}
...

Sziasztok!

Hogy kell beírni a title-be, hogy [MEGOLDVA]? Megoldva!

Köszönöm szépen mindenkinek a segítséget.

Így nem működött:

A 6V-hoz tartozó GND-t, és a 3.3V-hoz tartozó GND-t én összekötöttem, és ezt kötöttem be a VCC melletti GND-re. A VCC-re kötöttem a 3.3V-ot, és a VM-re a 6V-ot. Gondoltam
ez elég is, de most, az utolsó utáni utáni próbálkozásra bekötöttem motorvezérlőn lévő mindhárom GND-t, és:

Így működik:

A probléma az volt, hogy nem elég a VCC melletti GND-t bekötni (vagy azzal valami gond van), hanem a PWMB1, vagy a BO1 melletti GND-t is be kell kötni.

Nem gondoltam, hogy egy modulon, IC-n belül több GND-t is be kell kötni, hogy működjön. Biztos le van valahol írva, és én voltam a töketlen, hogy ezt nem olvastam, de a belinkelt sparkfun-os oldalon sincs rajta a rajzon.

https://learn.sparkfun.com/tutorials/tb6612fng-hookup-guide/all

Lehet, hogy a VCC melletti GND-vel van gond, nincs rendesen a modulon belül bekötve. Hiába néztem a próbapanelen multiméterrel, mert a modulon belül lehet gond. (Ha ez hibának számít, és nem ismert dologról van szó.)

Viszont most egy életre el vagyok látva motorvezérlőkkel, mert ezeket ki akartam dobni, és rendeltem más fajtát. :)

Köszi még egyszer.