Ik probeer een elctro motor aan te sturen via de arduino.
Ik stuur hem aan met een externe spanningsbron en een tip 120 transistor, op zich kan ik via een schuifweerstand netjes het motortoerental regelen.
Maar als ik het ga nameten met een magneet en een hall-sensor dan kom ik totaal niet op een stabiel toerental, soms zit er wel 10-20% variatie in.
is dit arduino eigen of?
ik gebruik onderstaande code:
int vermogen=A0; // schuifweerstand
int uitgang=9; // pwm uitgang naar transistor
int reading;
volatile unsigned long rpm = 0;
volatile unsigned long deltarpm=0;
volatile unsigned long lastrpm=0;
unsigned long nu;
unsigned long deltanu;
unsigned long now;
unsigned long deltanow;
float meter=0.64; // mijn verhouding 0.64 omw is 1 meter
float snelheid=0;
void setup(){
pinMode(uitgang, OUTPUT);
attachInterrupt(1, rpm_fun, RISING); // puls teller op poort 3
Serial.begin(9600);
}
void loop(){
tempo();
reading=analogRead(vermogen)/4; // meet schuifweerstand en zet hem in tot 0-255
analogWrite(uitgang,reading); // stuurt transistor aan
// Serial.print("snelheid in km/h: ");
// Serial.println(rpm);
// nu=millis();
//if (nu-deltanu >=500){
Serial.print("snelheid: ");
Serial.print(snelheid); // print mijn berekende waarde of soms om te testen deltarpm
Serial.println (" km/h");
// deltanu=nu; }
}
void tempo(){
now=millis();
if (now-deltanow>=1200){ // tijd tussen 2 metingen
deltarpm=rpm-lastrpm; // berekening van het aantal pulsen in 1.2 sec
snelheid=deltarpm*meter; // formule die niet klopt
lastrpm=rpm; // reset van last rpm om detarpm uit te kunnen rekenen
deltanow=now; // reset tijd voor de 1.2 sec meting
}}
void rpm_fun()
{
rpm++; // elke keer als er een puls komt telt hij rpm op.
}
Soms helpt het als je de source wat becommentarieerd zodat een ander ook begrijpt wat je precies doet. Overigens 10-20% variatie bij een elektro motor zou best kunnen.
Wordt al beter:)
Maar kan nog veel netter: Bijgaand is een werkend voorbeeld van metingen met interrupts (hier komt een mooie puls trein binnen): http://accuracymeter.verelec.nl/d8/d47/_coil_accuracy___firmware_8ino.html
Documentatie genereer je met Doxygen(gratis).
Paar vragen:
vraag1: hoor de je motor terugvallen?
vraag2: werkt de hal sensor wel goed? (op de scope oid bekeken?)
ik gebruik hem om een ouderwetse kilometerteller aan te sturen, en die vraagt best wat vermogen. Maar de teller blijft stabiel, dus ik denk dat de motor ook stabiel is.
verder heb ik het nog geprobeerd met een reedsensor van een kilometerteller en met zo'n infrarood sensor die een witte lijn op een zwart oppervlak detetecteert. Alles gaf hetzelfde resultaat.
Volgens mij wekt de hall sensor goed. ik heb hem gecontroleerd via een analoge ingang en dan klopt hij dan telt hij alle pulsen. Ik heb geen scope.
Ik ga nu eerst eens kijken of ik een meting met een 2e arduino uit kan voeren om te bepalen dat het niet komt doordat ik te veel spanning wegtrek van het bord.
zojuist een 2e arduino gebruikt voor de rotatie te meten. Dit is veel nauwkeuriger!
ik heb nu nog een afwijking van 1. Ik gooi dit erop dat hij af en toe wel een puls meepakt en af en toe net mist.
hoe krijg ik het nu op 1 board? ik vind het een beetje onzinnig om 2 borden te gebruiken.
dan kan je dat uitsluiten. Gezien de meetresultaten had je het moeten horen
Nald:
ik gebruik hem om een ouderwetse kilometerteller aan te sturen, en die vraagt best wat vermogen. Maar de teller blijft stabiel, dus ik denk dat de motor ook stabiel is.
stuur je de motor aan met de voeding van de arduino dan? Daarnaast lijkt het me stug. Als de spanning veel te laag zou zijn, dan doet de arduino niets meer of hij reset.
Nald:
verder heb ik het nog geprobeerd met een reedsensor van een kilometerteller en met zo'n infrarood sensor die een witte lijn op een zwart oppervlak detetecteert. Alles gaf hetzelfde resultaat.
Volgens mij wekt de hall sensor goed. ik heb hem gecontroleerd via een analoge ingang en dan klopt hij dan telt hij alle pulsen. Ik heb geen scope.
het lijkt inderdaad in de software te zitten.
Nald:
Ik ga nu eerst eens kijken of ik een meting met een 2e arduino uit kan voeren om te bepalen dat het niet komt doordat ik te veel spanning wegtrek van het bord.
Ik kan me het niet voorstellen.
Wat een optie is om bijvoorbeeld de micros() functie te gebruiken. Die geeft de systeemklok tijd en werkt zonder interrupt invloed. Bij elke interrupt meet je de tijd en heb je het verschil in microseconden. De systeemklok loopt na opstarten en gaat weer door 0 na ongeveer 1 uur. Dus er komt een moment dat de nieuwe waarde groter is dan de vorige waarde. Die negeer je gewoon.
De waarde die ju nu hebt is tijd (delta) tussen 2 pulsen (omwenteling) in micro seconden.
Van daar uit kan je dan in de loop de berekening uitvoeren om tot km/uur te komen.
Dit kan je nog verder verfijnen door er een voortschrijdend gemiddelde van te maken. Maakt het allemaal wat smoother.
Nald:
zojuist een 2e arduino gebruikt voor de rotatie te meten. Dit is veel nauwkeuriger!
ik heb nu nog een afwijking van 1. Ik gooi dit erop dat hij af en toe wel een puls meepakt en af en toe net mist.
hoe krijg ik het nu op 1 board? ik vind het een beetje onzinnig om 2 borden te gebruiken.
Wat trekt spanning? de motor (eigen voedingslijn geven), hall sensor?
verder zit de hall sensor op de plus van de arduino en op de gedeelde massa van de externe bron en de arduino
tussen de pulsedraad en de voeding heb ik een weerstand zitten.
de schuifweerstand wordt gevoed door de 5 V en ook deze heeft een gedeelde massa. de uitgang zit direct op de arduino.
De externe spanningsbron is een 7,5V 1.5A adapter. De arduino zelf krijgt de motor niet rond.
De 7.5V zit direct op de motor, de massa wordt geschakeld met behulp van de transistor.
Een output pin kan iets van 30mA leveren. Ik kan me niet voorstellen dat die Tip120 dat trekt. Maar je zou het kunnen meten (spanningsval over die 2K2).
als ik de motor gewoon laat draaien op de spanningsbron en ik laat de transistor verder aangesloten.dan krijg ik een correcte meting.
Wanneer ik de min van de motor op de gedeelde min zet (dus arduino en spanningsbron) dan krijg ik verkeerde meetwaarden. Dus hier laat ik de transistor buiten de schakeling.
er zit iets tussen de 2 polen van de motor gesoldeerd (staat 2247 op) zou het hier aan kunnen liggen?
heel typisch... laat ik de motor de andere kant opdraaien dan krijg ik wel een correcte meting
maar die andere richting is voor mij precies der verkeerde richting.
EDIT: ik heb nu de capacitor? eruit geknipt en nu gaat hij zowel beide kanten een meetfout geven.
hij geeft eerst de normale juiste metingen, en zodra hij 10sec draait(welke kant ook op) gaat hij meetfouten geven. als ik vervolgens de andere pool ontlaadt met de massa, dan kan ik weer 10 sec de juiste meting ontvangen.
Die kondensator zou ik er weer gauw terug in doen. De oorzaak lijkt hem te liggen in de ruis en EMF veroorzaakt door de motor. Ik stel het volgende voor:
a) zet een diode parallel aan de motor (anode op de collector en kathode aan de +)
b) zet die condensator terug. Weet je trouwens zeker dat het een condensator is? (foto?) en geen diode?
De EMF wordt veroorzaakt op het moment dat de polariteit in de motor omwisselt (dus bij de koolborstels) er wordt dan een omgekeerde puls gegenereerd. De diode zorgt ervoor dat deze weer afgevoerd wordt.
Leuk artikeltje : http://ww1.microchip.com/downloads/en/appnotes/00905a.pdf