Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Attiny45] Servo met hardware PWM aansturen.

Pagina: 1
Acties:
  • 110 views sinds 30-01-2008
  • Reageer

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 20-11 21:12

SA007

Moderator Tweaking
Topicstarter
Ik heb een usb servo gemaakt op basis van AVR-USB
De attiny loopt op 16.5Mhz (interne osc + pll).

Nu heb ik de servo in software gebouwd (timer op ~69Hz, in de interrupt PORTB bitje aan, dan een _delay aanroepen, en dan het bitje weer uit).
Maar de interrupts van de USB zorgen ervoor dat de timing van de puls niet helemaal constant is, waardoor de servo een heel klein beetje blijft bewegen.

Nu wou ik de servo met de hardware pwm mogelijkheid aansturen, maar in alle voorbeelden die ik erover zie wordt er een 16 bit teller gebruikt, en die heeft de attiny45 helaas niet.

De attiny heeft 2 8-bit tellers die de pwm aansturen, maar als he dat hetzelfde zou gebruiken als de 16-bit tellers kom je bij het probleem dat je maximaal maar 13 stappen zou kunnen halen in het bereik van 1-2 millisecondes die je hebt om de servo aan te sturen.

Het idee is dat dat ongeveer elke 20ms (50Hz) een puls van 1-2ms gestuurd wordt waarvan je de pulsbreedte kan instellen.

Zijn er intressante mogelijkheden in de avr's waardoor dit wel kan? Gaat er vooral om dat de pulsbreedte constant is.

  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 29-10 06:07

Sprite_tm

Semi-Chinees

Moet de tijd tussen twee pulsen echt zo (relatief) lang zijn? Zonee, kan je gewoon vrolijk officieel PWMmen. Als wel kan je waarschijnlijk gewoon de timer als 'kookwekker' gebruiken. Zoiets dus:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int servo_waarde;

INT(timer_interrupt_vector) {
 static kort=0;
 if (kort) {
  //Korte wacht-dinges over: pwm-output laag, ga lang wachten
  stel_timer_in_zodattie_een_int_geeft_over(20ms);
  reset_timer();
  set_pwm_poortje(0);
  kort=0;
 } else {
  //Lange wachttijd over: pwm-output hoog, ga kort wachten
  stel_timer_in_zodattie_een_int_geeft_over(servo_waarde);
  reset_timer();
  set_pwm_poortje(1);
  kort=1;
 }
}


Enige bron van delay zou kunnen zijn dat tijdens de timer-interrupt de AVR net een USB-interrupt af aan het handelen is. Als je _delay_ms gebruikt, heb je dat effect echter veel vaker en cumulatief.

[ Voor 14% gewijzigd door Sprite_tm op 09-10-2007 16:16 ]

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog