Skocz do zawartości

Sterowanie PWM AVR


Krawi92

Pomocna odpowiedź

Chodzi o to ze servo wieksza wage przywiazuje do czasu stanu wysokiego...a w trybie pwm gdybys chcial uzyskac nie wiecej niz 2ms stan wysoki to i stan niski bedzie tyle mial bo tak dziala pwm...i juz automatycznie twoja czestotliwosc wynosi 1000ms/2ms...500Hz..choc jaka czestotliwosc mozesz osiagnac to juz zalezy od preskalera i rozdzielczosci bodajze

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Aaa kumam czyli okres musze miec powiedzmy 20ms.. i 1-2ms stanu wysokiego a różnice tego czyli 18-19ms to stan niski. Czyli fast pwm daje sygnal symetryczny, a ja bym potrzebował coś asymetrycznego... 

Ogólnie to na tym moim kodzie do LEDa podlaczylem SERVO i metoda prob i bledow dobralem wartosci OCRxx zeby uzyskac obrot lewo prawo...

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

int main (){
	DDRB |= 0b00000110; // Ustawienie portów wyjscia PB1 i PB2
// =INICJALIZACJA PWM= //
	TCCR1A |= (1<<WGM10)|(1<<COM1B1)|(1<<COM1A1); // tryb 8 bit i wlaczone 2 kanaly
	TCCR1B |= (1<<WGM12); // tryb 8bit fast PWM
	TCCR1B |= (1<<CS11); // prescaler 8

while(1) {

for (uint16_t i=50; i<=255; i++) {
	OCR1A = i;
	_delay_ms(5);
}
for (uint16_t i=255; i>=50; i--) {
	OCR1A = i;
	_delay_ms(5);
}
}
}

 

Edytowano przez Krawi92
  • Lubię! 1
Link do komentarza
Share on other sites

6 minut temu, Krawi92 napisał:

Aaa kumam czyli okres musze miec powiedzmy 20ms.. i 1-2ms stanu wysokiego a różnice tego czyli 18-19ms to stan niski.

Dokladnie tak...🙂 

7 minut temu, Krawi92 napisał:

Czyli fast pwm daje sygnal symetryczny

Akurat tutaj to sie moze rozpedzilem, pwm z poprawna faza dziala tak ze liczysz do gory i do dolu...wartosc OCRx decyduje o tym jakie bedzie wypelnienie...przy max wypelnieniu twoj pin bedzie mial stan wysoki a przy min. stan niski...warto znalezdz sobie jakas animacje i wszystko robi sie prostrze...😉

12 minut temu, Krawi92 napisał:

 a ja bym potrzebował coś asymetrycznego... 

W przypadku serw to tak...musi to tak dzialac jak napisales powyzej...tak jak wspomnialem serwo normalnie dziala i z 490Hz co wcale nie znaczy ze takie czestotliwosci sa dla niego zdrowe wiec zawsze warto dbac o to zeby dzialalo tak jak producent wymyslil...czyli w granicy 50Hz...

  • Pomogłeś! 1
Link do komentarza
Share on other sites

No spoko, na dziś chyba wiadomości mi wystarczy. Na razie chcę ogarnąć całkowite podstawy, jak wg uruchomić podstawowe rzeczy, trochę nauczyć się poruszać po nocie, ogarnąć podstawy ADC i UART. Po kursie arduino niby takie proste wszystko na gotowych funkcjach, a tu troche więcej dla mnie czarnej magii 😛

Link do komentarza
Share on other sites

Mam pytanie odnośnie trybu phase correct. Otóż w kilku programach zalezalo mi na zwiekszaniu i potem zmniejszaniu wypełnienia, robilem to w pętlach, ale czytalem, że tryb phase correct tak wlasnie dziala, ze zlicza od 0 w góre i potem w dół. W sumie idealnie by to pasowało, tylko chyba to nie działa tak jak mi się wydaje. Próbuje właśnie uruchomić taki tryb, ale przy inkrementowaniu OCR0A normalnie się przekręca jak przy fast pwm..

void servoInit() {
    DDRD |= (1<<PD5)|(1<<PD6)|(1<<PD3);
    DDRB |= 0xFF;
    TCCR0A |= (1<<WGM00)|(1<<WGM02); // phase correct PWM
    TCCR0A |= (1<<COM0A1);
    TCCR0B |= (1<<CS00); // prescaler

 }

void servoInit() {
	DDRD |= (1<<PD5)|(1<<PD6)|(1<<PD3);
	DDRB |= 0xFF;
	TCCR0A |= (1<<WGM00)|(1<<WGM02); // phase correct PWM
	TCCR0A |= (1<<COM0A1);
	TCCR0B |= (1<<CS00); // prescaler

 }
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "servo.h"
#include "motor.h"

int main () {
servoInit();
sei();
	while(1){
OCR0A ++;
_delay_ms(10);
	}
}

uC atm328p

Link do komentarza
Share on other sites

OCRx sie przekreci bo sam mu "kazesz"...OCRx przyjmuje poprostu wartosc z zakresu 0-255(8-bit) a to licznik TCNTx liczy do gory i nastepnie w dol...nie wiem czy o taka odpowiedz Ci chodzilo...

Wiec jezeli bys chcial zeby twoj pwm gonil do gory i spowrotem to sam musisz tak sterowac OCRx ze po dobiciu do 255 musisz zaczac odliczac...do 0

Edytowano przez farmaceuta
  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)

Aaa... Dobra muszę jeszcze raz się dobrze wczytać w kilka artykułów bo od początku chyba coś źle rozumiałem. Caly czas operowałem na OCRx

To zapytam jeszcze raz. Da się użyć tego trybu np do płynnego zwiększania i zmniejszania wypełnienia bez np petl? 

Edytowano przez Krawi92
Link do komentarza
Share on other sites

13 minut temu, Krawi92 napisał:

Caly czas operowałem na OCRx

I dobrze...bo generalnie TCNTx powinien sobie liczyc sam i tyle..choc oczywiscie mozesz go modyfikowac dowolnie...np. jesli dla tego trybu wpisal bys do TCNTx wartosc 128 (polowa) to twoj pwm przyspieszy dwukrotnie z tym ze co kazdy cykl trzeba dbac o wpisanie watrosci do TCNTx...jest tez ten drugi tryb...gdzie OCRA sluzy do ustalenia czestotliwosci a OCRB jest od wypelnienia(ale to inny temat)...w nocie sa te rysunki, one duzo wyjasniaja jak sie juz zalapie co tam nabazgrali na nich...

edit...co do tego co wyzej napisalem to z ciekawosci luknalem w note i wyglada na to ze TCNTx mozna zmieniac w trybach pwm tylko dla timera 16bit...no tak przynajmniej wynika z grafik...(trzeba sprawdzic kiedys)

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.