Agstu.se Buggfix Plus
Aktuellt datum och tid: 22.19 2018-04-19

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 33 inlägg ]  Gå till sida 1, 2, 3  Nästa
Författare Meddelande
InläggPostat: 11.46 2017-12-28 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 137
Hej!

Jag skulle vilja veta hur jag med hjälp av signalen jag får (se foto) från min rotary encoder motor, kan styra den mer exakt.
Ser signalen korrekt ut? Vad bör jag tänka på etc? Vilken kod är bra? :humm:
Som det är just nu är allt upphakat till en Arduiono.

Motorn har egen strömförsörjning. Jag kan höja sänka hastighet, och reversera riktning, från några knappar kopplade via Arduinon.
Är alltså ute efter att Arduion läser signalerna från Encodern, och att jag på så vis kan styra motorn mer exakt.

En annan amatör jag var i kontakt med säger att det inte går utan viss elektronik mellan den här signalen och Arduinon?
Tack på förhand.

Mvh F


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 14.56 2017-12-28 
Användarvisningsbild

Blev medlem: 14.52 2005-01-10
Inlägg: 22666
Ort: Kristinehamn
Tja - det borde väl gå, själv med en Arduino... som ju bara är en trött gammal µC.

Oftast gör man så att man fångar tiden mellan pulserna (t.ex. förkant-till-förkant) och jämför med vad den "ska" vara för att sedan justera drivningen efter de mätningar. Upprepas snabbast möjligt helt enkelt.

Detta sätt ger konstant hastighet på långt men ger rimligt säkert en del variationer på kort sikt.


Upp
 Profil  
 
InläggPostat: 15.07 2017-12-28 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 137
OK! Tack

Här kommer lite mätresultat på den som jag gjorde nyss.

Om jag kopplar in Oscilloskopet mellan 1 och 4 och handrullar encodern
+0.9 Volt i lågt läge på sensorn
och
+2.12 Volt i högt läge på sensorn

Om jag kopplar in Oscilloskopet mellan 1 och 3 och handrullar encodern
-2 Volt
och
+2.1 Volt
Den stannar även ibland på +0.8 Volt och -0.8V

Vad tror ni om det?
Det borde väl räcka för att kunna låta Arduinon läsa av detta?
Resten är väl bara kod?

Jag skulle vilja ha så att den räknar i nummer med hjälp av encodern.
Så att den blir väldigt exakt. Finns även i viss kod att den korrigerar om den råkar åka något för långt t.ex.


Upp
 Profil  
 
InläggPostat: 15.31 2017-12-28 
Användarvisningsbild

Blev medlem: 09.27 2011-08-14
Inlägg: 977
"Problemet" är de fyra signalnivåerna som gör att det inte går att rakt av använda en digital input-pinne och koppla en interrupt till den. Digital input klarar bara att skilja på två nivåer hög och låg.

Det jag tror man kan göra är att använda en AD-pinne. Specifikt sätta den i "ADC free running mode" och höja AD-frekvensen på bekostnad av upplösningen som inte behöver vara jättebra för att skilja på de fyra nivåerna. Kring 38000 analoga samplingar per sekund verkar vara möjligt att uppnå. För mer info t ex https://chisight.wordpress.com/2016/03/ ... mega-328p/

Går det inte att få de två signalerna separerade? Isåfall skull ett färdigt encoder-bibliotek kunna användas t ex https://playground.arduino.cc/Main/RotaryEncoders (kallas för quadrature).


Upp
 Profil  
 
InläggPostat: 16.04 2017-12-28 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 138
Ort: Uppsala
Blev intresserad av detta, så här är vad jag grävt fram...
Bilaga:
600px-Quadrature_Diagram.svg.png

Bilaga:
dual_sensor_track_figure4.png

Det verkar vara en optisk pulsgivare (roterande och inkrementell). Det är två optiska sensorer som läser av strecken på skivan. Sensorerna är placerade så att de är 90 ur fas, om du räknar det som en fas att skivan roteras med ett streck (från början på ett streck, över till "vitt" och stopp precis innan nästa streck). Det du mätt up är således signalerna från dessa två optiska sensorer som är 90 grader ur fas. När pulsgivaren snurrar medurs anländer A först, följt av B och vice versa när den snurrar moturs. Det är bara när A och B ändras samtidigt från en mätning till en annan som en förändring har skett i riktningen. Se tabellen nedan.
Bilaga:
xtruth_table_figure6.png

Läs av dem genom interrupt eller polling. Som jag förstått det kan du få konstiga värden om du inte läser av tillräckligt ofta, vilket kan få det att se ut som att pulsgivaren rör sig i motsatt riktning.

Sedan kan det finnas en Z-signal också som anländer en gång per rotation på skivan, vilket kan användas som en fast referens.

Från Arduino-dokumentationen till analogRead(): "The Arduino board contains a 6 channel (8 channels on the Mini and Nano, 16 on the Mega), 10-bit analog to digital converter. This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023."

(Fina bilder från Wikipedia och revotics.com.)


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 16.29 2017-12-28 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 138
Ort: Uppsala
fosfor skrev:
Här kommer lite mätresultat på den som jag gjorde nyss.

Om jag kopplar in Oscilloskopet mellan 1 och 4 och handrullar encodern
+0.9 Volt i lågt läge på sensorn
och
+2.12 Volt i högt läge på sensorn

Om jag kopplar in Oscilloskopet mellan 1 och 3 och handrullar encodern
-2 Volt
och
+2.1 Volt
Den stannar även ibland på +0.8 Volt och -0.8V


Bilden du bifogade med mätningen, är det mellan 1 och 3? Gissade med tanke på mätningarna som du skrivit. Då verkar det ut som att signalerna A och B går på 3. Snurrar du i andra riktningen så borde signalen spegelvändas.

Vad är det då som är på 4? :humm: Går det bara mellan +0.9 och +2.12 mellan 1 och 4, hela varvet runt?


Upp
 Profil  
 
InläggPostat: 17.01 2017-12-28 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 137
Hej! KLset

Ja, det är till 1 och 3.
Precis, den bilden blir helt spegelvänd om motorn snurrar åt andra hållet.

Känns ju som att denna signal borde kunna användas som
1. Startar åt högra hållet
2. Kör konstant åt högra hållet.
3. Bromsar åt högra hållet.
4. Stoppar.

Och viceversa i reverserat tillstånd. Typ :humm:


Upp
 Profil  
 
InläggPostat: 18.33 2017-12-28 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 138
Ort: Uppsala
fosfor skrev:
Känns ju som att denna signal borde kunna användas som
1. Startar åt högra hållet
2. Kör konstant åt högra hållet.
3. Bromsar åt högra hållet.
4. Stoppar.

Och viceversa i reverserat tillstånd. Typ :humm:

Jag tror att B har högre spänning än A. Se bilden jag bifogat. Den svarta vågen är den sammanlagda (A + B) vilket är vad du uppmätt. Jag har delat upp den i A (grön) och B (röd). Nu är det bara att mäta och följa tabellen.
Bilaga:
signal.jpg

En kodsnutt nedan i Python eller pseudokod som jag ibland kallar det. Kolla i bilden med tabellen som jag postade tidigare. I den första kolumnen från vänster är fyra rader eller tillstånd. Jag kallar dessa fyra tillstånd för 1 till 4. normalize2state() är en funktion som normaliserar spänningen till ett av de fyra tillstånden.
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
  1. current_state = None
  2. while True:
  3.     voltage = analogRead()
  4.     next_state = normalize2state(voltage)  # normalize voltage to one of four states
  5.  
  6.     if current_state is None:
  7.         current_state = next_state
  8.  
  9.     if current_state == 1 and next_state == 2:
  10.         print("reverse")
  11.     elif current_state == 1 and next_state == 3:
  12.         print("forward")
  13.     elif current_state == 2 and next_state == 1:
  14.         print("forward")
  15.  
  16.     # and so on for the rest
  17.  
  18.     elif current_state == next_state:
  19.         print("stopped")

Jag hoppas att jag förstått det hela rätt. Kanske någon mer erfaren EF:are vill komma med en kommentar. Vad gäller spänningen är det nog bäst att kolla vad för spänning Arduinon klarar av på sina pinnar innan du kopplar.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 12.35 2017-12-29 
Användarvisningsbild

Blev medlem: 09.27 2011-08-14
Inlägg: 977
Erfarenhet av att leta efter arduino-bibliotek kanske jag har :)
Bra beskrivning, separering av signalerna och få rätt signalnivå för en Arduino är väl det som behövs.
Sedan skulle jag utnyttja ett färdigt bibliotek som https://www.pjrc.com/teensy/td_libs_Encoder.html
som har både beskrivning och kod-exempel.


Upp
 Profil  
 
InläggPostat: 09.24 2017-12-30 
Användarvisningsbild

Blev medlem: 16.36 2014-08-31
Inlägg: 138
Ort: Uppsala
hawkan: Det går ju att ta signalen som den är, eftersom man kan skilja på de fyra tillstånden med Arduinons analogRead(). Men om man inte kan köra räknaren - loopen i min exempelkod - snabbare än vad pulserna anländer då motorns hastighet är som störst kommer räknaren att missa pulser och det blir ju inte bra. Kan man göra det snabbt nog då? Från dokumentationen till analogRead(): "It takes about 100 microseconds (0.0001 s) to read an analog input, so the maximum reading rate is about 10,000 times a second." Om det räcker vet jag inte.

fosfor: A och B borde gå på olika trådar, inte samma. Något annat verkar orimligt. Är det inte en pinout som syns på nedre sidan? Ta fler bilder och lägg upp!


Upp
 Profil  
 
InläggPostat: 10.56 2018-01-02 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 137
Tack för alla svar!

KLset, jag är helt med på vad du tänker, tycker också det borde finnas två separata kanaler.
Men jag kan bara få den där trappstegssignalen från ett enda ställe, vilket är de pinnarna på det här fotot där krokodilklämmorna inte är inkopplade.

Där krokodilklämmorna Är inkopplade går det 3V och 30mA till själva sensorn. De andra två, röd och blå, är matning till motorn.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
InläggPostat: 10.59 2018-01-02 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 137
Jahapp... forumet roterade fotot automatiskt till fel vinkel. Fast det var rättroterat på datorn :roll:
Testar igen efter lite redigering.

Alltså, där krok-klämmorna inte är inkopplade. Dvs på 1 och 3, det är enda stället jag får min trappstegssignal på oscilloskopet. Som syns uppe i tråden på ett foto.
De andra 4 inkopplingar är matning till sensor/mottagare och motorn.


Logga in för att visa de filer som bifogats till detta inlägg.


Senast redigerad av fosfor 11.18 2018-01-02, redigerad totalt 2 gånger.

Upp
 Profil  
 
InläggPostat: 11.01 2018-01-02 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 137
Övrig info:

Motorn har suttit i en Canon bläckstråleskrivare.
Har googlat på all text och siffror jag kunnat hitta på motorn men ej lyckats hitta något datablad.


Upp
 Profil  
 
InläggPostat: 12.46 2018-01-02 
EF Sponsor
Användarvisningsbild

Blev medlem: 21.31 2005-12-15
Inlägg: 6101
Ort: Malmö
För få digitala signaler kan du titta på komparatorer...


Upp
 Profil  
 
InläggPostat: 14.09 2018-01-02 
Användarvisningsbild

Blev medlem: 05.43 2013-02-13
Inlägg: 137
Nu gjorde jag ett vilt test och tror mig ha hittat kanal 1 och 2 för sensorerna.


1 = Sannolikt Sensor 1
Kopplade in ett 4.7k ohms motstånd och mellan motståndet och sensorn så kan voltskillnad mätas.
Långsamt handrullat switchar den mellan 0,8 - 1,6V
Med motorn igång ligger den stadigt på 1.2V

2 = Matning till LED, kör 2V och 50mA
Mäts 2V stadigt hela tiden

3 = Sannolikt Sensor 2
Kopplade in ett 4.7k ohms motstånd och mellan motståndet och sensorn så kan voltskillnad mätas.
Långsamt handrullat switchar den mellan 0,14 - 2V
Med motorn igång ligger den stadigt på 1V

4 = GND

Jag tycker att jag här borde kunna mäta två olika fyrkantsvågar från dessa sensorer.
Som ju ska agera signaler in till Arduinon. Men hittils visas inget på Oscilloscopet?? :humm:
Ska testa vidare.


Logga in för att visa de filer som bifogats till detta inlägg.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 33 inlägg ]  Gå till sida 1, 2, 3  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 3 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
   
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010