Skocz do zawartości

[Bascom AVR] Program do obsługi turbiny LF


soban

Pomocna odpowiedź

I spodziewasz się, że malutki procesorek tiny26 ma te wszystkie porty, rejestry i bity?

Poza tym wypadałoby kod włożyć do jakiejś funkcji, main() chociażby. Na najwyższym poziomie spodziewane są jedynie deklaracje nowych obiektów: stałych, zmiennych, funkcji itp.

Link do komentarza
Share on other sites

No a jak się odnosisz do drugiego i trzeciego zdania? Rozumiesz je?

Soban, czy to na pewno ekran Twojego komputera? Po lewej stronie widzę projekty typu "system wielozadaniowy" i "serwer www" a w okienku edycji taka kicha..

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

soban, Dziwne jest to co Ty mówisz. Na ZDJĘCIU są widoczne tylko dwa wyprowadzenia, oba czarne. Dopiero silnik podany przez Ciebie w linku do HobbyKing ma 3 wyprowadzenia. Popraw to bo wprowadza w błąd.

Link do komentarza
Share on other sites

To są programy dołączone do książki o programowaniu. Usunąłem jeden z nich stąd nazwa Attiny... zmieniłem kod na ten z forum ustawiłem Atmegę32 no i...?

Teraz mój kod wygląda tak:


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

int main(void)
{
//Ustawienie wyjsc
   DDRB |= (1<<PB6) | (1<<PB5);
   DDRE |= (1<<PC4) | (1<<PC3);

   /**
   * Konfiguracja timerow 1 i 3:
   *   prescaler = 8
   *   tryb = Phase and Frequency Correct mode
   *   ustwienie wyjsc OC1A, OC1B, OC3A, OC3B
   */
   TCCR1A = (1<<COM1A1) | (1<<COM1B1);
   TCCR3A = (1<<COM3A1) | (1<<COM3B1);
   TCCR1B = (1<<WGM13) | (1<<CS11);
   TCCR3B = (1<<WGM33) | (1<<CS31);

//Wartosc TOP
   ICR1 = 20000;
   ICR3 = 20000;

}



Niestety konsola dalej pokazuje błędy:

**** Build of configuration Release for project tiny26_VA ****

make all

Building file: ../main.c

Invoking: AVR Compiler

avr-gcc -Wall -Os -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=11059200UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"

../main.c: In function 'main':

../main.c:8: error: 'DDRE' undeclared (first use in this function)

../main.c:8: error: (Each undeclared identifier is reported only once

../main.c:8: error: for each function it appears in.)

../main.c:17: error: 'TCCR3A' undeclared (first use in this function)

../main.c:17: error: 'COM3A1' undeclared (first use in this function)

../main.c:17: error: 'COM3B1' undeclared (first use in this function)

../main.c:19: error: 'TCCR3B' undeclared (first use in this function)

../main.c:19: error: 'WGM33' undeclared (first use in this function)

../main.c:19: error: 'CS31' undeclared (first use in this function)

../main.c:22: error: 'ICR3' undeclared (first use in this function)

make: *** [main.o] Error 1

Link do komentarza
Share on other sites

A Ty w ogóle widziałeś na oczy ATmegę32? Zauważyłeś gdzieś w niej PORTE, bo jakoś tak liczę na palcach i nóżek mi brakuje na piąty port.. To samo z pozostałymi zasobami o których przypomniał Ci kompilator. Że o czytaniu karty katalogowej nie wspomnę.

Czyli tak: chcesz gotowy kod konkretnie na ATMegę32, tak? Bez wnikania w to co robi, jak i dlaczego?

Link do komentarza
Share on other sites

Ok pozmieniałem trochę danych według twoich zastrzeżeń:

#include

#include

int main(void)

