logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega16] czujnik optyczny MOBOT-ps20

LuQe01 16 Sty 2010 18:57 1950 3
REKLAMA
  • #1 7545500
    LuQe01
    Poziom 2  
    Witam,
    piszę pierwszy raz więc proszę ograniczyć krytykę do minimum ;)

    - tworzę właśnie czujnik odległości na podstawie elementów dostarczonych przez firmę
    Wobit jest to nowy układ, " MOBOT - Ps20 " zbudowany jest z czujnika optycznego HSDL-9100 oraz przetwornika a/c APDS-9700 oba elementy firmy AVAGO.

    Program piszę już od jakiegoś czasu ale cały czas mam jakieś problemy, otóż mobot ma 5 wyjść gdzie :
    1- gnd
    2- Aout ( wyjście analogowe )
    3- Vcc
    4- Lon ( włączenie fotodiody )
    5- Dout (wyjście cyfrowe )

    Zdecydowałem się na podłączenie Atmegi16 pod wyjście analogowe ( edit: "cyfrowe " ) ze względu na to że mam już gotowy program do obsługi A/C, niestety program ten pisałem pod czujnik siły ff100 gdzie spradza się w 100 % po przeróbkach niestety na optyczny już nie działa pomimo nadania Ledon stałej logicznej "1" .

    
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <avr/delay.h>
    
    
    
    unsigned int pomiar;		// Zmienna do przechowywania wyniku pomiaru
    unsigned char i;			// Ilośc pomiarów 
    unsigned int wynik;			// Zmienna do liczenia średniej z wyników pomiaru
    
    
    
    void Inicjalizacja(void)
    {
    	DDRA=0x00;		// Port jako wejścia
    	PORTA=0x00;		// Port C wejścia bez podciągania
    	
    	DDRD=0xFF;		// Port jako wyjścia 
    	PORTD=0xFF;		// Wyjścia w stanie wysokim
    	
    	DDRB= 0xFF;
    	PORTB= 0x00;
    				// Wybranie wewnętrznego żródła napięcia odniesienia	
    	ADMUX |= _BV(REFS1);		
    	ADMUX |= _BV(REFS1);
    				//	Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
    	ADMUX |= _BV(ADLAR);		
    				// Zezwolenie na konwersję	
    	ADCSRA |= _BV(ADEN);		
    				// Wybranie częstotliwości dla taktowania przetwornika  (1/8 częstotliwosci zegara kontrolera) 
    	ADCSRA |= _BV(ADPS0);	 
    	ADCSRA |= _BV(ADPS1);	
    }
    
    
    int main(void)
    {
    	Inicjalizacja(); 								 // Inicjalizacja kontrolera
    	
    		
    		
    		
    		while (1)
    		
    		{ 
    			wynik=0;
    			i=9;
    			
    			while(i)
    			{	
    				ADCSRA |= _BV(ADSC);        				 // Rozpoczęcie przetwarzania
    				while(bit_is_set(ADCSRA,ADSC))				 // Oczekiwanie na zakończenie przetwarzania
    				{};	
    				pomiar=ADCH;			  		         // Zapisanie starszych 8 bitów wyniku konwersji do
    										  	 // zmiennej "pomiar"
    				wynik=wynik+pomiar;					 // Sumowanie wyników pomiarów dokonywanych w serii
    				i--;
    											 // wprowadzić wartość opóźnienia ok 500ms. 
    			}
    			wynik=wynik/9;							 // Wyliczenie średniej 
    			PORTD=~wynik;						 // Wyświetlenie średniej z wyników pomiarów
    			
    			_delay_us(10);
    			
    		}
    	
    	
    }
    
    


    kod jest zlepkiem materiałów z kilku stron które znalazłem ale mimo to nie rozumiem czemu diody " wariują " zamiast podać właściwą wartość w hex-ie, nie wiem czy czasem nie ma to związku z częstotliwością oraz opóźnieniami ? wszelka pomoc bardzo mile widziana !
  • REKLAMA
  • REKLAMA
  • #3 7547242
    LuQe01
    Poziom 2  
    faktycznie mała pomyłka układ jest w 100 podłączony pod wyjście analogowe :)

    problem już udało mi się rozwiązać mój błąd polegał na puszczeniu stałej logicznej "1" na wejściu Led zamiast tego należało wprowadzić sygnał pulsacyjny co 100 us i długości ok 20 us układ działa już poprawnie jeżeli będzie ktoś miał jakieś pytania chętnie odpowiem :)

    - dzięki za zainteresowanie :)
  • #4 9212802
    konrad_321
    Poziom 10  
    Jakie dobrałeś nastawy PWM??
REKLAMA