Toon posts:

Servo wil niet draaien

Pagina: 1
Acties:

Onderwerpen


  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Mede tweakers,

Ik probeer eigenlijk iets heel simpels te doen, en dat is een servo 1 kant op laten draaien. Helaas wil hij niet echt meewerken. Als ik mijn servo aansluit op het onderstaande schema, dan draait die een heel klein stukje, maar daarna hoor je hem ergens binnenin zachtjes tikken, en draait die niet. Het klinkt echt alsof die het er ergens heel erg moeilijk mee heeft.

Het schema:


Zoals je ziet gebruik ik een atTiny44 om het geheel aan te sturen, en daar draait de volgende code op:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
/*
 * main.c - Auto-generated by Anjuta's Makefile project wizard
 * 
 */

#ifndef F_CPU
#define F_CPU 1000000L
#endif

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>

#define SERVO_PWM_TOP 10000UL // 50 Hz PWM
#define SERVO_PWM_VALUE_STOP 750UL // Capture value to stop the servo (pulse width 1.5ms)
#define SERVO_PWM_VALUE_TURN 1000UL // Capture value to turn the servo (pulse width 2ms)

int main(void)
{
    // Setup ports and timers
    DDRA = 0xFF; // All output

    // Configure timer/counter1 as phase and frequency PWM mode
    TCNT1 = 0;
    TCCR1A = (1 << COM1A1);
    TCCR1B = (1 << WGM13) | (1 << CS10);
    ICR1 = SERVO_PWM_TOP;
    OCR1A = SERVO_PWM_VALUE_TURN;
    
    sei();

    while(1)
    {
    }
}


Het is echt heel weinig code, en volgens mij moet het kloppen, want bovenstaande code stelt alleen de hardware PWM van de AVR in op 'Frequency and Phase Correct mode'.

COM1A1 in TCCR1A wordt op 1 gezet, wat ervoor zorgt dat de OCA1 pin op 0V wordt gezet als er een 'Compare match' gebeurt tijdens het optellen, en wordt op 5V gezet als er een 'Compare match' gebeurt tijdens het aftellen.

In TCCR1B wordt WGM13 en CS10 gezet. Het eerste zorgt ervoor dat Frequency and Phase correct PWM wordt aangezet, met ICR1 als TOP waarde. ICR1 bepaalt nu dus eigenlijk de PWM frequentie. CS10 zorgt ervoor dat we de hardware clock zonder prescaler gebruiken om te tellen.

OCR1A wordt gebruikt voor de pulsbreedte. Hoe kom ik bij die getallen? Standaard gebruikt een AVR de interne 8MHz oscillator met een clockdivider van 8, dus resulterende clock is 1Mhz. Dat betekent 1000000 counts per seconde.

Op internet staat overal dat je 50 Hz als PWM frequentie moet gebruiken voor je servo, dus dat is een periode tijd van 1/50 = 0.02 s. Dat betekent dus na 20000 'counts' is er 20ms verstreken. In frequency and phase correct PWM telt de hardware van 0 tot TOP en dan weer terug tot 0, dus we delen dat getal door 2. ICR1 wordt dus 10000.

OCR1A bepaalt de pulsbreedte, en die pulsbreedte moet 2ms zijn om een bepaalde kant op te draaien. Dat betekent 2*10^(-3) * 1000000 = 2000 'counts'. Zoals eerder gezegd wordt tijdens het optellen de pin gereset als er een match optreed, en tijdens het aftellen wordt die weer gezet als er een match optreed. Dus ook hier moet je de waarde door 2 delen om de juiste pulsbreedte te krijgen (zie plaatje).



Als ik met mijn multimeter de spanning op de control pin meet, komt er ook mooi 0.5V uit. Dat is logisch want: 2 ms (pulsbreedte) / 20 ms (periodetijd) = 0.1. 0.1 * 5 (spanning uit de AVR) = 0.5V.

Wat gaat er dan fout? Is mijn schema niet goed? Is de servo kapot (wat ik raar zou vinden wat ik heb hem niet nieuw binnen)? Alvast bedankt.

  • TheBlasphemer
  • Registratie: september 2004
  • Laatst online: 03-12 16:12
Probeer je ATTiny eens direct aan de aanstuurpin van je servo te hangen, zonder die extra transistor.
Of heb je die transistor ertussen hangen met een specifieke reden ?

EDIT:
Nog eens gekeken, en ik snap echt niet wat je met die transistor probeert te bereiken.
Volgens mij laat je op deze manier het grootste deel van de tijd de signaal-pin van de servo gewoon floaten, lijkt me geen goed idee.
Aangezien je servo z'n stroom normaal van 5V haalt, en de signaalpin alleen als signaal gebruikt, zou je ATTiny dat makkelijk moeten kunnen trekken. Waarom dan uberhaupt die transistor daar?

[Voor 55% gewijzigd door TheBlasphemer op 15-09-2012 18:22]

[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]


  • kitao
  • Registratie: juli 2012
  • Laatst online: 27-05 15:15

  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
TheBlasphemer schreef op zaterdag 15 september 2012 @ 18:15:
Probeer je ATTiny eens direct aan de aanstuurpin van je servo te hangen, zonder die extra transistor.
Of heb je die transistor ertussen hangen met een specifieke reden ?

EDIT:
Nog eens gekeken, en ik snap echt niet wat je met die transistor probeert te bereiken.
Volgens mij laat je op deze manier het grootste deel van de tijd de signaal-pin van de servo gewoon floaten, lijkt me geen goed idee.
Aangezien je servo z'n stroom normaal van 5V haalt, en de signaalpin alleen als signaal gebruikt, zou je ATTiny dat makkelijk moeten kunnen trekken. Waarom dan uberhaupt die transistor daar?
Ik had het in eerste instantie inderdaad zonder transistor, maar toen deed die het ook niet (zelfde verschijnsel als in de OP), en op internet had ik ergens gelezen dat het in sommige gevallen het probleem oploste. Ook bij HEC (elektronicawinkeltje in Delft), zeiden dat het over het algemeen beter was.

  • Sissors
  • Registratie: mei 2005
  • Laatst online: 04-12 16:39
Omdat het een BJT is valt het floaten nog wat mee, maar het zorgt ook dan nog niet voor een beter signaal op die controle pin.

Heb je simpelweg al geprobeerd hem een pulse width van 1.2ms te geven ofzo? Als hij al op zijn uiterste staat.

  • Stoney3K
  • Registratie: september 2001
  • Laatst online: 21:18

Stoney3K

Flatsehats!

Toevallig toegang tot een scoop? Goed kans dat er ergens iets mis gaat in de berekening van je PWM-frequentie.

Verder niet vergeten op bij PORTA ook alle pins op 0 te zetten om de interne pull-up weerstanden uit te schakelen. Nu moeten die bij een output normaal alleen niet zoveel uitmaken....

Misschien kun je ook eens proberen om je TIMSK goed te zetten. (Hint: Je Capture/Compare Match 1 Interrupt staat gemaskeerd.) :+

[Voor 9% gewijzigd door Stoney3K op 15-09-2012 19:37]

Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud


  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Puls van 1.2ms is eigenlijk hetzelfde, draait klein stukje de ene kant uit, dan weer een klein stukje terug naar de originele positie.

Ik heb helaas geen toegang tot een scoop hier, en TIMSK gebruik je toch alleen als je interrupts wil gebruiken? Die heb ik nu in principe niet nodig. PORTA zal ik even op 0 zetten aan het begin, doe ik nu niks mee (maarja default zou 0 moeten zijn).

  • Stoney3K
  • Registratie: september 2001
  • Laatst online: 21:18

Stoney3K

Flatsehats!

Sh4wn schreef op zaterdag 15 september 2012 @ 19:40:
Ik heb helaas geen toegang tot een scoop hier, en TIMSK gebruik je toch alleen als je interrupts wil gebruiken? Die heb ik nu in principe niet nodig.
Counter/Compare 1 draait toch echt via een (hardware) interrupt hoor. Als je die in je TIMSK register maskeert, wordt er geen afhandel-routine gedraaid en blijft OC1A gewoon zweven. Feitelijk draait je PWM dan wel, maar wordt ie niet aan de pin 'gekoppeld' zodat je die pin voor iets anders kan gebruiken.

