Skocz do zawartości

Pomocna odpowiedź

Ale poczytanie kodu w niczym nie przeszkodzi. BTW C, C++, Basic czy ZajefajnyNowyJęzyk to tylko otoczka - ważne jest to, sosię robi z rejestrami, timerami i innymi *ami

 

(edytowany)

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
(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
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

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 😛

  • 1 miesiąc później...

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

(edytowany)

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
(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
(edytowany)
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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...