Teraz jest niedziela, 27 września 2026, 14:57

Strefa czasowa: UTC + 1




Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
 Tytuł: Serwo, C i AVR
PostNapisane: poniedziałek, 30 lipca 2012, 19:47 
Offline
modelarz
Avatar użytkownika

Dołączył(a): środa, 18 maja 2011, 19:00
Posty: 91
Wiek: 35
Lokalizacja: Warszawa
Witam,

Zauważyłem że na forum jest kilka osób które znając C stąd moja prośba.
Mówiąc najprościej chciałbym kogoś poprosić o napisanie kodu w C do obsługi serw przez atmege8 albo attiny13.
Konkretniej chodziłoby o to aby normalnie jedno serwo było w jakiejś pozycji x drugie natomiast poruszało się raz w prawo raz w lewo o pewien kat a po naciśnięciu przycisku żeby pierwsze serwo zmieniło kąt a drugie zatrzymało.
Domyślam się że potrzebne są przerwania do obsługi przycisku ale niestety ich jeszcze nie przyswoiłem sobie. Podobnie z timerami a te potrzebne są do wygenerowania sygnału PWM. Gdybym miał więcej czasu to sam bym się tego powoli nauczył ale niestety czas goni.
Dlatego bardzo prosiłbym o pomoc. Byłbym również bardzo wdzięczny za krótki opis.
Zacząłem naukę C ale niestety utknąłem właśnie na przerwaniach.
Nawet myślałem o tym że jak nie uda mi się napisać programu to zrobię to "manualnie" i zbuduję tester serw który zamiast potencjometru miałby rezystory i przełączałbym się pomiędzy nimi przy użyciu jakiegoś AVRa żeby móc w pełni kontrolować czas przez jaki serwo pozostaje w danej pozycji. Ale do tego potrzebowałbym 2 takich sterowników a przecież to samo potrafi taki uC.

Pozdrawiam


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Serwo, C i AVR
PostNapisane: wtorek, 31 lipca 2012, 09:19 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 6480
Wiek: 48
Lokalizacja: Kraków
A próbowałeś tam coś znaleźć? Sorki za przekierowanie na inne forum ale myślę, że uC, przerwania, kompilatory itd tam będą bardziej pasowały. A tu pokaż, to co powstanie :)

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Serwo, C i AVR
PostNapisane: czwartek, 2 sierpnia 2012, 19:42 
Offline
modelarz
Avatar użytkownika

Dołączył(a): środa, 18 maja 2011, 19:00
Posty: 91
Wiek: 35
Lokalizacja: Warszawa
program działa ale serwo niestety jest za szybie, próbowałem pomiędzy skrajnymi stanami dorzucić kilka (co 0,1ms) a pomiędzy dać opóźnienie ale zamiast spowolnić ruch uzyskałem "skakanie"...
jest na to jakiś sposób? może większa częstotliwość? domyślam się że można do tego wykorzystać timer ale ja nie potrafię i wątpię że do soboty zdołam się nauczyć napisać program ;)


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Serwo, C i AVR
PostNapisane: sobota, 4 sierpnia 2012, 13:52 
Offline
Moderator
Avatar użytkownika

Dołączył(a): czwartek, 12 kwietnia 2012, 10:46
Posty: 6480
Wiek: 48
Lokalizacja: Kraków
A tak: http://www.elektroda.pl/rtvforum/topic2351217.html ???

_________________
pozdrawiam
Hubert
https://www.banggood.com/?p=WQ230911983820130156


Góra
 Zobacz profil Wyślij e-mail  
 
 Tytuł: Re: Serwo, C i AVR
PostNapisane: sobota, 4 sierpnia 2012, 15:17 
Offline
modelarz
Avatar użytkownika

Dołączył(a): środa, 18 maja 2011, 19:00
Posty: 91
Wiek: 35
Lokalizacja: Warszawa
właśnie tak mam zrobione. na serwo drży ale pod obciążeniem jest ok, wydaje mi się że nie będę już z tym kombinował. Dogrzebałem się że da się to zrobić na przerwaniach ale czasu już nie ma ;) tak więc dzięki wielkie za pomoc.
wrzucę jeszcze fragment kodu, może komuś się rzyda...

Kod:

#include <avr/io.h>
#include <util/delay.h>

int main()
{
PORTD = 0xff;
DDRB |=(1<<PB1)|(1<<PB2);
TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<FOC1A)|(0<<FOC1B)|(1<<WGM11)|(0<<WGM10); //prescaler = 1
TCCR1B = (0<<ICNC1)|(0<<ICES1)|(1<<WGM12)|(1<<WGM13)|(0<<CS12)|(0<<CS11)|(1<<CS10);
ICR1 = 19999;
while(1)
{
unsigned int i;
   {
      for (i=1500;i<1700;i++)
         {
         OCR1A = i;
         _delay_us(200);
         }
      for (i=1700; i>1500; i--)
         {
         OCR1A = i;
         _delay_us(200);
         }
      for (i=1500;i>1270;i--)
         {
         OCR1A = i;
         _delay_us(200);
         }
      for (i=1270;i<1500;i++)
         {
         OCR1A = i;
         _delay_us(200);
         }
   }

}
}



podzieliłem cały ruch tak dziwnie żeby ruch rozpoczynał się i kończył w centrum.
Oczywiście inkrementacja powoduje ruch w jedną stronę a dekrementacja w drugą...
Wartość 1500 to centrum, w moim przypadku jest tak trochę dziwnie bo max w jedną stronę to 600 a w drugą 2400... trochę mnie zdziwiły te wartości...
Wychylenia nie są takie same dla obu kierunków, w jedną obraca się o drobinę mniej.

Pozdrawiam


Góra
 Zobacz profil Wyślij e-mail  
 
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  

139,616,019 Wyświetlone Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Przyjazne użytkownikom polskie wsparcie phpBB3 - phpBB3.PL