PWM na ATMega8: ovládaní motoru přes můstek L293D (0÷20 kHz)

Ahoj, chtel bych poprosit o pomoc. Zkousim rozjet PWM na me ATMega8 k ovladani motoru pres mustek L293D. Potrebuju generovat frekvenci 0-20kHz.
Nikdy jsem s pwm nedelal, tak si ani nejsem jistej jakej mam pouzit mod. No ale myslim ze mam pouzit Casovac 1, Fast PWM, mod 15, TOP OCR1A.
Podle vypoctu me vychazi preddelicka na 8 a TOP 0 - 99. Je to tak spravne?
V programu to pak mam zapsano takto:

[code]
void PWM_Init(void)
{
TCCR1A = (1 << COM1A0) |(1 << COM1B0) |(1 << WGM11) |(1 << WGM10);
TCCR1B = (1 << WGM13) |(1 << WGM12) |(1 << CS11);
}

while(1)
{
i = (int)uart_getc();
OCR1A = i;
uart_putc((char) i);
LMOTOR_FORWARD; //Tenhle je napojenej na PWM
RMOTOR_FORWARD; // Tenhle je na kontrolu rychlosti
}[/code]

kdyz jsem tohle spustil, tak to moc regulovat neslo, kdyz jsem nastavil OCR1A na 70, takse motor skoro ani nerozjel a kdyz 20 tak jel skoro krokem.

Prosim tedy o radu, jestli mam spravnej mod a jestli to mam i spravne zapsany.
Dik moc

:arrow_right: administrator: přejmenováno z "PWM ATMega8"

Nejsem si jist, jak jsi to myslel, ale pwm generuje konstantní frekvenci s proměnnou střídou.

Pro Fosc=8MHz, děličku=8 a TOP=99 ti vyjde frekvence 8e6/8/100=10kHz, takže do 20kHz se vejdeš.

Mód Fast PWM je správně, jesli 14 nebo 15 záleží na tobě. Když použiješ 14, lze využívat oba výstupy PWM (OC1A, OC1B). V případě módu 15 lze použít jen OC1B, ale zas není blokovaná input capture jednotka. Záleží co se ti hodí.
Ve tvém kódu nastavuješ oba výstupy, takže budeš chtít mít pravděpodobně oba aktivní → mód 14, TOP=ICR1. Když máš rozsah v 8 bitech, stačí nastavovat ICR1L a proměnná “i” ti stačí unsigned char.

Budeš-li chtít řídit motor obousměrně, potřebuješ oba výstupy, ovšem inverzní, pro pin OC1A by tedy mělo být opačné nastavení než pro OC1B.
Kdyby se ti to nepodařilo, tak se ti na nastavení mrknu.

ahoj, zapomnel jsem napsat ze jedu na frekvenci 16MHz.

takze ted jsem to zkusil a nasel jsem dalsi zadrhel. Potrebuju menit vystupy OC1A a OC1B, z toho pujde signal do L293D, ktery ovlada motory. Tento signal ma mit frekvenci 0 - 20 kHz, kterou teda chci menit. Jestli to chapu dobre tak 20 kHz znamena ze se za sekundu vystrida 10 000 log.1 a 10000 log.0.

Pouziju tedy rychly PWM rezim. vypocet frekvence je f = f(clk_io)/preddelicka*(TOP+1) pri preddelicce 8 me vychazi na frekvenci 20kHz ze TOP = 99. Ale ted nechapu, ktery rezim pouzit, rikas ze abych mohl pouzit oba dva vystupy, tak musim pouzit WGM = 14, ale v tomhle rezimu se nastvauje pouze ICR1, takze tim nemuzu ridit nezavysle oba dva PWM vystupy. Proto se mi jevi jak spravny WGM = 15 kde nastavuju OCR1A a OCR1B a nezavisle to muzu ridit. V tomhle to ale nefunguje. Je tedy moje uvazovani spravne?

ono jde taky o to jaký motor chceš ovládat - a jestli ho chceš řídit PWM nebo frekvencí - tedy jestli jde o SS motor, nebo krokáč- což není totéž a L293D umožňuje obojí

ridit chci 2 stejnosmerne motory, vlastne upraveny modelarsky serva. Ten H-mustek jsem dalal tady podle toho navodu
rotta.cz/PDF/bridge05.pdf
funguje mi to v pohode, jen bzch chtel jeste ridit tu rychlost, v tom navodu pisou PWM 20Hz az 20kHz.

Cau, muzu se zeptat proc si nepouzil servo s original elektronikou ?

no protoze nechapu to PWM, rizeni pomoci prepinani logickych hodnot je pro me mnohem jednodussi. Jinak nejsem si jistej, jestli by ta elektronika zvladla bezet stale a jestli by to vydrzel ten zesilovac uvnitr, samozrejme tu elektroniku stale mam a muzu zapojit, ale kdyz nechapu to pwm, tak to nechci pouzivat, pro me je motivace to umet ne jen neco od nekoho opsat

Tak se mi zdá že jsi se dostal z bláta do louže, protože teď stejně potřebuješ PWM pro řízení můstku.
Podle mne řízení serva s elektronikou je jednodušší.

ano to mas pravdu ale stejne kdyz budu ten mustek chtit pouzit na neco jinyho, tak to budu potrebovat, no nic tak tam vratim zpatky ty servozesilovace a zkusim to s tim. A myslite, ze to ta originalni elektronika vydrzi?

Myslím, že elektronika jistě vydrží.
Upravené serva se běžně používají (to vím z internetu, sám jsem nezkoušel).
Některé firmy je prodávají už upravené.

Úprava spočívá v tom, že se odstraní mechanické dorazy
a přeruší se mechanické spojení potenciometru s převody.(Nebo se potenciometr vyndá a nahradí dvěma odpory 2k7.)

Zalezi co mas za serva (znacka/cena), ja sem si koupil kdysi davno nejlevnejsi mikroserva a jedinej pruser byl ze jak se trochu ohraly tak tak neudrzely stred, v zavislosti na teplote se tocily (ne moc) , pokud pouzijes ne ty nejlevnejsi serva a nebudes je pretezovat tak by nemel bejt problem, jinak na nete je o tom hodne infa (rizeni , uprava)

:smiley: mam ty nejlevnejsi Hitec HS-311 cena myslim 249kc, takze smula no, vyzkousim a uvidim

uvidis , chce to vyskouset

dobre tak az me to shori tak dam vedet :smiley:

EDIT1:
tak jsem tam teda vratil puvodni elektroniku, odpajel trimr a dal jsem tam 2 rezistory po 2k. V MCU mam program, kterej “funguje”, servo se toci. Ale co me zarazi, nefunguje me inkrementace promnenne:

int i; while(1) { i = 1500; if (i < 2000) { i++; LED_1_ON; _delay_ms(10); } else if(i > 1000) { i--; } LED_1_OFF; OCR1A = i; sprintf(str,"i je %d\n\r", i); uart_print(str); }

tohle se mi snad jeste nestalo, nevim kde je chyby, vypis v PC mi hlasi stale ze i je 1501, takze jednou se to inkrementovalo ale dal jakobz se nic nedelo. Dal jsem si tam ale tu ledku a ta blika spis ay sviti, takye bzch rekl ze to vykonava to telo prvni podminky, ale servo i vypis rika neco jinyho. Nevidite tam nejakou chybu? ja uz fakt nevim

chodi to tak ako si napisal :smiley:

i nastavi na 1500 potom tam mas podmienku ta je splnena tak sa i zvysi o 1dna zapne led a pocka 10ms potom zasa nastavis 1500 a to sa opakuje

no to je sice pekny a v MCU mi to nechodi, servo se toci stale stejne rychle a vypis je stale stejny

i = 1500; if (i < 2000) { i++; LED_1_ON; _delay_ms(10); } else if(i > 1000) { i--; }

To nebude fungovat, zkus toto

   i=1500;
   
   while(1)
   {
      while (i < 2000)
      {
         i++;
         OCR1A = i;
         _delay_ms(10);
      }

      while(i > 1000)
      {
         i--;
         OCR1A = i;
         _delay_ms(10);
      } 
   }

dik :smiley: uz jsem na to prisel sem si neprecetl poradne predchozi prispevek :smiley: dik moc

Mám dotaz, když bych na tom čipu řídil dva krokový motory jeden přes přerušní a druhej v normálním běhu programu. Zvládne to ještě 50 Hz PWM?
Kdybych používal frekvenci 18,432 MHz
Snad je to srozumitelný :slight_smile:

Neviem sice cely rozsah programu, ale podla mna lavou zadnou.