{

//Ustawienie wyjsc

DDRB |= (1<

DDRC |= (1<

/**

* Konfiguracja timerow 1 i 3:

* prescaler = 8

* tryb = Phase and Frequency Correct mode

* ustwienie wyjsc OC1A, OC1B, OC3A, OC3B

*/

TCCR1A = (1<

TCCR1B = (1<

while(1)

{

//Wartosc TOP

ICR1 = 20000;

}

Co dalej?

Link do komentarza
Share on other sites

Rozumiem, że program się kompiluje bezbłędnie? To teraz przepisz go prawie zupełnie od nowa wg poniższego:

Po kolei od ogółu do szczegółu:

- Do wysterowania regulatora potrzebujesz przebiegu PPM, którego specyfikację znasz.

- Do wygenerowanie tego przebiegu właśnie spróbowałeś użyć Timera 1. Blok tego timera ma wbudowany m.in. sprzętowy generator PWM. Najpierw musisz nam powiedzieć, jaki masz zegar procesora - od tego zależy całe taktowanie. Załóżmy, że jest to F_CPU wyrażone w [Hz].

- Sam licznik Timera 1 napędzany jest zegarem procesora podzielonym przez tzw. prescaler, ustawiany 3 bitami CS12-CS10 w rejestrze TCCR1B. Jeżeli ustawisz te bity np. na 010 to dostaniesz podział przez 8 - wszystko jest w tabelkach. Jeśli F_CPU=8MHz, to timer będzie nam liczył 8 razy wolniej, czyli 1MHz, czyli pojedyńcze mikrosekundy.

- Oprócz prescalera musisz też ustawić tryb pracy Timera. Jest ich dużo ale Ciebie interesują te z PWM w nazwie. Tutaj raczej będziesz musiał użyć takiego, w którym da się manipulować okresem przebiegu wyjściowego bo nie zawsze wartości domyślne dadzą ci wymarzone 20ms. Jak dla mnie wystarczy tryb 14. Tryb ustawiasz 4 bitami WGM rozrzuconymi niestety po rejestrach TCCR1A i TCCR1B.

- Okres tak ustawionego Timera 1 określasz liczbą wpisaną do rejestru ICR - to jest prawdą tylko dla kilku, ale nie wszystkich trybów! Jeśli chcesz mieć z Timera taktowanego 1MHz okres 20ms musisz go zmusić do zliczenia do 20000 - to wpisujesz do ICR, proste.

- Żeby timer mógł PPM generować, musi być też ustawiony na wyjście odpowiedni bit portu. Wyjścia Timera 1 to OC1A i OC1B "widoczne" odpowiednio na PD5 i PD4 - muszą być wyjściami.

- Teraz już tylko pozostaje pozwolić Timerowi na korzystanie z portów wyjściowych - to kolejne 4 bity COM1Ax i COM1Bx w rejestrze TCCR1A i mamy przebieg PWM. Tobie potrzebne jest ustawienie COM1A1=1 i COM1A0=0 - wtedy dostaniesz przebieg PWM na OC1A, którego wypełnienie będzie wprost proporcjonalne do...

- Acha, nie zapomnij o wpisaniu żądanego wypełnienia. Dla przebiegu na OC1A jest to rejestr OCR1A i odpowiednio dla OC1B jest OCR1B. Jeżeli chcesz mieć 1ms, to jest to 1000 "cyknięć" po 1us, czyli wpisujesz do OCR1A=1000.

Zbierz to wszystko do kupy, wymyśl stan obu rejestrów TCCR1x i podłącz regler do wybranego wyjścia OC1x.

Teraz manipulując wypełnieniem wpisywanym do OCR1A możesz zmieniać wysterowanie regulatora i tym samym obroty silnika. Jeżeli masz szczęście i Twój regler nie potrzebuje żadnej procedury kalibracyjnej (to niestety źle o nim świadczy), jesteś w domu.

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

- Żeby timer mógł PPM generować, musi być też ustawiony na wyjście odpowiedni bit portu. Wyjścia Timera 1 to OC1A i OC1B "widoczne" odpowiednio na PD5 i PD4 - muszą być wyjściami.
    DDRD |= (1<<PD4) | (1<<PD5);
- Teraz już tylko pozostaje pozwolić Timerowi na korzystanie z portów wyjściowych - to kolejne 4 bity COM1Ax i COM1Bx w rejestrze TCCR1A i mamy przebieg PWM. Tobie potrzebne jest ustawienie COM1A1=1 i COM1A0=0 - wtedy dostaniesz przebieg PWM na OC1A, którego wypełnienie będzie wprost proporcjonalne do...

- Acha, nie zapomnij o wpisaniu żądanego wypełnienia. Dla przebiegu na OC1A jest to rejestr OCR1A i odpowiednio dla OC1B jest OCR1B. Jeżeli chcesz mieć 1ms, to jest to 1000 "cyknięć" po 1us, czyli wpisujesz do OCR1A=1000.

   TCCR1A = (1<<COM1A1) | (1<<COM1B1);
   TCCR1B = (1<<WGM13) | (1<<CS11);
   while(1)
   		{
   //Wartosc TOP
   ICR1 = 20000;

}
}

Jest to bardzo przydatne ale nie rozumiem co dokładnie mam wpisać w tym TCCR1A i TCCR1B ponieważ te funkcje które mam oryginalnie kompletnie nic mi nie mówią : (. Potrzebuję jakiegoś przykładu zastosowania tego co powiedziałeś żeby to ogarnąć : (

Zmieniłem kod na taki patrząc na to co było w rejestrach Atmegi128 i zamieniając z tabelki Atmegi32:

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

int main(void)
{
//Ustawienie wyjsc
   DDRD |= (1<<PD4) | (1<<PD5);
   /**
   * Konfiguracja timerow 1 i 3:
   *   prescaler = 8
   *   tryb = Phase and Frequency Correct mode
   *   ustwienie wyjsc OC1A, OC1B, OC3A, OC3B
   */
   TCCR1A = (1<<COM1A1) | (1<<COM1B1);
   TCCR1B = (1<<WGM13) | (1<<CS11);
   while(1)
   		{
   //Wartosc TOP
   ICR1 = 20000;

}
}



Link do komentarza
Share on other sites

"nie rozumiem co dokładnie mam wpisać w tym TCCR1A i TCCR1B ponieważ te funkcje które mam oryginalnie kompletnie nic mi nie mówią"

Szkoda, wystarczyło, żebyś zajrzał do karty katalogowej tego procesora. Prędzej czy później będziesz musiał to zrobić. Inaczej co krok zaliczysz kolejne grabie albo ból korzystania z niezrozumiałych gotowców.

Proszę bardzo:

DDRD = 0x20;

TCCR1B = 0;

TCNT1 = 0;

ICR1 = 20000;

OCR1A = 1000;

TCCR1A = 0x82;

TCCR1B = 0x1A;

while(1)

{

OCR1A = 1000;

_delay_ms(1000);

OCR1A = 2000;

_delay_ms(1000);

}

Założyłem, że masz zegar 8MHz i regler podłączyłeś do OC1A (PD5). A teraz Ty mi napisz, co wpisy do użytych rejestrów oznaczają i jak to działa.

Link do komentarza
Share on other sites

Kod nie działa niestety : ( tak na wstępie

[ Dodano: 19-03-2012, 00:17 ]

A z tego co zdążyłem zobaczyć/przeczytać to:

OCR1A/B - Wartość określająca współczynnik wypełnienia

OC1A/B - wyjścia PWM

TCCR1A/B - Rejestr

_delay_ms() - Opóżnienie

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.