MikroBasic en Servomotor

Bavelt

Golden Member

Vast weer zo'n 'er-overheen-kijker'.

Waarom werkt dit niet:
(bedoeling switchen van minumpum positie naar medium en 1 seconde vasthouden)

pic basic code:



   Duty = MINPWM
   Pwm3_Set_Duty(Duty)
   Delay_ms(1000)

   Duty = MEDPWM
   Pwm3_Set_Duty(Duty)
   Delay_ms(1000)

Maar dit wel:

pic basic code:

For Cnt = MINPWM To MEDPWM Step 400
      Duty = Cnt
      Pwm3_Set_Duty(Duty)
      Delay_ms(50)
 Next Cnt
      Delay_ms(1000)

Hier zit een loop in die met tussenstapjes.

Wat doe ik fout?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Zou moeten werken. (tenminste, als die seconde genoeg tijd is om de positie te bereiken, de draaitijd gaat van die seconde af)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik had al met die tjd lopen spelen (bv naar 2000 mS),
Maar het vreemde is dat het motortje niet reageert. Op de scoop kan ik zien dat de pulsen goed zijn qua frequentie en breedte.

Vreemd.

Ik bedacht misschien is er wel iets waarom die loop werkt: daar wordt steeds de Set_Duty opnieuw ingesteld.

Ik had er al een extra loop in gebouwd met een tellertje tot 255. Maar ook dat werkt niet.
terwijl die andere loops wel direct werken.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ook wanneer ik literals gebruik werkt het niet:

pic basic code:

While True

   Duty = 3300
   Pwm3_Set_Duty(Duty)
   Delay_ms(2000)

   Duty = 10500
   Pwm3_Set_Duty(Duty)
   Delay_ms(2000)

  Wend
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Dit werkt weer wel:

pic basic code:

For Cnt = 3300 to 10500  step 2000
     Duty = cnt
     Pwm3_Set_Duty(Duty)
     Delay_ms(50)
   Next Cnt
   Delay_ms(1000)

   For Cnt = 10500 to 3300 step -2000
     Duty = cnt
     Pwm3_Set_Duty(Duty)
     Delay_ms(50)
   Next Cnt
   Delay_ms(1000)

Wat ik alleen wel merk, is dat je het motortje wel terug moet laten gaan.

Laat ik de 2e loop weg (terugtellen) dan reageert het ding ook niet.

Terwijl ik zou verwachten dat

pic basic code:

While True
 For Cnt = 3300 to 10500  step 2000
     Duty = cnt
     Pwm3_Set_Duty(Duty)
     Delay_ms(50)
   Next Cnt
   Delay_ms(1000)
Wend

Genoeg zou moeten zijn. Nadat de loop klaar is, zou hij in principe weer opnieuw moeten beginnen met van 3300 naar 10500.

Maar is toch niet zo.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik raak het spoor bijster met dat ding.

Als ik de stap in de (werkende) loop te groot mmaak (1600 ipv 400), dan gaat het ook fout.

Hij beweegt wel, maar onregelmatig. Maak ik de stap nóg groter, dan doet hij het niet meer.

pic basic code:

 For Cnt = MINPWM to MEDPWM Step 1600
    LATA.4 = 1
      Duty = Cnt
      Pwm3_Set_Duty(Duty)
      Delay_ms(50)
    Next Cnt
    Delay_ms(500)
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik heb dat nog nooit geprobeerd met zulke idioot grote stappen... ;) (en ook nog nooit gezien...)
Ik kan me voorstellen dat step binnen de 256 moet blijven, dit soort enorme stappen zullen ze geen rekening mee hebben gehouden...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Die stappen (idd maf groot), deed ik om eens te kijken hoe het ding nu reageert.

En daar krijg ik de vinger niet achter. Het vreemde is dus dat al je langzaam in stapjes van de minimale naar de maximale waarde gaat, het ding dat ook doet en langzaam de posities inneemt.

Doe je dat in één keer (met een flinke delay daartussen), dan gebeurt er niks.
Ik kan dat niet verklaren.

Wellicht heeft het ook iets te maken met de startpositie van het ding.
Daarbij is het ook vreemd dat volgens de datasheet de waarden 0,5- 1 - 1,5 ms zouden moeten zijn zijn, maar dat is van deze SG-90 niet zo.
(gekocht in de reguliere handel).

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

0.5 ... 1.5mS bij servo's moet je met een korreltje zout nemen... ;)
(kan per type en merk verschillen en behoorlijk afwijken...)

Ik kan me voorstellen dat voor stepsize een byte variabele wordt gebruikt.
(logisch voor een 8 bitter, en dat rekent veel sneller: niemand zal voorzien hebben dat step zo groot zou kunnen worden)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Die step was voor de test (variabele cnt is een Longint).

Mijn kernprobleem bijft echter waarom ik niet de servo in een bepaalde positie krijg zonder dat in kleine stapjes te doen.

Ik begreep dat de pulsbreedte (bij een frequentie van 50Hz) gewoon bepaalt in welke stand het ding komt.

En dat blijkt niet zo te zijn (bij mij tenminste.. ;()

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Zijn de MIN en MAX waardes niet te klein/groot?
Ik heb geen idee wat servo's met te korte of te lange pulsen doen. (doen ze dan niks, of gaan ze naar hun MIN resp MAX posittie...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik heb deze waarden (uit jouw voorbeeld)

pic basic code:

Const MINPWM = 3300                'Min value puls (65536/20000) * uS min
      MAXPWM = 10500               'Max value puls (65536/20000) * uS max
      MEDPWM = (MAXPWM - MINPWM) / 2 + MINPWM  'Neutral position 

65536 is 16 bits, dat is de max pwm waarde, Bij een 20000uS (20mS) pwm period duurt iedere uS is dus 65536/20000 = 3.2768 pwm stapjes.
(1000uS is dus 3.2768 * 1000 = 3276 stapjes, voor het gemak afgerond op 3300)

3300 is dus ca 1ms, 10500 = 3,2 ms

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Die waardes had jij opgegeven... ;)
Ik weet bijv. niet wat er gebeurt als je een 3.2mS puls stuurt als het max 3.1mS is.

Gaat de servo dan toch naar max, of doet 'ie gewoon niks? (of varieert dat per merk/type)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Die waardes had ik inderdaad opgegeven. ;)
De pulsbreedte op de scope kloppen; dus de berekening is goed.

De minimale waarden en maximale waardes lijken ook goed, omdat wanneer je langzaam, in zoveel mogelijk stapjes, je van minimum naar maximum gaat, de servo daar ook keurig op reageert en de juiste posities inneemt.

Ga ik van minmiaal direct naar maximaal, dan staat het ding gewoon stil (ook geen trillinkje o.i.d).

Er moet dus iets anders zijn.

Fouten zijn het bewijs dat je het probeert..

Even voor de goede orde: Ik heb de openingspost gelezen en +/- 100 tussenliggende reacties niet voordat ik de laatste paar heb gelezen.

Maar ik zie hints dat jullie de servo 3ms pulsen proberen te sturen. Daar ben ik het niet mee eens: De SG90 is echt een servo bedoeld voor 1-2ms pulsen met een herhalingsfrequentie van 50Hz. Als ie dan niet helemaal tot in de uiterste standen wil, dan kan je nog 0.8 tot 2.2 proberen, maar 3 of zelfs 3.2 is echt te veel.

Dus ik kan me voorstellen dat als je van 1.0 naar 3.0 stapt ie denkt: dit geloof ik niet, dit is geen geldig signaal hier luister ik niet naar.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

Ik vond het ook erg 'out-of-specs', maar als dat echt gemeten is moet ik 't toch aannemen...
Nogmaals: ik weet niet wat servo's doen bij te lange/korte pulsen. (zijn daar afspraken voor of is de implementatie daarvan overgelaten aan de fabrikant?)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Dus ik kan me voorstellen dat als je van 1.0 naar 3.0 stapt ie denkt: dit geloof ik niet, dit is geen geldig signaal hier luister ik niet naar.

In onderstaande proef ga ik van 1 ms naar 1,5 ms.

Ook hier geen enkele beweging.

pic basic code:

Duty = 3300               '1,0 ms
   Pwm3_Set_Duty(Duty)
   Delay_ms(5000)
                             '1,5 ms
   Duty = 4950
   Pwm3_Set_Duty(Duty)
   Delay_ms(5000)

Pak ik dezelfde waardes, maar dan in stapjes:

pic basic code:

For Cnt = 3300 to 4950 step 50
     Duty = Cnt
     Pwm3_Set_Duty(Duty)
     Delay_ms(50)
   Next Cnt
   Delay_ms(1000)

Dan doet hij het wel.

Maar dat zou betekenen dat je de servo alleen langzaam van postitie kan laten veranderen. Lijkt me niet juist.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Is er geen datasheet van 't ding? (dat 'ie 360 graden kan draaien is al uiterst vreemd)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik heb exact dit ding.

Volgens deze specs zou hij maar 180 gr kunnen draaien en het bereik is 1- 2 ms (lineair, want 1,5 zit in het midden).

Die van mij reageert anders.

[Bericht gewijzigd door Bavelt op woensdag 12 augustus 2020 12:58:44 (78%)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Conclusie: servo deugt niet... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 12 augustus 2020 13:01:34 schreef Arco:
Conclusie: servo deugt niet... ;)

Je zou idd geneigd zijn dit vast te stellen.

Tja, ik kan natuurlijk naar de winkel gaan (ben ik ook eens buiten ;) ) en er nog eentje kopen. Toch heb ik ergens nog twijfels of het dan wel goed gaat...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik lees hier nog een interessant zinnetje van een andere leverancier van hetzelfde ding:

Let op: Deze servo wordt geleverd zonder eindpin (begin- en eindpositie wordt bepaald door potmeter).

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je hebt natuurlijk kans dat die precies hetzelfde doet ('broken by design'... ;) )
Wellicht dan beter een ander model uitzoeken. Of je zet alles op een klein printje en test het ter plaatse in de winkel uit...

Als die 360 graden 'by design' zijn, dan geeft dat natuurlijk ook aanvullende problemen bij aansturing (misschien werkt 't daarom niet)
Bijv: Als de servo in het 180-360 bereik staat en je wilt naar 0-180 bereik, hoe weet die servo dan welke kant op te draaien?

Wat voor puls stuur je nu uberhaupt om het verder als 180 graden te laten draaien?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Bijv: Als de servo in het 180-360 bereik staat en je wilt naar 0-180 bereik, hoe weet die servo dan welke kant op te draaien?

Wat voor puls stuur je nu uberhaupt om het verder als 180 graden te laten draaien?

Dat had mij ook al verbaasd. Soms dacht ik hé, waarom gaat hij nu ineens de andere kant op?

Het ronddraaien gebeurde bij toeval. Eens kijken of ik dat kan reproduceren en met welke waarden.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik heb het ding maar eens lekker opgengeschroefd. Er zit idd een potmeter in!

Fouten zijn het bewijs dat je het probeert..