Fórum témák

» Több friss téma
Cikkek » Nyolc lábbal AVR II. rész
Nyolc lábbal AVR II. rész
Szerző: Topi, idő: Aug 26, 2008, Olvasva: 46006, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   4 / 5

Az RC szervóknál a pozíciót egy impulzus szélességgel tudjuk beállítani. Ez az impulzus 1ms-től 2ms-ig lehetséges. Ezen 1ms-es tartományban határozható meg a pozíció.

1ms = minimum
1,5ms = közép állás
2ms = maximum

A szervóknál van overdrive lehetőség, ez azt jelenti, hogy elvisel akár 2,5ms-os impulzust is, be is áll egy túlvezérelt pozícióba, ám ezt tartósan nem viselik el a szervók.

A programunk struktúrája nagyon egyszerű. Életre keltünk mégegy belső perifériát, az analóg-digitál átalakítót és ügyes kis delay-ekkel az analóg bemeneten lévő analóg feszültségből pulzus szélességet készítünk. Végleges áramkör:

 

A szervó csatlakozója az alábbi:

A videó megtekintéséhez Flash lejátszó szükséges!

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //-------------------------------------
  5. void m_delay_10ms(unsigned long val) {
  6. //-------------------------------------
  7.     while(val--) _delay_ms(10);
  8. }
  9.  
  10. uint16_t ReadADC(uint8_t channel) {
  11.  
  12.  
  13.     ADMUX = (ADMUX & 0b11110000) | channel;    //csat. kiválaszt
  14.     ADCSRA |= (1<<ADSC);    //start
  15.     while(ADCSRA & (1<<ADSC));//várok amíg átalakít
  16.     return (ADCL | (ADCH<<8));//adc kiolvasás
  17. }
  18.  
  19. //-------------------------------------
  20. int main(void) {
  21. //-------------------------------------
  22. uint16_t    adc;
  23.  
  24.     DDRB = (1<<PINB4); //PB4 kimenet
  25.  
  26.     //init ADC
  27.     DIDR0 = (1<<ADC1D);
  28.     ADMUX = (0<<REFS1)
  29.           | (0<<REFS0)    //Vcc mint referencia
  30.           | (0<<ADLAR);
  31.     ADCSRA = (1<<ADEN)    //adc enable
  32.            | (0<<ADPS2)
  33.            | (0<<ADPS1)
  34.            | (0<<ADPS0); //előosztó 128as
  35.     ADCSRB = 0x00;
  36.  
  37.     while(1) {
  38.         PORTB |= (1<<PINB4);
  39.         _delay_ms(1);
  40.         adc = ReadADC(1)>>1;
  41.         while(adc--) _delay_us(3.9); //1000/255
  42.         PORTB &= ~(1<<PINB4);
  43.  
  44.         _delay_ms(20);
  45.     }
  46.     return 0;
  47. }

DIDR0 ahhoz kell, hogy lekapcsolódjon a digitális port az analóg bemenetről, ADMUX a Multiplexert állítja, ADCSRA pedig az előosztást és egyéb indítási beállításokat.

Látható a kódban, hogy bekapcsolom a portot, majd várok fixen 1ms-ot. Azért mer 0-ás állásban így lesz a pulzus 1ms. Aztán egy ciklusban 3,9us-okat várok. 1000us = 1ms, továbbá 1000us/255 max ADC = 3,9us/adc egység.

Innentől már egyszerűen értelmezhető. Ehhez is kell adatlap olvasás. Sok!


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 5
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem