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

Pożenienie kilku funkcji napisanych przez mistrzów.

janbernat 30 Sty 2011 15:05 5166 33
Najlepsze odpowiedzi LABEL_AI_GENERATED

Jak programowo lub sprzętowo odfiltrować drgania styków mechanicznego impulsatora, gdy przy szybkim kręceniu kolejne zmiany stanu pojawiają się szybciej niż czas ustalania styków i przez to gubią się impulsy?

Przy takich czasach nie da się wiarygodnie odróżnić kolejnych impulsów od drgań styków, bo drgania poprzedniego kroku nachodzą na następny i sygnał staje się w praktyce losowy [#9083333][#9085768] Mechaniczny impulsator nie nadaje się wtedy ani do prostego debouncingu programowego, ani do samego filtrowania sprzętowego; układ RC z przerzutnikiem Schmitta może tylko wygładzić zbocza, ale zacznie gubić część impulsów [#9083422] Jeśli chcesz niezawodnego działania przy dużej prędkości, trzeba zmienić impulsator na optyczny albo na porządny egzemplarz po przeczyszczeniu/wymianie [#9081410][#9083455] Przy mniejszych prędkościach możesz stosować debounce programowy, ale przy podanych około 2,5 ms między zmianami stanu i kilkunastu–20 ms drgań styków nie uzyskasz pewnego zliczania [#9083333][#9085768]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 9078143
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Na początek cały kod:
    
    #include <stdint.h>
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    
    #include "HD44780.h"//radzio	
    #include "TWI.h"	//radzio	
    
    #define PCF8574ADDR			0x20//adres PCF
    #define MAX_OBR 220			//to daje 0.576ms/kroczek
    #define PRAWO 1
    #define LEWO -1
    #define STOP 0
    
    //zmienne globalne
    
    volatile uint8_t gflaga_pomiaru;
    volatile uint8_t g_accel_decel_counter;
    volatile uint8_t gflaga_impulsatora;
    volatile int16_t NoOfPulses;
    
    //prototypy funkcji
    
    void tmf_impulsator(void);
    uint8_t debounce(void);
    void SetAdcKanal(void);	
    void twi_advance_step(int8_t nsteps);
    void ster_silnika (void);
    void licznik (int8_t kierunek_zliczania);
    
    int main(void)
    {   
    	char buf_pozycja[5];
    	char *text="Kolejne";
        char *text1="testy";
    
        DDRB=255;
        PORTB=255;
    	DDRC=0;
    	PORTC=255; 
    
    	TCCR2=_BV(CS22)|_BV(CS21);//|_BV(CS20);silnik sterujemy co 4ms 
    	TCCR0=_BV(CS01)|_BV(CS00);//impulsator sprawdzamy co 1.024ms
    	TIMSK=_BV(TOIE0)|_BV(TOIE2);
    
    // ustawianie I2C 
                          
    	TWBR=18;
    
    //LCD
    
        LCD_Initalize();
        LCD_WriteText(text);
        LCD_GoTo(0,1);
        LCD_WriteText(text1);      
        _delay_ms(300);
    
    	LCD_GoTo(20,1);
    	LCD_WriteText("Pozycja");
    	sei();
    	while(1)		
    	{
    		if(gflaga_pomiaru>=200)// wyświetlacz co 200ms		
    		{			
    			LCD_GoTo(28,1);
    			LCD_WriteText("            ");
    			itoa(NoOfPulses,buf_pozycja,10);
    			LCD_GoTo(28,1);
    			LCD_WriteText(buf_pozycja);	
    			gflaga_pomiaru=0;	
    		}		
    
    		if (gflaga_impulsatora)		
    		{
    			tmf_impulsator();// co 1.024ms
    //			debounce();
    			gflaga_impulsatora=0;
    		}
    
    	}//koniec while
    }//koniec main
    
    
    ISR(TIMER0_OVF_vect)	//co 1.024ms	  
    	{						
    	gflaga_pomiaru++;
    	gflaga_impulsatora++;
    	}
    
    ISR(TIMER2_OVF_vect)	//co 4ms- maleje do 0.57ms dla szybkich obrotów
    	{
    	ster_silnika();
    	}
    
    //Program Dr_Vee do sterowania silnika- nieco zmieniony 
    enum { NUM_STEPS = 8 };
    enum { STEP_MASK = 0xf0 };
    // Uklad I2C: A B C D x x x x
    static const uint8_t steps[NUM_STEPS] =
    	{
    	   0b10000000, 0b11000000, 0b01000000, 0b01100000, 0b00100000, 0b00110000, 0b00010000, 0b10010000
    	};
    
    //  o 1/2 kroku w prawo: advance_step(1)
    //  o 1/2 kroku w lewo:  advance_step(-1)
    void twi_advance_step(int8_t nsteps)// zmieniony przez _marek
    	{
    		if ( nsteps )
    		{
    		   static uint8_t stepNum;
    		   stepNum += nsteps;
    		   stepNum %= NUM_STEPS;
    		   twistart();
    		   twiwrite(0x40 | (PCF8574ADDR << 1));
    		   twiwrite(steps[stepNum] | 0x0f);//maska na resztę pinów
    		   twistop();
    		}
    	} 
    
    
    //funkcja sterująca silnikiem by sulfur- troszkę zmieniona
    
    void ster_silnika (void)
    {
    //zakladam, ze -1 - LEWO, 0 - STOP, 1 - PRAWO
    //-zostało zrobione w #define
    //oraz ze silnik po uruchomieniu stoi
    	static int8_t kierunek_silnika = STOP;
    	int8_t kierunek_impulsatora = STOP;
    	if(NoOfPulses>0)//wybrany_kierunek_obrotow==1)   
    	{
    	kierunek_impulsatora = PRAWO;
        }
    
        if(NoOfPulses<0)//wybrany_kierunek_obrotow==-1)
        {
        kierunek_impulsatora = LEWO;
        }
    
    	if(abs(NoOfPulses)==0)//ten impulsator nie jest doskonały- co jakiś czas gubi impulsy
    	{
    	kierunek_impulsatora=STOP;
    	}
    
    	if (kierunek_impulsatora == STOP && kierunek_silnika == STOP ) return;// nic do roboty, dowidzenia	
    
    	if (kierunek_impulsatora == kierunek_silnika)
    	{
    		if (g_accel_decel_counter <= MAX_OBR)
    		{
    			if(g_accel_decel_counter<abs(NoOfPulses))// przyspieszamy- w lewo albo w prawo, i2c itd
    			{
    			g_accel_decel_counter++;
    			}
    			else
    			{
    			g_accel_decel_counter=abs(NoOfPulses);
    			}
    		TCNT2=g_accel_decel_counter;
    	    twi_advance_step(kierunek_silnika);//to działa
    		}
    	}
    	else
    	{
    		if (g_accel_decel_counter > 0)
    		{
    			if(g_accel_decel_counter>abs(NoOfPulses))//zwalniamy- od prawej albo od lewej, i2c itd
    			{
    				g_accel_decel_counter--;
    			}
    			else
    			{
    				g_accel_decel_counter=abs(NoOfPulses);
    			}
    		TCNT2=g_accel_decel_counter;	
    		twi_advance_step(kierunek_silnika);//to działa
    		}
    
    	else
    	{
    	kierunek_silnika = kierunek_impulsatora;
    	}
    
    	}
    }
    
    
    void tmf_impulsator(void)//funkcja by tmf
    {
    	uint8_t i=0;
    	static uint8_t enc_last;   
    	uint8_t stan_przyciskow;
    	stan_przyciskow=debounce();
    	PORTB=stan_przyciskow;
    
    //    if(bit_is_clear(PINC,4)) i++;//sprawdzenie czy impulsator się ruszył
    	if (stan_przyciskow==0x10) i++;
    
    //    if(bit_is_clear(PINC,5)) i^=3; // convert gray to binary- tak samo jak na bramce XOR
    	if (stan_przyciskow==0x20) i^=3;
    
    	i-=enc_last;
        enc_last+=i;
    
        if(i & 1)
        { // Na bicie 0 sprawdzamy czy coś się zmieniło //bit 0 = value (1)
    	    if(i & 2)// na bicie 1 sprawdzamy kierunek//bit 1 = direction (+/-)
    		{
    			NoOfPulses++; 
    			if (NoOfPulses>=MAX_OBR) NoOfPulses=MAX_OBR;
    	    }
    		else 
    		{
    			NoOfPulses--;
    			if (NoOfPulses<=(-MAX_OBR)) NoOfPulses=(-MAX_OBR);
    	    }
    	}
    } 
    
    
    uint8_t debounce(void)// funkcja Freddiego Chopina
    {
    	static uint8_t last;
    	uint8_t port;
    	uint8_t wynik;
       
    	port = PINC;
        wynik=port&(~last);
        last=port;
        return wynik;
    } 
    

    Mam nadzieję że wszystkich autorów wymieniłem.
    Jeśli o kimś zapomniałem- to przepraszam i proszę się zgłosić.
    Teraz jest tak:
    Jest impulsator podpięty na port C4 i C5.
    Przez I2C sterujemy PCF8574 który wysyła na ULN odpowiednie sekwencje impulsów do sterowania silnika krokowego.
    No i prawie działa.
    W wersji if(bit_is_clear()) działa prawie dobrze.
    Ale są drgania styków- gubi impulsy- więc dodałem debounce().
    Normalnie debounce powinien sprawdzać stan co kilka ms a drgania ustają po ok.20ms.
    Ale w przypadku impulsatora przy szybkim kręceniu stany się zmieniają co 2.5ms.
    Tak że sprawdzam impulsator co 1ms.
    Ale w tym wypadku działa tylko przy szybkim kręceniu impulsatorem a przy wolnym brak reakcji.
    No i już nie wiem- zrezygnować z programowego deboucingu?
    Czy może jakoś da się zrobić?
    Zarówno w wersji if(bit_is_clear()) jak i w wersji z debounce() gubi co jakiś czas impulsy.
  • REKLAMA
  • Pomocny post
    #2 9081410
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    janbernat napisał:
    Normalnie debounce powinien sprawdzać stan co kilka ms a drgania ustają po ok.20ms.
    Ale w przypadku impulsatora przy szybkim kręceniu stany się zmieniają co 2.5ms.


    Czy dobrze rozumie, że okres zmian stanu impulsatora jest krótszy niż okres potrzebny na ustabilizowanie styków impulsatora?
    Jeżeli tak to znaczy że na wejściu masz przebieg jak na wykresie dolnym i sądzę, że niezależnie od tego czy programowo czy sprzętowo nie dasz rady wyłuskać kolejnych kroków impulsatora. W takim wypadku zastosowałbym impulsator optyczny (brak deboucingu). Ale może jest coś o czym nie wiem i da się to zrobić na zwykłym?

    Pożenienie kilku funkcji napisanych przez mistrzów.
  • Pomocny post
    #3 9082723
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    A to jedynie oznacza wymianę impulsatora albo przeczyszczenie przynajmniej.
  • Pomocny post
    #4 9082736
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    asembler napisał:
    A to jedynie oznacza wymianę impulsatora albo przeczyszczenie przynajmniej.

    To jak rozpoznać kiedy zaczyna się kolejny impuls skoro trwają drgania poprzedniego impulsu?
  • Pomocny post
    #5 9082755
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #7 9082853
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #9 9082938
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    No cóż bywają sytuacje w których tylko wycior pomaga.
    Ja już to przerabiałem. Ponieważ jestem zdania jeżeli coś nie chodzi znaczy że programista do du..., więc nie poddając sie pisałem program dotąd aż dało sie cokolwiek odczytac z impulsatora. Program rozrósł sie prawie do 1kB w ASM. Jaki pueta z tego?
    Po rozebraniu impulsatora i przeczyszceniu go fizycznie powróciłem do programu mającego 22 bajty i "prawie nie potrzebny był układ wygaszający drgania styków. Prawie pisze dlatego bo sam program zapewniał eleminacje tego zjawiska.
    Konkluzja: niekiedy trzeba założyć że sprzet też może niedziałać tak jak byśmy to oczekiwali.
    Oczywiście nie zarzekam się ze w tym przypadku to akurat strzał w $0A
  • #10 9083028
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    No nie jest to żadne nie wiadomo co.
    Nowy impulsatorek za 6zł.
    28 pozycji.
    Lepiek kupić niż rozbierać.
    Między stabilnymi pozycjami dwukrotnie zmienia stan na każdym kanale.
    Nie wziąłem pod uwagę że ręcznie da się tym tak szybko kręcić.
    Wychodzi z oscyloskopu jakieś 3ms między zmianami stanów.
    Na razie dałem kondensatory 47nF równolegle do oporników.
    Gdzieś mam funkcję która sprawdza stan w czterech chwilach- sprawdzę wieczorem.
    No i jeszcze w drodze do pracy wymyśliłem że może funkcję Freddiego Chopina wywoływać w innym interwale czasowym niż funkcję tmf do obsługi impulsatora.
    Ale jakoś ten debouncig programowy muszę wymyśleć.
  • Pomocny post
    #11 9083048
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Poprostu zamiast bawić się w swatkę to w kilka chwil napisać swó jprogram, bo ta obsługa impulsatora według zaproponowanego już nie pamietam kogo
    jest mocno podejrzana
    J23

    Dodano po 49 [minuty]:

    janbernat napisał:

    Lepiek kupić niż rozbierać.

    Nie do końca się zgodzę z tym przy spotykanej jakości znanych producentów elementów.
  • #12 9083262
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    janbernat napisał:
    Ale jakoś ten debouncig programowy muszę wymyśleć.

    W takim układzie zadaję ponownie pytania:
    1. Czy dobrze rozumie, że okres zmian stanu impulsatora jest krótszy niż okres potrzebny na ustabilizowanie styków impulsatora?
    2. Jeżeli tak, to jak chcesz rozróżnić na wykresie nr 2, gdzie zaczyna się impuls, a gdzie jest poprzednie drganie?
  • REKLAMA
  • Pomocny post
    #13 9083296
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    No i tu historia zatacza koło... może jednak na przerwaniu zewnętrznym wyzwalanym oboma zboczami ? ;) Na jednym zboczu stwierdzamy stan, na drugim stwierdzamy czy to "chciany", czy też "niechciany" impuls... Nie trzeba żadnych cudów...
  • #14 9083300
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Szpilki są wąskie- i jest ich tylko kilka.
    Zwiększyć ilość próbek.
  • #15 9083305
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Light-I napisał:
    ... może jednak na przerwaniu wyzwalanym oboma zboczami ? ;) Na jednym zboczu stwierdzamy stan, na drugim stwierdzamy czy to "chciany", czy też "niechciany" impuls... Nie trzeba żadnych cudów...

    No więc pytam jeszcze raz: Które zbocze to początek impulsu, a które to drganie?
  • Pomocny post
    #16 9083325
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Impulsator ma dwa wyjścia... Wystarczy sobie spojrzeć na przebiegi stanów przy normalnej pracy.
    1. Tylko jedno z nich podpinamy pod przerwanie.
    2. Skoro przy zboczu opadającym i zboczu narastającym drugie z wyjść impulsatora będzie miało taki sam stan, zaliczamy to jako "drganie", jeśli natomiast różne, zaliczamy to jako prawdziwy impuls... ;)
  • Pomocny post
    #17 9083333
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    janbernat napisał:
    Szpilki są wąskie- i jest ich tylko kilka.
    Zwiększyć ilość próbek.

    Napisałeś wcześniej:

    janbernat napisał:
    Normalnie debounce powinien sprawdzać stan co kilka ms a drgania ustają po ok.20ms.
    Ale w przypadku impulsatora przy szybkim kręceniu stany się zmieniają co 2.5ms.


    W wyniku tego masz wykres jaki pokazałem (wykres dolny).
    Czyli drgania styku zachodzą na kolejną zmianę stanu impulsatora wynikającą z obrotu. Dlatego nie jesteś w stanie ani programowo, ani sprzętowo rozpoznać kiedy jest początek impulsu z impulsatora.

    Innymi słowy jeżeli czasy które podałeś są prawidłowe, masz fajny generator losowej fali prostokątnej z naciskiem na LOSOWEJ.

    Dodano po 3 [minuty]:

    Light-I napisał:
    1. Tylko jedno z nich podpinamy pod przerwanie.
    2. Skoro przy zboczu opadającym i zboczu narastającym drugie z wyjść impulsatora będzie miało taki sam stan, zaliczamy to jako "drganie", jeśli natomiast różne, zaliczamy to jako prawdziwy impuls... ;)

    Impulsator drga. Nie ma znaczenia ilość wejść, wyjśc itp.
    Jeżeli podłączysz pod przerwanie sygnał z impulsatora (wg wykresu dolnego) przy podanych przez janbernat czasach to nadal masz ten sam problem. Losowa ciągła fala prostokątna.

    Dodano po 59 [sekundy]:

    atom1477 napisał:
    Nie da się tego zrobić (rozpoznać).


    Dodano po 3 [minuty]:

    Nawet gdybyś chciał liczyć drgania od pierwszego przerwania wyzwalanego zboczem, i je eliminować, to nie możesz tego zrobić bo nie są stałą liczbą tylko raz będzie 5 drgań, a raz 15.

    Dodano po 2 [minuty]:

    ROZWIĄZANIE (które podałem wcześniej): Zmiana impulsatora na optyczny (jak w myszce z kulką).
  • #18 9083400
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Light-I napisał:
    Impulsator ma dwa wyjścia... Wystarczy sobie spojrzeć na przebiegi stanów przy normalnej pracy.
    1. Tylko jedno z nich podpinamy pod przerwanie.
    2. Skoro przy zboczu opadającym i zboczu narastającym drugie z wyjść impulsatora będzie miało taki sam stan, zaliczamy to jako "drganie", jeśli natomiast różne, zaliczamy to jako prawdziwy impuls... ;)

    To teoria a tu widze praktykę którą nijak sie nie da algorytmem okiełznać.
  • #19 9083406
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    asembler napisał:
    To teoria a tu widze praktykę którą nijak sie nie da algorytmem okiełznać.

    Nie da, ponieważ Light-I zakłada, że ten drugi styk jest ustabilizowany, a on także drga w momencie wywołania przerwania przez styk 1 :)
    Dodatkowo ten podłączony do przerwania drga czyli wywoła kilka przerwań za 1 krokiem impulsatora.
  • #20 9083418
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Mam program który zakłada że jeden ze styków jest popsuty a mimo to dekoduje poprawnie. Ale tu widze że oba drgają jak głupie.
  • #21 9083422
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Sprzętowo to się da.
    Zwiększyć znacznie pojemność kondensatorów i dać przerzutnik schmitta o dość wysokim progu wyzwalania.
    Szpilki będą miały mniejszą amplitudę i nie zmienią stanu przerzutnika.
    Można jeszcze dać hamulec żeby nie dało się tym tak szybko kręcić.
    Ale chyba macie rację- z piasku bata nie ukręcisz.
    Spróbuję w takim razie zrobić impulsator s silnika krokowego- styków w nim nie ma a czy są drgania to zmierzę.
  • #22 9083429
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    asembler napisał:
    Ale tu widze że oba drgają jak głupie.

    I to jest sedno problemu, a rozwiązanie tylko poprzez optyczny impulsator.

    PATENT
    Kto jednak to wymyśli i zrealizuje, niech od razu patentuje w USA :D:D:D

    Dodano po 1 [minuty]:

    janbernat napisał:
    Sprzętowo to się da.
    Zwiększyć znacznie pojemność kondensatorów i dać przerzutnik schmitta o dość wysokim progu wyzwalania.

    W ten sposób będziesz tracił niektóre impulsy, choć będzie Ci się wydawało że zlicza poprawnie.

    Dodano po 1 [minuty]:

    janbernat napisał:
    Spróbuję w takim razie zrobić impulsator s silnika krokowego- styków w nim nie ma a czy są drgania to zmierzę.

    O! Tego jeszcze nie robiłem - ciekawe jakie byłyby efekty.

    A może łatwiej będzie zrobić jednak optyczny?
  • Pomocny post
    #23 9083450
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Przeroniłem wiele impulsatorów i wcale nie trzeba ąż optyczny tylko zastosować porządny impulsator, albo jak pisałem wcześniej nawet nie patrząc czy to stary czy nowy, gdyż nie wiadomo ile lezał na magazynie rozebrać przeczyścić bo w 90 $ przypadków smar dostaje sie na styki i mamy dyskotekę.
  • REKLAMA
  • #24 9083455
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Zobacz to: http://ostol.pl/gallery/image/1+kajman_dds+003-gotowy-impulsator-optyczny+550

    Dodano po 4 [minuty]:

    asembler napisał:
    tylko zastosować porządny impulsator

    Czyli konkretnie który?
    Musiałby spełniać wymagania dot. stabilizowania drgań w czasie krótszym niż 1 ms - nie spotkałem takiego, choć nie wykluczam, że są, jednak biorąc pod uwagę prawa fizyki, to raczej takich nie ma lub są kosmicznie drogie.

    Dodano po 17 [minuty]:

    Potrzebny Ci jest taki lub podobny: http://www.alliedelec.com/Images/Products/Dat...C/Grayhill-Inc_Industrial-Control_9489999.pdf

    Co ciekawe jest tam także przycisk (wciśnięcie pokrętła). W datasheet pisze, że czasy stabilizacji styków są:
    - przy wciśnięciu mniej niż 4ms
    - przy puszczeniu mniej niż 10ms

    Czyli pełny cykl to 15 ms (a jeszcze trzeba parę ms na rozpoznanie stabilności styku) i już się robi coś koło 20ms na 1 impuls.
  • #25 9084378
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    Panowie.
    Gdyby mi chodziło o sprzet do ważnych zadań to bym kupił.
    A ja się uczę C na tym co lubię- czujniki, silniki, przekaźniki i wszystko co się rusza i warczy.
    Pożenienie funkcji których zwięzłość i skuteczność wprawiła mnie w podziw dla Autorów to dla mnie duży sukces- prawie działa.
    To że to jest tani impulsator marki noname to celowe.
    Na czymś doskonałym jakościowo nie można sprawdzić softu- i tak działa.
    A mi zależy na analizie kodu i zależności czasowych- może coś głupio zrobiłem a może należy użyć bardziej skomplikowanego programu.
    np:
    http://drmarty.blogspot.com/2009/05/best-switch-debounce-routine-ever.html
    A także na drugi program w tym temacie.
    A to że ożenienie dobrego programu ze znajomością elektroniki jest trudne- to coraz bardziej wiem.
    Pewnie niektórzy z was patrzą na moje wypociny w programowaniu tak jak ja patrzę na niektóre "rozwiązania układowe".
    A "programuję" w C już od dawna- od sierpnia.
    A elektroniką trochę dłużej.
    Tak że zerknijcie na kod- może tam są jakieś straszne rzeczy.
    A może należy nieco zmienić koncepcję- nie mierzyć bezwzględnego położenia ale przyrost i kierunek.
  • #26 9085768
    dondu
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    Rozumie Twoje intencje, ale dopuść do siebie myśl, że czasy które podałeś na początku nie pozwolą Ci na zrobienie tego na impulsatorze stykowym, ponieważ drgania cyklu poprzedniego zachodzą na drgania cyklu następnego i nie ma przerwy po której można stwierdzić z całą pewnością, że to początek lub koniec danego impulsu z impulsatora (patrz wykres dolny).

    Oczywiście przy mniejszych prędkościach obrotowych zrobisz debouncing programowy lub sprzętowy.

    Ale, do upartych świat należy ... więc próbuj, bo jak powiedział Albert Einstein:

    Albert Einstein napisał:
    Wszyscy wiedzą, że czegoś nie da się zrobić, aż znajduje się taki jeden, który nie wie, że się nie da, i on to robi.
  • #27 9086114
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    asembler napisał:
    Light-I napisał:
    Impulsator ma dwa wyjścia... Wystarczy sobie spojrzeć na przebiegi stanów przy normalnej pracy.
    1. Tylko jedno z nich podpinamy pod przerwanie.
    2. Skoro przy zboczu opadającym i zboczu narastającym drugie z wyjść impulsatora będzie miało taki sam stan, zaliczamy to jako "drganie", jeśli natomiast różne, zaliczamy to jako prawdziwy impuls... ;)

    To teoria a tu widze praktykę którą nijak sie nie da algorytmem okiełznać.
    W takim razie nie mam pojęcia, dlaczego u mnie działa na przerwaniach standardowy impulsator firmy ALPS... ;)
  • #28 9087558
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Light-I napisał:
    asembler napisał:
    Light-I napisał:
    Impulsator ma dwa wyjścia... Wystarczy sobie spojrzeć na przebiegi stanów przy normalnej pracy.
    1. Tylko jedno z nich podpinamy pod przerwanie.
    2. Skoro przy zboczu opadającym i zboczu narastającym drugie z wyjść impulsatora będzie miało taki sam stan, zaliczamy to jako "drganie", jeśli natomiast różne, zaliczamy to jako prawdziwy impuls... ;)

    To teoria a tu widze praktykę którą nijak sie nie da algorytmem okiełznać.
    W takim razie nie mam pojęcia, dlaczego u mnie działa na przerwaniach standardowy impulsator firmy ALPS... ;)

    Sam sobie odpowiedziałes bo jeszcze jest standardowy.
  • #29 9089365
    janbernat
    Poziom 38  
    Posty: 3954
    Pomógł: 468
    Ocena: 51
    No dobrze- wygraliście.
    Rozebrałem ten impulsator noname.
    To że drga i gubi impulsy- to nic.
    To że wogóle działa- to zdumiewające.
    Dzieki wszystkim.
    To teraz zacznę próby z silnikiem krokowym jako impulsatorem.
  • #30 9089506
    asembler
    Poziom 32  
    Posty: 2099
    Pomógł: 123
    Ocena: 11
    Nie przesadzaj impulsatory są bardzo dobre szczególnie z rozbiórek róznych sprzetów. Ostatnio dorwałem z monitor CRT to nawet bez programu działa:-)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemów związanych z obsługą impulsatora w kontekście drgań styków, które mogą prowadzić do błędnych odczytów impulsów. Uczestnicy rozważają różne metody eliminacji drgań, w tym zastosowanie impulsatorów optycznych oraz poprawę jakości impulsatorów mechanicznych poprzez ich czyszczenie. Wskazują na trudności w programowym debouncingu, gdyż drgania mogą zachodzić na zmiany stanu impulsatora. Uczestnicy dzielą się doświadczeniami z różnymi modelami impulsatorów, a także sugerują użycie silników krokowych jako alternatywy. W końcu, autor podkreśla, że celem jest nauka programowania w C oraz analiza kodu w kontekście elektroniki.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA