• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
problem w programie Arduino
#11
Wiem, dodałem to w pętli głównej i jest to samo Sad Zauwazyłem jeszcze jedna rzecz. Oto układ do pomiaru predkosci
[Obrazek: TP8CuS.png]

Na wyjsciu OUT jest dioda ktora mruga wraz z wykryciem otworu przez czujnik szczelinowy. Sam układ do pomiaru predkosci i układ scalony działaja poprawnie, bo jak recznie ruszam tarcza to mruga prawidłowa ilosc razy, wiec wina musi lezec po stronie zliczania. 

Dodałem narazie kondensator elekt. 100 mikro i 220 nano bo innych nie mam, ale bez zmian. Zasilenie czujnika z osobnego zasilacza 5V powoduje ze lcd pokazuje juz totalne głupoty - predkosc nawet 6000 rpm
 
Odpowiedź
#12
(16-11-2019, 23:33)sewek10 napisał(a): Zasilenie czujnika z osobnego zasilacza 5V powoduje ze lcd pokazuje juz totalne głupoty - predkosc nawet 6000 rpm
Bo pewnie mas nie połączyłeś.

(16-11-2019, 23:33)sewek10 napisał(a): Oto układ do pomiaru predkosci
Czego tam nie ma?
Komparator zupełnie niepotrzebny!

Pulsein nie ma prawa działać dobrze. Ani we wstawce ASM:
Kod:
#include <avr/io.h>

.section .text

.global countPulseASM

countPulseASM:

.LM0:
.LFBB1:
    push r12   ;   ;  130 pushqi1/1 [length = 1]
    push r13   ;   ;  131 pushqi1/1 [length = 1]
    push r14   ;   ;  132 pushqi1/1 [length = 1]
    push r15   ;   ;  133 pushqi1/1 [length = 1]
    push r16   ;   ;  134 pushqi1/1 [length = 1]
    push r17   ;   ;  135 pushqi1/1 [length = 1]
/* prologue: function */
/* frame size = 0 */
/* stack size = 6 */
.L__stack_usage = 6
    mov r30,r24  ;  port, port   ;  2 *movhi/1  [length = 2]
    mov r31,r25  ;  port, port
/*     unsigned long width = 0;
***     // wait for any previous pulse to end
***     while ((*port & bit) == stateMask)
*/
.LM1:
    rjmp .L2   ;   ;  181 jump  [length = 1]
.L4:
/*         if (--maxloops == 0) */
.LM2:
    subi r16,1   ;  maxloops,  ;  17  addsi3/2  [length = 4]
    sbc r17, r1   ;  maxloops
    sbc r18, r1   ;  maxloops
    sbc r19, r1   ;  maxloops
    breq .L13  ; ,   ;  19  branch  [length = 1]
.L2:
/*         if (--maxloops == 0) */
.LM3:
    ld r25,Z   ;  D.1554, *port_7(D)   ;  22  movqi_insn/4  [length = 1]
    and r25,r22  ;  D.1554, bit  ;  24  andqi3/1  [length = 1]
    cp r25,r20   ;  D.1554, stateMask  ;  25  *cmpqi/2  [length = 1]
    breq .L4   ; ,   ;  26  branch  [length = 1]
    rjmp .L6   ;   ;  184 jump  [length = 1]
.L7:
/*             return 0;
***
***     // wait for the pulse to start
***     while ((*port & bit) != stateMask)
***         if (--maxloops == 0)
*/
.LM4:
    subi r16,1   ;  maxloops,  ;  31  addsi3/2  [length = 4]
    sbc r17, r1   ;  maxloops
    sbc r18, r1   ;  maxloops
    sbc r19, r1   ;  maxloops
    breq .L13  ; ,   ;  33  branch  [length = 1]
.L6:
/*         if (--maxloops == 0) */
.LM5:
    ld r25,Z   ;  D.1554, *port_7(D)   ;  41  movqi_insn/4  [length = 1]
    and r25,r22  ;  D.1554, bit  ;  43  andqi3/1  [length = 1]
    cpse r25,r20   ;  D.1554, stateMask  ;  44  enable_interrupt-3  [length = 1]
    rjmp .L7   ;
    mov r12, r1   ;  width  ;  7 *movsi/2  [length = 4]
    mov r13, r1   ;  width
    mov r14, r1   ;  width
    mov r15, r1   ;  width
    rjmp .L9   ;   ;  186 jump  [length = 1]
.L10:
/*             return 0;
***
***     // wait for the pulse to stop
***     while ((*port & bit) == stateMask) {
***         if (++width == maxloops)
*/
.LM6:
    ldi r24,-1   ; ,   ;  50  addsi3/3  [length = 5]
    sub r12,r24  ;  width,
    sbc r13,r24  ;  width,
    sbc r14,r24  ;  width,
    sbc r15,r24  ;  width,
    cp r16,r12   ;  maxloops, width  ;  51  *cmpsi/2  [length = 4]
    cpc r17,r13  ;  maxloops, width
    cpc r18,r14  ;  maxloops, width
    cpc r19,r15  ;  maxloops, width
    breq .L13  ; ,   ;  52  branch  [length = 1]
