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

Program sterowania silnikiem krokowym i transportem szczelinowym - C w AVR

mwojcie3 13 Kwi 2011 13:23 5096 31
  • #1 9395394
    mwojcie3
    Poziom 10  
    Czesc

    Mam taki problem że mam silnik krokowy i transoptor szczelinowy. Chce uzyskać efekt taki że silnik sie obraca dopóki atmega nie otrzyma przerwania zawnętrznego od transoptora (opadające zbocze).





    Kod źródłowy

    #include<avr/io.h>
    #include<avr/interrupt.h>
    #include<util/delay.h>
    
    volatile unsigned char flaga=0; 
    void mryganie(void);
    void obrot_20_prawo(void);
    void obrot_20_lewo(void);
    void stop_motor(void);
    
    
    ISR (INT1_vect)
    {
    flaga=1;
    }
    
    ISR (BADISR_vect){} 
    
    int main(void)
    {
    
    DDRA |= 0x03;
    DDRD |= 0XF0;
    
    GICR |= (1 << INT1);
    MCUCR |= (1 << ISC11);
    
    
    sei();
    
    	for(;;)
    	{
    		obrot_20_prawo();
    		//mryganie();
    		if(flaga == 1)
    		{
    		PORTA = 0X01;
    		flaga=0;
    		stop_motor();
    		break;
    		}
    
    	}
    return 0;
    }
    
    void mryganie(void)
    {
    	PORTA ^= 0X02;
    	_delay_ms(100);
    }
    
    void obrot_20_prawo(void)
    {
    unsigned int i;
    
    
    	//portd  pd7 pd6 pd5 pd4
    	//       1a  1b  2a  2b  -półbajt sterowania silnkiem krokowym
    	//czarrny zielony czerwony niebieski
    	
        //porta pa1 pa0 -enable ssterownik silnika( wprzyszłości e1 zwarte z e3)
    	//      e1  e3
    		for (i=0; i<5; i++) //obrot o 5*4*1,8 = 36 stopni
    		{
    		PORTD = 0xa0;
    		_delay_ms(5);	
    		PORTD = 0x60;
    		_delay_ms(5);	
    		PORTD = 0x50;
    		_delay_ms(5);	
    		PORTD = 0x90;
    		_delay_ms(5);	
    		}
    
    }
    
    
    void obrot_20_lewo(void)
    {
    unsigned int i;
    
    	for (i=0; i<5; i++)
    		{
    		PORTD = 0x90;
    		_delay_ms(5);	
    		PORTD = 0x50;
    		_delay_ms(5);	
    		PORTD = 0x60;
    		_delay_ms(5);	
    		PORTD = 0xa0;
    		_delay_ms(5);	
    		}
    }
    
    
    void stop_motor(void)
    {
    	PORTD &= 0X00;
    }
    
    
    	


    problem jest taki że sinlik obraca się o ustalony kąt tylko
    - jakby mikrokontroler od razu otrzymywał przerwanie od transoptora.

    Zrobiłem identyczny program gdzie na porcie A mam mrygającą diodkę i przerwanie działa. Nie wiem zbytnio o co chodzi.

    Schemat układu:
  • #2 9395507
    asembler
    Poziom 32  
    Program ściśle związany ze schematem jak chyba wszystkie.
  • #3 9397201
    janbernat
    Poziom 38  
    No najpierw program wchodzi w main() i w pętlę for(;;).
    Od razu napotyka na polecenie wykonania 20 kroków.
    No to je wykonuje.
    Z powodu _delay() trwa to jakiś czas.
    POTEM dopiero sprawdza flagę.
    Po wykonaniu tych 20? kroków.
  • #4 9399067
    mwojcie3
    Poziom 10  
    Takie jest zamierzenie, ale po wykonaniu tych 20 kroków flaga powinna wynosić 0.
    A on widzi tą flagę w przypadku silnika jako 1, podczas gdy transoptor nie zmienia jeszcze stanu z 1 na 0 - nie ma przerwania.
  • #5 9399151
    dondu
    Moderator na urlopie...
    Sprawdziłem Twój program dość dokładnie. Wygląda na to, że powinien działać tak jak chciałeś.

    1. Dlatego przychodzi mi do głowy pytanie o filtrowanie zasilania procesora, ponieważ nie masz tego na schemacie. Czyżbyś nie miał?

    A jeżeli masz to dorysuj i załącz ponownie schemat.




    2. I jeszcze pytanie do programu:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W jakim celu przerywasz pętlę for i wykonujesz return 0 ?



    3. Rozumie, że w czasie wykonywania obrotu szczelina w transoptorze jest zakryta i dopiero po zakończeniu obrotu szczelina zostaje odkryta?
  • #6 9400501
    Konto nie istnieje
    Konto nie istnieje  
  • #8 9400621
    Konto nie istnieje
    Konto nie istnieje  
  • #10 9400648
    janbernat
    Poziom 38  
    A wogóle transoptor działa?
    Wystarczy wsuwać w szczelinę kawałek tektury i mierzyć napięcie na kolektorze tranzystora.
    I uważać na silne światło zewnętrzne- bo będzie stale włączony.
  • #12 9401213
    mwojcie3
    Poziom 10  
    Jeżeli chodzi o zasilanie to mma trafo z dwoma uzwojeniami wtórnymi 2x15V , +mostki prostownicze i kondensator.

    Z jednego uzwojenia mam +5V (7805 + kondensatory) do zasilania Atmegi, transoptora i części cyfrowej z drugiego uzwojenia +12V (7812 + kondensatory) do zasilania silnika krokowego.

    Raczej wątpię żeby to była wina zasilacza.


    Na kolektorze z odsłoniętą szczeliną jest 0,47V
    Na kolektorze z zasłoniętą szczeliną jest 4,84V
  • #14 9401241
    mwojcie3
    Poziom 10  
    Mam 100 nF

    Jeżeli chodzi o przerwanie pętli for to chciałem zrobić tak że silnik obraca się niewiadomą liczbę razy i jeżeli przyjdzie przerwanie to kończy się obracania silnika.

    To jest taki układ że silnik jest sprzężony ze stolikiem. Obracanie się silnika powoduje oddalanie lub zbliżanie się stolika. Przy stoliku zamontowany jest transoptor jako ogranicznik przesuwu stolika. Gdy stolik osiągnie krańcową pozycję odkryty zostaje transoptor (przerwanie). Na początku transoptor jest zasłonięty.

    Ale na razie chciałem zrobić luzem żeby się silnik zatrzymał gdy zostanie zgłoszone przerwanie.
  • #15 9401278
    asembler
    Poziom 32  
    Jezeli masz oddzielne zasialnia (uzwojenia) to czy połączyłes mase obu zasilaczy?
  • #17 9401299
    mwojcie3
    Poziom 10  
    połączone mam masy
  • #19 9401379
    mwojcie3
    Poziom 10  
    Tak w trakcie obracania szczelina jest zakryta. W trakcie obracania powoli zaczyna się odkrywać, aż całkiem sie odkryje.
  • #20 9401428
    janbernat
    Poziom 38  
    A spróbuj dać przed sei() opóźnienie ze 200ms.
  • #21 9401473
    dondu
    Moderator na urlopie...
    Zasilanie:
    Z opisu wygląda, że masz ok, choć schemat byłby lepszy do analizy.
    Nie wiemy także jak masz zrobioną PCB i tutaj mogą także być problemy.

    Program:
    Podmień main() na:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeżeli nie zadziała spróbujemy jeszcze inaczej.
  • #22 9401505
    mwojcie3
    Poziom 10  
    Nie pomogło. Dziwne, bo mikrokontroler zgłasza przerwanie zaraz po jednym wywołaniu funkcji obrot_20_lewo, mimo iż ja nie generuje przerwania przez transoptor. Sprawdzałem napięcie na kolektorze a ono się nie zmienia, całyu czas wynosi 0,47.

    Nic w weekend usiądę i coś może uda mi się rozwiązać problem.
  • #23 9401529
    dondu
    Moderator na urlopie...
    mwojcie3 napisał:
    Dziwne, bo mikrokontroler zgłasza przerwanie zaraz po jednym wywołaniu funkcji obrot_20_lewo, mimo iż ja nie generuje przerwania przez transoptor.

    I to sugeruje zakłócenia, które można wyłapać na przykład oscyloskopem, ale nie multimetrem.

    Możemy jeszcze zrobić inny kod - chcesz?
  • #24 9401548
    mwojcie3
    Poziom 10  
    Odłączyłem transoptor. I sprawdziłem pin INT1 i zaraz po wgraniu programu pojawia się na nim 1 a zaraz później zero. Możliwe żeby powstawało jakieś przebiecie??
  • #25 9401574
    dondu
    Moderator na urlopie...
    mwojcie3 napisał:
    Odłączyłem transoptor. I sprawdziłem pin INT1 i zaraz po wgraniu programu pojawia się na nim 1 a zaraz później zero. Możliwe żeby powstawało jakieś przebiecie??

    A rezystor R2 także odłączyłeś?
    Jeżeli tak to takie zachowanie jest jak najbardziej możliwe, bo to może być wynikiem resetu, itp.

    Jeżeli chcesz to mogę Ci pomóc o ile masz dzisiaj czas - decyduj.
  • #26 9401826
    asembler
    Poziom 32  
    Byc może problemem jest zbyt mały opornik R2 nigdy nie daje mniejszego niż 1k no i druga strona te 200 ohm to tez troszkę zbyt duży prąd jak na transoptor 15-20mA a o ile sie nei myle to większosć łazi do 10mA.
  • #27 9401845
    dondu
    Moderator na urlopie...
    asembler napisał:
    Byc może problemem jest zbyt mały opornik R2 nigdy nie daje mniejszego niż 1k

    Także o tym myślałem, ale wtedy powinien być cały czas wysoki stan na wejściu INT1, a już na pewno nie przypadkowe zbocze opadające, na które przerwanie ma reagować.

    Autor poszedł spać więc poczekamy do jutra.
  • #28 9401881
    asembler
    Poziom 32  
    Zastosowanie 200 Ohm po stronie pierwotnej sugerowało mi że śpiący kśiąze musiał zmniejszyć opornosc do tak niskiej po to aby transoptor mu w ogóle zadziałał a to miż ebyc wynikiem włąsnie zbyt niskiej opornosci po stronie wtórnej. tak nawiasem mówiąc to powinno to wszystko chodzic na wewn pull-up ale skoro już to ja bym dał 2.2k zamiast 470 no chyba że to jakis spejalny typ-egzemplarz tego transoptora.
  • #29 9401899
    dondu
    Moderator na urlopie...
    asembler napisał:
    Zastosowanie 200 Ohm po stronie pierwotnej sugerowało mi że śpiący kśiąze musiał zmniejszyć opornosc do tak niskie po to any transoptor mu zadziałał a to miż ebyc wynikiem włąsnie zbyt niskiej opornosci po stronie wtórnej.

    Faktycznie tak mogło być.

    Napiszę mu jeszcze dzisiaj kawałek testowego na diodach, które ma załączone i poproszę, aby uruchomił z i bez zasilania silnika - to powinno dać nam info, czy to zakłócenia czy nie.
  • #30 9401929
    janbernat
    Poziom 38  
    Fajnie- wspólpraca programu ze sprzętem.
    Jakby nie wyłączył R2 to było by stale 5V.
    Procesor podczas programowania musi mieć zasilanie.
REKLAMA