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

[ATmega8][C] Funkcja do ustawnia wartości PWM źle działa

D12 12 Lis 2011 18:11 1134 4
  • #1 10130794
    D12
    Poziom 14  
    Witam
    Normalnie już nie mogę znaleźć przyczyny więc pisze posta.

    Podłączyłem sobie silnik DC do mostka H steruje atmegą wszystko działa ok. Tylko jedna funkcja którą sobie zrobiłem do zmiany PWM nie działa poprawnie. Oto kod.

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


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


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


    Wszystko rozchodzi się o funkcję void setPWM(unsigned int pwm)
    Jak ustawie pwm ręcznie na 1023 -> PWM = 1023;
    to działa dobrze
    Jak użyje funkcji setPWM(100) to powinno mi wpisać do rejestru OCR1A właśnie 1023 a wpisuje na pewno mniej bo silnik kręci się o wiele wolniej.

    Jak wywołam:
    setPWM(125);
    To silnik kręci się w przybliżeniu z podobną prędkością co przy ustawieniu PWM = 1023;

    Jak wywołam
    setPWM(130);
    To silnik się już nie kręci.


    No ale przecież jak podstawi się do wzoru
    PWM = (pwm * 1023)/100 ;
    PWM = (100 * 1023) /100 to powinno wyjść 1023, a jest na pewno mniej
  • #2 10130885
    Andrzej__S
    Poziom 28  
    100 * 1023 = 102300
    Typ int w avr-libc jest 16-bitowy, a zakres liczby całkowitej 16-bitowej bez znaku wynosi od 0 do 65535.
    Kompilator raczej sam nie zmieni typu danych na odpowiedni, więc proponuję dokonywać obliczenia na zmiennych 32-bitowych i dopiero później rzutować wynik na liczbę 16-bitową wpisywaną do OCR1A.
  • #3 10130980
    D12
    Poziom 14  
    Andrzej__S napisał:
    proponuję dokonywać obliczenia na zmiennych 32-bitowych i dopiero później rzutować wynik na liczbę 16-bitową wpisywaną do OCR1A.


    Nie wiem dokładnie o co chodzi.

    Jeśli o to:
    long long int temp_pwm = (pwm * 1023)/100 ;
    int to = (int)temp_pwm;
    PWM = to ;

    To nie działa.

    Sprawdzałem przez rs232 jak wyśle do funkcji 100 to w rejestrze OCR1A oraz w wyniku przeliczenia otrzymuje zawsze 367

    Ale zapewne chodzi o coś innego o czym nie mam pojęcia :)
  • Pomocny post
    #4 10131040
    Andrzej__S
    Poziom 28  
    Spróbuj tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 10131052
    D12
    Poziom 14  
    Super o właśnie o to chodziło :-D
REKLAMA