.L9:
/*         if (++width == maxloops) */
.LM7:
    ld r24,Z   ;  D.1554, *port_7(D)   ;  60  movqi_insn/4  [length = 1]
    and r24,r22  ;  D.1554, bit  ;  62  andqi3/1  [length = 1]
    cp r24,r20   ;  D.1554, stateMask  ;  63  *cmpqi/2  [length = 1]
    breq .L10  ; ,   ;  64  branch  [length = 1]
/*             return 0;
***     }
***     return width;
*/
.LM8:
    mov r22,r12  ;  D.1553, width  ;  108 movqi_insn/1  [length = 1]
    mov r23,r13  ;  D.1553, width  ;  109 movqi_insn/1  [length = 1]
    mov r24,r14  ;  D.1553, width  ;  110 movqi_insn/1  [length = 1]
    mov r25,r15  ;  D.1553, width  ;  111 movqi_insn/1  [length = 1]
/* epilogue start */
.LM9:
    pop r17  ;   ;  171 popqi [length = 1]
    pop r16  ;   ;  172 popqi [length = 1]
    pop r15  ;   ;  173 popqi [length = 1]
    pop r14  ;   ;  174 popqi [length = 1]
    pop r13  ;   ;  175 popqi [length = 1]
    pop r12  ;   ;  176 popqi [length = 1]
    ret  ;  177 return_from_epilogue  [length = 1]
.L13:
.LM10:
    ldi r22,0  ;  D.1553   ;  120 movqi_insn/1  [length = 1]
    ldi r23,0  ;  D.1553   ;  121 movqi_insn/1  [length = 1]
    ldi r24,0  ;  D.1553   ;  122 movqi_insn/1  [length = 1]
    ldi r25,0  ;  D.1553   ;  123 movqi_insn/1  [length = 1]
/* epilogue start */
.LM11:
    pop r17  ;   ;  138 popqi [length = 1]
    pop r16  ;   ;  139 popqi [length = 1]
    pop r15  ;   ;  140 popqi [length = 1]
    pop r14  ;   ;  141 popqi [length = 1]
    pop r13  ;   ;  142 popqi [length = 1]
    pop r12  ;   ;  143 popqi [length = 1]
    ret  ;  144 return_from_epilogue  [length = 1]
ani w jej wywołaniu:
Kod:
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout)
{
    // cache the port and bit of the pin in order to speed up the
    // pulse width measuring loop and achieve finer resolution.  calling
    // digitalRead() instead yields much coarser resolution.
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    uint8_t stateMask = (state ? bit : 0);

    // convert the timeout from microseconds to a number of times through
    // the initial loop; it takes approximately 16 clock cycles per iteration
    unsigned long maxloops = microsecondsToClockCycles(timeout)/16;

    unsigned long width = countPulseASM(portInputRegister(port), bit, stateMask, maxloops);

    // prevent clockCyclesToMicroseconds to return bogus values if countPulseASM timed out
    if (width)
        return clockCyclesToMicroseconds(width * 16 + 16);
    else
        return 0;
}
Nie są blokowane przerwania a funkcja opiera się o programowy pomiar czasu.
Zrób pomiar czasu timerem, korzystając z przechwytywania (ICP).
 
Odpowiedź
#13
sewek10 zasil z osobnego zasilacza układ sterowania wentylatorem. Przyczyną mogą być zakłócenia właśnie z niego bo momentami pobiera względnie duży prąd i ma wpływ na impulsy z czujnika. Sam czujnik zostaw na zasilaniu z arduino.
Pisałeś, że jak dasz 100% i "regulujesz" obroty obciążeniem (paluszkiem) to jest dobrze. Jak chcesz regulować PWMem to już są problemy.
Dodam jeszcze, że tu przydał by się oscyloskop (ukłony do semi) aby sprawdzić czy impulsy są prawidłowe też przy większej prędkości obrotowej jak i dało by się wykryć czy nie ma zakłóceń.
 
Odpowiedź
#14
(16-11-2019, 23:33)sewek10 napisał(a): Oto układ do pomiaru predkosci
Czego tam nie ma?
Komparator zupełnie niepotrzebny!



[Obrazek: ngxv4l.png]

Czyli taki układ wystarczy ?

Miales racje, nie połączyłem mas, moj bład, lecz jednak dalej pokazuje zle :/
 
