Skocz do zawartości

Sprawdzenie schematu TCRT5000


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 😉

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.

Gdzieś czytałem, że lepiej zastosować LM324N niż ADC w mikro kontrolerze.

To skończ korzystać z tego źródła informacji.

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.

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.

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

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 😅 )

#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

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.

Ź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

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 ;].

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ć.

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