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

Sterowanie prędkością silnika 12V za pomocą PWM i AT89C2051 - zasady działania

BascomCollege 24 Sty 2006 21:14 1932 8
  • #1 2215311
    BascomCollege
    Poziom 11  
    Posty: 27
    Pomógł: 1
    Witam Wszystkich Serdecznie.

    Chciałbym napisać program za pomocą którego mógłbym sterować prędkością obrotów silnika 12V. Proszę, powiedzcie mi na jakiej zasadzie odbywa się sterowanie impulsowe, co ile cykli maszynowych powinno się zmianiać stany i czy przy niskich obrotach (5 - 10 obr/sek.) zostanie zachowana "płynność" pracy silnika?

    Pozdrawiam Serdecznie
  • #2 2216309
    Jellyeater
    Poziom 17  
    Posty: 246
    Pomógł: 6
    Ocena: 3
    Powinno się zmieniać jak najszybciej. AT89C2051 nie nadaje się do tego. Użyj jakiejś atmegi co ma sprzętowy PWM. Bo teraz to cały czas procka zajmiesz generowaniem tego PWM. Potem by zrobić cokolwiek innego musisz przerywać PWM, co wiąże się ze zmianą tej wartości średniej napięcia zasilającego. Jeżeli przerywasz raz na okres to nie ma problemu, jeżeli częściej to może być nieciekawie. Na 12MHz można wyciągnąć około 14KHz.
  • Pomocny post
    #3 2216319
    nadmiszcz
    Poziom 16  
    Posty: 126
    Pomógł: 15
    Ocena: 4
    da się, da.
    choć na AT89C2051 to nie najlepiej działa (i zresztą wszystkich 51 bez PWM), ale ja (kiedyś) napisałem procedurki które pozwalają na płynną regulację silnika SPS:

    W C:
    unsigned char licz,predkosc;
    #define silnik P10
    #define wlacz 1
    #define wylacz 0

    void pwm (void) interrupt 1
    {
    if (licz<predkosc) silnik=wlacz;
    else silnik=wylacz;
    if (++licz>64) licz=0;
    }

    void main (void)
    {
    TMOD=2;
    TCON=16;
    TH0=100;
    TL0=100; // przerw. co 156 cykli * 64 (6bit) ~~100Hz
    ET0=0;
    EAL=1;

    predkosc=0;
    licz=0;


    ...


    w asm:
    org 2000h ;przerwanie RESET
    ljmp 2300h

    org 200Bh ;przerwanie TIMER0
    ljmp 2100h





    org 2100h ;program przerwania timer0:
    cpl p3.2

    inc R6 ;w R6 - ilosc cykli do odmierzenia pelnego PWMa
    cjne r6,#16,dalej ; PWM 4 bitowy
    mov r6,#0 ;jezeli R6=16 to R6=0
    dalej: mov a,r6
    cjne a,05,przel ;porownanie R6 z R5 - wsp wypelnienia - od 0 do 15
    przel: jc zmien ;R6<R5 - na wyjsciu zero logiczne
    setb p3.5 ;R6>R5 - na p3.5 "1"
    sjmp nast
    zmien: clr p3.5

    nast: mov TL0,r7 ;w R7 - predkosc 0 ~ 3900Hz
    mov TH0,#255

    clr TF0
    reti


    org 2300h
    mov TMOD,#01 ;ustawienie licznika T0
    mov TCON,#00010000B
    mov TL0,#0
    mov TH0,#255
    ;ustawienia poczatkowe
    mov r7,#242 ; R7 - czestotliwosc nosna=czestotliwosc przerwan/16 (0 - 3,9kHz ; np dla 225 - 32kHz - przerwanie trwa 30 cykli a program 22 cykle - zostaje 8 cykli na wykonanie glownego programu.)
    mov r6,#0 ; R6 - licznik (wartosc poczatkowa 0)
    mov r5,#2 //R5 - wsp wypelnienia - od 0 do 15 (0 - 100%)

    setb EA ;wlaczenie przerwan
    setb ET0

    pocz: mov r5,#.... ; wpis do r5 wartosci PWM
    sjmp pocz


    end
    /*
    f nosna = f przerwan / 2^(ilosc bitów pwm)
    dla 4 bit (16 poziomow sygnalu)

    R7 = 0 <- czestotliwosc przerwan= 3,9kHz , f nosna = 244Hz
    R7 = 16 <- -''- = 4,2kHz , f nosna = 260Hz
    R7 = 32 <- -''- = 4,4 , -''- = 280
    R7 = 64 <- -''- = 5,2 , -''- = 325
    R7 = 100 <- -''- = 6,4 , -''- = 400
    R7 = 128 <- -''- = 7,8 , -''- = 488
    R7 = 160 <- -''- =10,4 , -''- = 651
    R7 = 180 <- -''- =13,1 , -''- = 822
    R7 = 200 <- -''- =17,8 , -''- =1116
    R7 = 210 <- -''- =21,7 , -''- =1358
    R7 = 220 <- -''- =27,8 , -''- =1736



    */
    ten długi komentaż - jeśli nic mi się nie pomyliło - to tak powinno działać
    a obciążenie procka przerwaniami nie jest wcale takie wielkie....
    6 bit zakres regulacji pewnie wystarczy

    Program nie jest pięknie napisany, ale działa.
  • #4 2216444
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Jellyeater napisał:
    Powinno się zmieniać jak najszybciej. AT89C2051 nie nadaje się do tego. Użyj jakiejś atmegi co ma sprzętowy PWM.
    Nie koniecznie musi być aż ATmega, wystarczy ATtiny2313 też ma sprzętowego PWM i to nawet 16 bitowy.
  • #5 2218071
    Jellyeater
    Poziom 17  
    Posty: 246
    Pomógł: 6
    Ocena: 3
    Kosztują podobnie. Więc można dać cokolwiek. Atmega fajniej brzmi :) A tak serio to jaka jest miedzy nimi różnica?
  • #6 2219335
    nadmiszcz
    Poziom 16  
    Posty: 126
    Pomógł: 15
    Ocena: 4
    no właśnie, kiedyś at90 różniło się wiele od pierwszych Atmeg, a teraz chyba tylko ilością nużków :) tym bardziej że niektóre tiny są wyposażone nie gorzej niż megi... Ale zauważyłem coś jeszcze - wszystkie Atmega mają 131-133 instrukcje , a Attiny 118 (nie mają mnożenia) - chyba że się mylę i już takie też są...
  • #7 2447910
    maly35
    Poziom 14  
    Posty: 91
    Pomógł: 6
    Ocena: 2
    ATtiny przede wszystkim mają mniej pamięci FLASH i SRAM i stąd są raczej przeznaczone do prostszych projektów.
  • #8 2450159
    submariner
    Poziom 32  
    Posty: 2319
    Pomógł: 51
    Ocena: 268
    nadmiscz jaka czestotliwosc udalo Ci sie wydusic? z tego pwm bo ja napisalem cos podobnego tzn cos co obsluguje 2 piny regulacji wypelnienia
    i display led 2 cyfry ale wiecej jak 290 hz przy zegarze 24mhz nie wydusilem
    program napisany byl w Bascomie , wczesniej kolega napisal o 14 khz czy udalo sie napisac taki program czy sa to wyliczenia teoretyczne?
  • #9 2456308
    nadmiszcz
    Poziom 16  
    Posty: 126
    Pomógł: 15
    Ocena: 4
    to zależy kto o czym pisze,
    14kHz do chyba dla AVR (8bit przy 3,58MHz)
    dla '51 to programowo nie da rady (chyba że chodziło o częstotliwość przerwań)
    moje programiki dają f=od 244Hz do 1,7kHz dla fsys=12MHz (oczywiście im więcej tym bardziej obciąża procek) - ale to dla 4bitów - 16 poziomów regulacji - każdy bit więcej to dwukrotny spadek częstotliwości.
    przy większych rozdzielczościach -do silnika, szczególnie dużego, to może być ale do wyśw. LED -może być widoczne migotanie.

Podsumowanie tematu

✨ Sterowanie prędkością silnika 12V za pomocą PWM i mikrokontrolera AT89C2051 jest możliwe, jednak AT89C2051 nie posiada sprzętowego PWM, co wymaga generowania sygnału programowo i znacznie obciąża procesor. Zaleca się użycie mikrokontrolerów z wbudowanym sprzętowym PWM, takich jak ATmega lub ATtiny2313, które oferują wyższą częstotliwość PWM (np. do 14 kHz) i lepszą płynność regulacji. Programowe PWM na AT89C2051 można realizować przerwaniem timera, sterując stanem wyjścia w cyklach, jednak częstotliwość PWM jest ograniczona (rzędu kilkuset Hz do około 1,7 kHz przy 12 MHz), co może wpływać na płynność pracy silnika przy niskich obrotach (5-10 obr/sek). Wyższa rozdzielczość PWM zmniejsza częstotliwość sygnału, co może powodować migotanie przy sterowaniu np. diod LED. Wybór mikrokontrolera zależy od wymagań projektu, pamięci i dostępności sprzętowego PWM.
Wygenerowane przez model językowy.
REKLAMA