Odpowiedź
#15
(17-11-2019, 08:40)Agregacik napisał(a): sewek10 zasil z osobnego zasilacza układ  sterowania wentylatorem. Przyczyną mogą być zakłócenia właśnie z niego bo momentami pobiera względnie duży prąd i ma wpływ na impulsy z czujnika. Sam czujnik zostaw na zasilaniu z arduino.
Pisałeś, że jak dasz 100% i "regulujesz" obroty obciążeniem (paluszkiem) to jest dobrze.  Jak chcesz regulować PWMem to już są problemy.
Dodam jeszcze, że tu przydał by się oscyloskop (ukłony do semi) aby sprawdzić czy impulsy są prawidłowe też przy większej prędkości obrotowej jak i dało by się wykryć czy nie ma zakłóceń.

Wentylator mam podłaczony pod osobny zasilacz, pin PWM do arudino i masa wspolna z arduino. Jutro postaram się sprawdzić oscyloskopem.

Nawet gdy wentylator jest wyłaczony ( a aruduino z PWM właczone i podaje sygnał na pwm wentylatora) i poruszam tarcza palcem, to przy wypełnieniu 100% zlicza dobrze a jak zmniejsam wypełnienie to np 1 mrugniecie diodą zlicza jako 4.

Gdy włacze wentylator i odłacze PWM ( wentylator wtedy pracuje na 100%) to przy wypełnieniu 100% pokazuje predkosc 2330 dla polowy wypełnienia 2500-2600 , a przy 0% znowu 2330

Co ciekawe, jak zasile czujnik z osobnego zasilacza to sytuacja jest jak na poczatku, a jak zasile potencjometry z osobnego zasilacza to pokazuje po 5000 obrotow
 
Odpowiedź
#16
nie powinno to być na stykówce, toż to prosi się o takie własnie błędy.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#17
No rzeczywiście coś tam musi być namieszane jak w cygańskim tobołku. Zacząć trzeba od początku. Wyłączyć PWM. Zliczać impulsy napędzając tarczę obcym napędem, może wkrętarką. Powolutku zwiększając obroty obserwując co liczy układ i wyświetla się na wyświetlaczu.
 
Odpowiedź
#18
(17-11-2019, 12:32)sewek10 napisał(a): Nawet gdy wentylator jest wyłaczony  ( a aruduino z PWM właczone i podaje sygnał na pwm wentylatora) i poruszam tarcza palcem, to przy wypełnieniu 100% zlicza dobrze a jak zmniejsam wypełnienie to np 1 mrugniecie diodą zlicza jako 4.
Pokaż jak generujesz PWM. Pewnie konflikt przerwania z czyms, bo jak pisałem, pulsein to badziew, zabawka, demo. PWM 100% oznacza, ze sygnał wyjściowy ma stały poziom. Pewnie PWM jest programowy i jak pisałem, pulsein głupiej.

Cały ten kod wygląda na demo. Napisz jak trzeba:
- Zliczanie czasu trwania sygnału timerem. A może lepiej mierzyć częstotliwość?
- PWM sprzętowy
Generalna zasada pisania programów: max sprzęt, min program. niestety, w Srajduino jest odwrotnie, max program, min sprzęt choć jest! Sprzęt jest ale nie nieużywany! Z tego wynika wiele problemów! Funkcje "gryzą się" bo po pierwsze "primo" AVR jest wolny. Po drugie "primo" nie ma wielopoziomowego systemu przerwań. Po trzecie "primo", AVR jest dodatkowo spowalniany przez nadużywanie typów zmiennoprzecinkowych, int zamiast int8_t/uint8_t. Po czwarte "primo" C++ na uC z śladową ilością RAM używane nieumiejętnie też robi swoje.
 
Odpowiedź
#19
Chyba się tutaj komuś fora pomyliły... Bo tak nieładnie pisać o Arduino na forum poświęconym tej platformie to chyba tylko świadczy o autorze tych wypocin.
A tak z ciekawości - gdzie pojawia się pulsein w programie autora wątku? Jakoś mi to umknęło.

Sam program przetestowałem, chociaż w nieco innych warunkach, bo bez wentylatora i LCD - podając sygnał z zewnątrz działa całkiem ładnie, wyniki wysyłane przez Serial są w całkiem poprawne i używanie float-ów nie ma najmniejszego wpływu.
Jako ciekawostkę polecam ten sam test zrobić: zamiast sygnału opto można podłączyć generator funkcyjny, albo drugie arduino generujace PWM o znanej częstotliwości. Wyniki wysyłałem po Serial-u, więc też można sprawdzić, czy użycie LCD nie psuje czegoś.
W każdym razie sam program wydaje się działać prawidłowo, testowałem w zakresie 2Hz to 2kHz i wyniki były całkiem poprawne.
 
Odpowiedź
#20
[Obrazek: suD67R.png]

Moze poprostu zrezygnuje z potencjometrow i pwm z arduino i zakupie taki generator PWM za 30 zł
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości