motor aansturen

Hallo,

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.

ik heb opmerkingen toegevoegd.

ik heb nu even de berekende deltarpm uit laten lezen per 200ms . hij draait op vol vermogen.

hieronder mijn meetwaardes

snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 20
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 14
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 19
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
snelheid: 23
[b]snelheid: 23[/b]
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 16
snelheid: 11
[b]snelheid: 11[/b]

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 hoor de motor niet terugvallen.

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.

Nald:
ik hoor de motor niet terugvallen.

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?

ik heb de motor zo aangesloten

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).

ik heb mijn voltmeter over de weerstand gezet. en op 200m A afgesteld en ik las 69,5 af.

Er vanuitgaande dat ik het goed gemeten heb trek ik 70mA?

Zet hem maar op iets van 1-10V en meet de volt erover heen. Door de lage weerstand van de stroom meting gaat je verhaal niet meer op.
I = U / R.

3,35 V met een 2.2k ohm

3.35/2200=0,0015A?

Edit: gemeten over de weerstand

da's beter....1.5mA.

Volgens mij ligt het aan de motor.

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.

Wat voor een motor heb je erop zitten? DC motor met koolborstels?

ja

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