Skocz do zawartości

Sprawdzenie schematu TCRT5000


Jagodziana

Pomocna odpowiedź

Czujnik 1 masa nie jest podłączona do emitera.

Zamiast rezystorów podciągających wygodniej byłoby użyć drabinki, ale tak też może być.

Odpuść sobie lepiej LM324M, i podłącz czujniki bezpośrednio do ADC w mikrokontrolerze 😉

Link do komentarza
Share on other sites

Gdzieś czytałem, że lepiej zastosować LM324N niż ADC w mikro kontrolerze. Po drugie to wszystko trzeba by było zaprogramować 😅 a tak mamy piękne zera i jedynki. Dla informacji używam ATmega 8 i programuje w C.

P.S poprosił bym o linka gdzie było by wytłumaczone wszystko na temat PWM w C.

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

P.S poprosił bym o linka gdzie było by wytłumaczone wszystko na temat PWM w C.

A może trochę własnej inicjatywy?

Było wielokrotnie omawiane, poczytaj pokaż co udało Ci się zrobić to dalej pomożemy.

Link do komentarza
Share on other sites

Treker przed napisaniem swojego postu przeczytałem google i nie mogę tego zrozumieć. Dlatego też prezentuje jak zawsze listę pytań 😅

1 Co to TCCR1A, TCCR1B, OCR1A i OCR1B?

2 załóżmy to (tego nie mogę wcale pojąć):

 _BV(COM1A1)|_BV(COM1B1)|_BV(COM1A0)|_BV(COM1B0)|_BV(WGM10);

Co to jest te BV i to coś w nawiasach?

3 Jak wybrać którym wyjściem chce sterować?

4 Jakie muszę "zdefiniować" funkcje preprocesora? (w każdym przykładzie jest inaczej)

5 Czy zastosowany kwarc jest ważny? (chyba tak ale wolę się upewnić)

Na razie to chyba wszystko.

Link do komentarza
Share on other sites

At.1 TCCR1A, TCCR1B, to rejestry które musisz wypełnić

OCR1A i OCR1B to oznaczenia wyjść sygnału pwm.

At.2 _BV(1) znaczy to samo co 1<<1 stosuje się to do ustawiania jednego bitu w inny stan.

At.3 odpowiedź w punkcie 1

At.4 Nie rozumie zbytnio chyba chodzi Ci o rejestry

To fajne źródło http://avr.elektroda.eu/?q=node/39

At.5 nie koniecznie trzeba stosować kwarc, ale jak już zastosowałeś musisz to uwzględnić w preskalu.

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

Odnośnie punktu czwartego to chodziło mi o te #define

A teraz do konkretów:

Jeżeli chce zrobić PWM 8 bitowe na nóżce PB1 to robię tak (wiem, że robię źle, możecie wrzucić na demotywatory nie obrażę się ;])

// Tu jakieś #define o których nie wiem i nie rozumiem
void main()
{
DDRB=0xFF;
sbi(DDRB,PB1);
TCCR1A=_BV(COM1A1)|_BV(COM1A0)|_BV(PWM10);

I co dalej? Jak ustawić co ile ma być nadawany sygnał? co zrobiłem źle? Co to jest _BV (lubie wiedzieć co pisze a nie jakieś voodoo programming 😅 )

Link do komentarza
Share on other sites

#include <avr/io.h>      //standartowe biblioteki
#include <util/delay.h> 
#include <avr/signal.h>


#define F_CPU 8000000L  //taktowanie procesora

#define PWM10 0         //zdefiniowane wartości dla pwm
#define PWM11 1

//program nie rozumie co znaczy PWM10 i PWM11 dlatego przypisuje to ręcznie

void pwm_init() //funkcja inicjująca pwm
{ 

 TCCR1A = _BV(COM1A0)|_BV(COM1A1)|_BV(COM1B1)|_BV(COM1B0)|_BV(PWM10)|_BV(PWM11);  // czasomierz 1 w trybie 10 bitowego PWM
 TCCR1B = _BV(CS11|CS10); 
}

void pwm_ctrl_a(uint16_t pwm) //funkcja wpisująca wartość pwm na OCR1A
{

 if(pwm > 1023)  // zabespieczenie przed daniem za dużego pwm
{
pwm = 1023;
}

 OCR1A=pwm;                // wpisz pwm do OCR1A

}


void pwm_ctrl_b(uint16_t pwm) //funkcja wpisująca wartość pwm na OCR1B
{


 if(pwm > 1023)  // zabespieczenie przed daniem za dużego pwm
{
pwm = 1023;
}

 OCR1B=(pwm);                // wpisz pwm do OCR1B

}

Oto napisane przeze mnie funkcje do regulacji prędkości w moim robocie.

Stosuje się je tak że najpierw (i tylko raz) wykonujesz funkcje "pwm_init()" która zapisuje rejestry i ustawia wszystkie potrzebne rzeczy. Dwie pozostałe funkcje służą do wpisywania wartości pwm na odpowiednim porcie dla atmegi8 OCR1A to PB1 a OCR1B to PB2. Mam nadzieje że to Ci pomoże.

P.S. Nie zapomnij zdeklarować portów jako wyjścia.

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

Wielkie dzięki Należy Ci się browar.

[ Dodano: 26 Lut 10 03:36 ]

#include <avr/io.h>
#include <stdlib.h>

#include "delay.h"	// plik zawierający funkcje ipozniające


#define F_CPU 8000000L  //taktowanie procesora

#define PWM10 0         //zdefiniowane wartości dla pwm
#define PWM11 1 



void PWM_init()
{

 TCCR1A = _BV(COM1A0)|_BV(COM1A1)|_BV(COM1B1)|_BV(COM1B0)|_BV(PWM10)|_BV(PWM11);  // czasomierz 1 w trybie 10 bitowego PWM
 TCCR1B = _BV(CS11|CS10);
}

void ustawieniePWM(uint16_t pwma,uint16_t pwmb) //funkcja wpisująca wartość pwm na OCR1A
{

 if(pwma > 1023)  // zabespieczenie przed daniem za dużego pwm
   {
   pwma = 1023;
   }

 OCR1A=pwma;    
  if(pwmb > 1023)  // zabespieczenie przed daniem za dużego pwm
   {
   pwmb = 1023;
   }

 OCR1B=pwmb;   
} 

int main()
{


delayms(100);    
DDRB=0xFF;
DDRC=0xFF;       
delayms(100);   


while(1) 
{
	PWM_init();
	ustawieniePWM(1000,1000);
	PORTB=0x00101011;
	delayms(100);
	ustawieniePWM(1000,300);
	PORTB=0x00101011;
	delayms(100);
}

Co robię źle ? Pod port b podłączyłem mostek, ostatni bit to pierwszy bit w mostku itd. Robot pracuje tak : lekko skręca (tylko jedna strona pracuje) i przerwa, i tak w kółko.

Link do komentarza
Share on other sites

Źle ustawiasz wartość portu b.

PORTB=0x00101011

0x00101011 to zapis hexagonalny równoznaczny z binarnym 100000001000000010001

jeżeli chcesz napisać liczbę binarne należy wpisać ją w ten sposób 0b00101011 dwa zera na początku liczby nie są potrzebne dlatego piszemy 0b101011.

Natomiast hexagonalnie wyglądało by to tak 0x2b.

I tak jak napisał kolega swierkdeck, PWM_init() używamy tylko raz;

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

Ja się uczę ogólnie C++ i to na kompy a nie na AVR'y. Według tego języka jak napiszę jakąś funkcję (tak to się nazywa w C++ , nie wiem jak w C) to aby ją wykonać w mainie muszę ją tam wykonać. Rozumiem, że w C jest inaczej 😅 . O to x zamiast b to moja głupota ;].

Link do komentarza
Share on other sites

Jest dokładnie tak jak piszesz, lecz ty wrzucasz ją nie tylko do int main ale i do pętli nieskączoności while(1), a zależy nam aby funkcja PWM_init() była wykonywana tylko raz czyli wrzucasz ją przed while(1)

Dam ci jeszcze rade jeżeli programujesz w C++ to używaj zamiast while(1) pętli for(;😉 łatwiej się przyzwyczaić.

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.