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

PCINT - Atmega/Arduino - zlicza niedokładnie +/- 20%

JokoPS 28 Maj 2017 13:36 1965 15
REKLAMA
  • #1 16499389
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    Witam wszystkich!

    Mam problem z przerwaniami PCINT. Używam ich do zliczania impulsów ( do wyświetlania obrotów wentylatora komputerowego). Problem że wynik który otrzymuje jest oo ok 20% inny niż rzeczywiste obroty. Tak samo obroty bardzo skaczą przy ok 1.5k skoki są rzędu 200+/- wciągu 1 sekundy, gdzie wentylator kręci się praktycznie tak samo +/- 10rpm.

    Prosiłbym o weryfikacje kodu i pomoc w znalezieniu błędu....



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


    Z góry bardzo dziękuje
  • REKLAMA
  • #2 16499965
    excray
    Poziom 41  
    Posty: 5498
    Pomógł: 739
    Ocena: 655
    Skróć czas kiedy przerwanie są zablokowane - wywal wysyłanie danych po RSie poza ten obszar kodu gdzie są zablokowane przerwania.
  • REKLAMA
  • #3 16500124
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    Zrobiłem tak jak sugerowałeś, jest jakaś poprawa, ale nie wielka.
    Wogóle jest coś nie tak bo dla 12V mam mieć 1900obr/min i jest ok tylu jak ustawie odpowiednio dzielnikami, ale prze 5V powinno być ok 730obr/min a jest ponad 1k. Nie mam pomysłu co tu jest nie tak.
    Dziwne jest także coś takiego że jak np nie podłacze nic pod pin PD3 (PCINT19) to i tak wyświetlają się jakieś wartości. Zatrzymanie wentylatora na PD2 skutkuje, że dopiero wtedy nie ma żadnych przerwań na tych pinach.
  • REKLAMA
  • #4 16500226
    excray
    Poziom 41  
    Posty: 5498
    Pomógł: 739
    Ocena: 655
    Te piny to mają jakieś podciąganie zrobione? Najlepiej pokaż schemat połączeń.
  • #5 16500564
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    excray napisał:
    Te piny to mają jakieś podciąganie zrobione?

    Tak , piny są podciągnięte rezystorami 10k do lini 5V z Arduino.
    Wygląda to tak rezystor 10k idzie do lini 5V Arduino. Do drugiej nóżki rezystora podłączone jest wyjście tacho wentylatora i pin Arduino (np. PD2 / Pcint18). Masa Arduino i zasilania wentylatora połączone.
  • REKLAMA
  • #6 16500690
    Sareph
    Poziom 24  
    Posty: 638
    Pomógł: 65
    Ocena: 378
    JokoPS napisał:
    Wogóle jest coś nie tak bo dla 12V mam mieć 1900obr/min i jest ok tylu jak ustawie odpowiednio dzielnikami, ale prze 5V powinno być ok 730obr/min a jest ponad 1k.
    Ty te 730@5V policzyłeś czy zmierzyłeś? Oraz czym regulujesz obroty?
  • #7 16500876
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    Porównywałem odczyt z tym co pokazują płyty główne ( sprawdzałe 2 sztuki). Reguluje za pomocą napięcia i PWM.
  • #8 16501082
    Sareph
    Poziom 24  
    Posty: 638
    Pomógł: 65
    Ocena: 378
    JokoPS napisał:
    Porównywałem odczyt z tym co pokazują płyty główne ( sprawdzałe 2 sztuki). Reguluje za pomocą napięcia i PWM.

    Przy "napieciu" powinno działać normalnie na krótkich przerwaniach. Weź tez poprawkę na to, że wentylator będzie miał inna prędkość stojąc w pionie a leżąc na płasko.
    A co do PWM - jeśli to 3 pinowy wentylator, to sterując od strony masy będziesz miał wyniki z czapy. Od strony dodatniej najpewniej też, chyba że dasz tam jakiś sensowny kondensator.
  • #9 16501153
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    Przy "napieciu" powinno działać normalnie na krótkich przerwaniach. Weź tez poprawkę na to, że wentylator będzie miał inna prędkość stojąc w pionie a leżąc na płasko.

    Powinen działać normalnie i działa jak stosuje przerwanie INTx na PCINT są różnice rzedu 20%.
    Sareph napisał:
    A co do PWM - jeśli to 3 pinowy wentylator, to sterując od strony masy będziesz miał wyniki z czapy


    Testowałem wentylatory 4pin z dedykowanym pinem pod PWM..

    Ewidentnie coś z programem jest nie tak.

    Jest jakaś zasada co do rezystancji rezystorów podciągających?
  • #10 16501220
    Sareph
    Poziom 24  
    Posty: 638
    Pomógł: 65
    Ocena: 378
    A zmierz sobie obroty nie w ciągu sekundy a 5 albo 10 i zobacz czy dalej masz takie wahania.
  • #11 16501495
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    Mieżyłem nawet w ciągu 60s... i nie jest wcale lepiej .... Tak jak mówie na przerwaniach INTx jest ok .

    Edit, Jaką powinna być wartość rezystora podciągającego. Stosując wartości od 1k do 50k wyniki zmieniają sie o k 70%

    BTW. Nie rozumiem dlaczego przy INTx jak i PCINTx jak liczę zbocza opadające mam wynik o ok 30% większy niż jak licze zbocza narastające ? Tych zboczy nie powinno być tyle samo ? (ewentualnie różnica max 2? na początku i końcu pomiaru)
  • #12 16501802
    Konto nie istnieje
    Konto nie istnieje  
  • #13 16501864
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    niveasoft napisał:
    Napisz obsługę przerwania tak że kiedy cały port po maskowaniu wejść jest w stanie wysokim to Return.
    Napisz Switch Case i kiedy znajdzie że to któryś pin to Return
    ..a nie testowanie za każdym razem wszystkich trzech możliwości...

    Racja lepiej sprawdzic cały port by określic jakie zbocze wystąpiło.

    Czy rozumiem dobrze: W przerwaniu sprawdzam pierwsze jaki jest stan portu, jezeli wysoki to sprawdzam który to port, następnie zwracam ta informacje używajac Return i wchodze do Switch i wykonuje inkrementacje.

    Jak tak to switch case nie jest potrzebny, na to samo wyjdzie jak użyje if/else. Detekcja pinu na którym wystąpiło przerwanie i tak musi sie odbywaç do momentu wykrycia, który pin zgłasza przerwanie.


    Prosze wyjaśnij mi to:
    JokoPS napisał:
    BTW. Nie rozumiem dlaczego przy INTx jak i PCINTx jak liczę zbocza opadające mam wynik o ok 30% większy niż jak licze zbocza narastające ? Tych zboczy nie powinno być tyle samo ? (ewentualnie różnica max 2? na początku i końcu pomiaru)


    Edit,
    Problem z różną ilośćią zboczy narastających i opadających rozwiązany poprzez dodanie kondesatora 100nF pomiędzy mase a tacho.

    Bez kondesatora:
    PCINT - Atmega/Arduino - zlicza niedokładnie +/- 20%

    Z kondesatorem 100nF:
    PCINT - Atmega/Arduino - zlicza niedokładnie +/- 20%
  • #14 16505562
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    Zmodyfikowałem troche kod, teraz mierze czas pomiędzy poszczególnymi sygnałami (wyniki powinny być dokładniejsze)

    Prosiłbym o wskazówki co można wyżucić z przerwań by przyspieszyć ich wykonywanie?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 16505722
    Konto nie istnieje
    Konto nie istnieje  
  • #16 16505939
    JokoPS
    Poziom 15  
    Posty: 459
    Ocena: 29
    Piotrus_999 napisał:
    W tej sekcji tylko __zapamietaj__ te wartości


    OK, tak zrobie, tylko zeby to zrobić musz dodać kilka nowych zmiennych... Czy tak samo powinienem zrobić w wektotrze przerwań czy tam jest ok?

Podsumowanie tematu

✨ Użytkownik zgłasza problem z przerwaniami PCINT w mikrokontrolerze Atmega/Arduino, które zliczają impulsy wentylatora komputerowego, uzyskując wyniki różniące się o około 20% od rzeczywistych obrotów. Po wprowadzeniu sugestii dotyczących skrócenia czasu blokady przerwań, zauważono niewielką poprawę, ale nadal występują znaczne wahania w odczytach. Użytkownik podłączył rezystory podciągające do pinów, ale wyniki są niejednoznaczne, a różnice w liczbie zboczy narastających i opadających wskazują na problemy z kodem. Po dodaniu kondensatora 100nF do obwodu, problem z różną ilością zboczy został częściowo rozwiązany. Użytkownik modyfikuje kod, aby mierzyć czas między sygnałami, co ma poprawić dokładność pomiarów.
Wygenerowane przez model językowy.
REKLAMA