Pas als je die interrupt un-masked wordt OC1A ook echt voor PWM gebruikt.

Wil je het trouwens met de multimeter kunnen testen, zet je duty-cycle dan maar eens op 50% en meet de _wissel_ spanning die er dan uit hoort te komen. Of frequentie, als de meter dat kan.

[Voor 12% gewijzigd door Stoney3K op 15-09-2012 19:45]

Zet het daar maar neer! -- It's time to party like it's 1984 -- Soundcloud


  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Wat bedoel je met unmasken? Ik heb in TIMSK1 nu de OCIE1A bit gezet, zodat er een interrupt nu optreedt, maar helaas geen verandering. In principe wordt het setten en clearen van die pin ook door de hardware geregeld (COM1A1 bit in TCCR1A).

Ik heb hier trouwens een linkje met praktisch dezelfde code gevonden, dus ik verdenk toch mijn servo op dit moment.
http://www.societyofrobot...um/index.php?topic=1827.0

  • SA007
  • Registratie: oktober 2002
  • Laatst online: 04-12 20:41

SA007

Moderator Tweaking
Mm, het lijkt er mij op dat je niet op 50Hz maar op 100Hz draait.

Je clock is 1Mhz, je prescaler staat op 1 (geen scaling) dus je timer loopt ook op 1Mhz.
Verder lijkt het erop of alles goed staat, dan zou je dus je SERVO_PWM_TOP naar 20000 moeten zetten.

Edit: je andere defines zijn ook een factor 2 te laag en zouden dan verdubbeld moeten worden.

[Voor 15% gewijzigd door SA007 op 15-09-2012 21:22]

Klok is stuk :(


  • Sissors
  • Registratie: mei 2005
  • Laatst online: 04-12 16:39
Zoals hij uitlegt gebruikt hij phase en frequency correct PWM, dan moet je volgens mij inderdaad alles een factor 2 'te laag' instellen om op de juiste waarden te komen.

  • Anthor
  • Registratie: juni 2002
  • Niet online
Je interrupt wil je juist niet gebruiken omdat je de ingebouwde pwm functie gebruikt.

Wat gebeurt er als je met een loopje de waarde van ocr1a (langzaam) op laat lopen?

En zet voor de zekerheid ook even een redelijke elco over de voeding van je servo, als je die vol aanstuurt gaat er even veel stroom lopen, wat een spanningsdipje kan veroorzaken.

  • Sissors
  • Registratie: mei 2005
  • Laatst online: 04-12 16:39
Daar heeft Anthor wel een punt, vaak is het een redelijk idee ze gewoon op twee compleet verschillende voedingen te laten draaien (uiteraard aardes doorverbonden). Maar sowieso wil je een elco eroverheen hebben staan.

  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Goed, ik heb op de faculteit even met een scoop gekeken, en opzich klopt het signaal wel redelijk, al gaat de spanning van de puls natuurlijk 0.6/0.7V naar beneden, door de transistor. Die heb ik er nu tussenuit gehaald, dus de spanning van de puls zou nu weer gewoon 5V moeten zijn.



Ook heb ik een nieuw servootje gehaald, maar helaas, hij doet het nog steeds niet. Ook met de nieuwe servo draait die eerst een klein stukje de ene kant op, en dan weer terug. En dan begint die een beetje te tikken alsof die het heel moeilijk heeft.

Het schema is op de volgende punten veranderd:
- Transistor en de 22k resistor is weg
- Er zit een 100uF elco tussen de 5V en de GND van de servo connector.

Kan zo'n 9V batterij het gewoon niet aan? Iemand anders nog ideeën?

[Voor 5% gewijzigd door Sh4wn op 22-09-2012 14:39]


  • jeroen3
  • Registratie: mei 2010
  • Laatst online: 22:51
Het kan wel met een (NPN) transistor, maar dan moet het zo.
En dan inverteer je het signaal, maar dat maakt niet uit, dat is in software zo goed gemaakt.
Vergeet geen weerstand voor de Basis (Vin)

  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Op de meeste internetfora zie ik ook geen transistor bij het control signaal, dus ik denk niet dat het nodig is.

  • jeroen3
  • Registratie: mei 2010
  • Laatst online: 22:51
Het hoeft ook niet. Maar als je chip op 3.3 Volt draait (5V is eigenlijk ouderwets) dan wil je dat wel.

Maar ik denk dat je timing niet goed genoeg zit. Servo's hebben namelijk maar een klein stukje in de hele puls waar ze reageren.

De falling edge ziet er trouwens erg traag uit, zit daar ook nog capaciteit op?

  • Sissors
  • Registratie: mei 2005
  • Laatst online: 04-12 16:39
Dat was nog met transistor ertussen, dan is falling edge traag, zonder transistor zou dat geen probleem moeten zijn.

Je voedingsspanning erbij meten kan nuttig zijn. Maar daarnaast zegt mijn spidersense (en paint icm pixels tellen) dat als jij 10ms per hokje hebt, je puls te breed is. Dat is boven de 2ms.

  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Ja klopt, de puls was iets langer, maar achteraf zag ik ook dat de waarde op 1150 stond ipv 1000, dus dat kan wel ongeveer kloppen.

Ik vind het steeds vager worden, heb de servo's nu een aparte voeding gegeven van 4x 1.5 AA oplaadbare batterijen, met de ground doorverbonden, en nog steeds wil die niet -.-"""

  • heggico
  • Registratie: augustus 2011
  • Laatst online: 23:30
Doet niet niet precies wat je wilt? Hij gaat nou naar de positie waar in in staat als je hem een 2ms puls geeft? Of begrijp ik het verkeerd?

Wat doet de servo als je hem eerst handmatig helemaal naar links draait en dan aansluit? Gaat hij dan weer terug naar dezelfde positie?

p.s. welke servo? Er zijn er soms bij die net een iets ander puls verwachten.

  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Ik heb de Futaba S3003, vrij standaard servo.

Hij doet niet precies wat ik wil inderdaad, ik wil dat die constant blijft draaien, maar alleen als ik de batterij van het geheel aansluit, dan beweegt die 1x, en voor de rest doet die niks meer.

Als ik hem handmatig helemaal naar links draai, dan gaat die bij de eerste puls volgens mij wel de juiste hoeveelheid graden draaien, maar daarna niet meer.

  • real_FireFly
  • Registratie: april 2003
  • Laatst online: 11-01-2020
Dat is precies wat een servo hoort te doen... Een servo draait niet continu. Als je dat wil moet je de servo bewerken, je moet de feedback potmeter vastzetten of hem vervangen voor 2 vaste weerstanden.

  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Oh fail, en ik maar denken dat je een servo ook als motor kon gebruiken, in een project op mijn studie deden we dat in ieder geval. Ik zal er eens naar kijken!

  • jeroen3
  • Registratie: mei 2010
  • Laatst online: 22:51
Je kan een servo wel naar wens aanpassen hoor, kwestie van open schroeven en de terugkoppeling onklaar maken.

Maar je kan beter een ding kopen die ervoor gemaakt is. Die zijn er ook, ik weet alleen de naam niet.
Ik dacht dat je die hetzelfde moest aansturen.

Lees hierbeneden

[Voor 4% gewijzigd door jeroen3 op 22-09-2012 20:56]


  • kitao
  • Registratie: juli 2012
  • Laatst online: 27-05 15:15
@Sh4wn
servo's die constant draaien zijn er ook.
http://www.parallax.com/S...roductID/102/Default.aspx
die worden bv gebruikt voor de wielen van een robotwagentje
ze heten continue rotatie servo's

[Voor 8% gewijzigd door kitao op 22-09-2012 20:57]


  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
God, dom dat ik daar niet aan heb gedacht. Ik heb wat chirurgische ingrepen gedaan op mijn servo, en ik kan u allen vertellen dat die nu prima ronddraait! Bedankt allemaal!

  • kitao
  • Registratie: juli 2012
  • Laatst online: 27-05 15:15
Sorry dat ik je er niet eerder op gewezen heb, in een ander topic heb ik dat wel eens naar voren gebracht, maar nu strijkt fire fly met 'de eer'. ;)
Ik las dat jouw servo maar 'een klein stukje draaide' , dat zal dan wel iets van 180 graden geweest zijn ?
Bovendien kon ik jouw code niet lezen want ik ken geen C

Een standaardservo gebruiken ze voor een stuur of een vleugelklep, anders zou ik ook niet weten waarom ze twee verschillende uitvoeringen maken.
Maar ik heb er ook wel iets van opgestoken, die blokkering kan er dus uit.
Mooi, ik heb er toch twee. :9

  • kitao
  • Registratie: juli 2012
  • Laatst online: 27-05 15:15
jeroen3 schreef op zaterdag 22 september 2012 @ 20:55:
Je kan een servo wel naar wens aanpassen hoor, kwestie van open schroeven en de terugkoppeling onklaar maken.
Net geprobeerd maar was geen succes.



Die foto is niet mn beste maar laat dus een servo zien die in 2 stukjes ligt en de witte cirkels moeten dus tandwielen voorstellen. Daar zat inderdaad een nok op die ik heb weggesneden met mesje waarna de tandwielen vrij rond konden draaien.
Helaas zit er in de andere helft in het aandrijfgedeelte ook ergens een blokkering want die draaide nog steeds geen 360 graden maar die kreeg ik niet open want ik heb geen kruiskop die klein genoeg is.
Boel maar weer in mekaar gezet en hoewel de servo nog wel werkt is die niet helemaal zuiver meer.
Dit is dan ook beter een klusje voor een horlogemaker volgens mij :-(

  • jeroen3
  • Registratie: mei 2010
  • Laatst online: 22:51
Je moet in de gearbox een nokje onklaar maken zodat hij fysiek rondjes kan draaien.
Daarnaast moet je in de aansturing een potmeter (of rotary encoder) onklaar maken.
De potmeter moet je waarschijnlijk trimmen in het midden met zuivere pwm op 50% van het servo stuursignaal.
Hoe je een rotary encoder onklaar maakt weet ik niet, geen ervaring met die servos.

[Voor 13% gewijzigd door jeroen3 op 04-10-2012 19:22]


  • kitao
  • Registratie: juli 2012
  • Laatst online: 27-05 15:15
Ok bedankt.
Erg handig als jou dit lukt maar ik kijk wel voor een kant en klare volle rotatie servo de volgende keer. ;)

  • Sh4wn
  • Registratie: december 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Topicstarter
Ik weet niet welk model jij hebt, maar ik heb deze tutorial gevolgd:
http://www.google.com/url...6sBh21MYcW3BIM7FRxzbJD2eg

Je moet inderdaad een mechanische stop eraf knippen/schuren/dremelen, en de potmeter binnenin vervangen door 2 weerstanden.

Overigens hoefde ik in de bovenstaande tutorial niks los the solderen voordat ik dat printplaatje eruit kon halen. Ik kon dat printplaatje er gewoon uitwippen (pas op voor de tandwielen, die zitten nu los). Daarna was het los solderen van de potmeter een stuk makkelijker.

  • kitao
  • Registratie: juli 2012
  • Laatst online: 27-05 15:15
Dit model heb ik.
Maar daar zitten 2 schroefjes in op het aandrijfgedeelte en die kleine maat schroevendraaier had/ heb ik niet, dus ik kon dat gedeelte waar de electronica zit niet openen.
Maar bedankt voor je link, zo gauw ik een setje precisie schroevendraaiers tegen kom dan probeer ik het gewoon opnieuw.
Het nokje van het tandwiel ligt er toch al af. :)

  • Rowwan
  • Registratie: november 2000
  • Nu online
Waarom wil je perce een servo gebruiken dan? Servo's zijn er standaard voor bedoeld om in een bepaalde positite te blijven staan (uit mijn hoofd: een puls varierend van 1-2 ms bepaald de positie; hierop zal hij blijven staan)
Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee