Dobrý den,
stále brouzdám na internetu a nikde nemůžu najít přesný popis pro lajka, jak nastavit hardware PWM na ATmega32.
Můj problém je nastavení rychlostí motorků. Potřebuju v programu jen nastavit dvě hodnoty pro motorky a procesor udělá zbytek.
Pracuju s krystalem 16MHz, navržená dělička 8, špíčka pro čitač 80 (frekvence vychází asi 25KHz), pak se nuluje a pojede odznovu. Já si někde v programu jen nastavím, třeba aby to na 40ce přeplo z Hi na LOW. Našel jsem na to spoustu návodů ale v ničem se nevyznám.
Dále jestli jde pro PWM využít jiné piny než OC1B a OC1A. Potřeboval bych to ale HW, abych nezaměstnával ještě zbytek programu.
Děkuji za odpověď.
Nevim jestli jsem to dobre pochopil ale toto by melo byt to co chces
DDRD=0x30;
TCCR1A=0xA2;
TCCR1B=0x1A;
ICR1L=80;
OCR1AL=40;
OCR1BL=40;
top PWM je ICR1L a hodnotami OCR pak měníš střídu.
Můžeš použít sw PWM, pokud použiješ přerušení tak program skoro nezatížíš.
Ahoj.
Pokud chces pouzit hardwarove PWM tak z datasheetu
Timer/Counter 0 with PWM
#define F_CPU 16000000UL
#include <avr/io.h>
#inclide <util/delay.h>
void init_pwm(void)
{
TCCR0 |= (1<<WGM00);
TCCR0 |= (1<<WGM01); //Set FAST PWM mode
TCCR0 |= (1<<COM01); // Clear OC0 on compare set on max
TCCR0 |= (1<<CS01); //Delicka 8
OCR0 = 1;
}
int main(void)
{
init_pwm();
DDRB |=(1<<3) //Activate PORTB bit 3 as output
for(;;)
{
unsigned char i;
for(i=0;i<254;i++)
{
_delay_ms(500);
OCR0=i;
}
for(i=255;i>1;i--)
{
_delay_ms(500);
OCR0=i;
}
}
Zapojeno na pin OC0
Obdobne funguje TIMER1, ktery je 16 bitovy a TIMER2 ktery je 8-bitovy
Nemel jsem cas to odzkouset.
A pokud ti nevadi
Ať se snažím jak se snažím, zkušební diody jen bliknou a dál už nic. Zkoušel jsem oba programy, ale diody nic. Ani napětí na nich není.
Pak jsem to trochu modifikoval
#include <avr/io.h>
int main(void)
{
DDRD=0x30;
TCCR1A=0xA2;
TCCR1B=0x1A;
ICR1L=80;
OCR1AH=00;
OCR1AL=40;
OCR1BH=00;
OCR1BL=40;
while (1)
{
}
return 0;
}
Diody se rozsvítí, ale už nezhasnou ani nejsou pohaslé, je tam pořád Log. 1. Není chyba že nějak nespustím ty čitače?
Tak pokud vydrzis do 6 do vecera hodim to na nepajive pole a uvidim.
Muj program vyzaduje zapojit LED na PORTB pin 3 OC0 v datasheetu a pokud vykopes to mezi tim for(;; ) tak hodnota lze nastavovat v OCR0 podle toho kolik chces procent. 0-255
Pokud pouzivas LED, rozsah je docela maly tak 0-25, nad tuto hodnotu LED jiz sviti plnym jasem trvale.
Jak říka dragounsoul, zkus menit OCR1L od 0 do 80, zkus dát třeba OCR1L 5 a uvidiš jestli je dioda pohasla.
Aha, moje chyba. Děkuju moc za vysvětlení. Při měření jsem zjistil, že opravdu svítí jen na polovic. Při pokusech s hodnotou už je to líp znatelné.
Jen jestli se můžu zeptat, jakou logikou se nastavuje TCCR1A=0xA2;
TCCR1B=0x1A; a co ty hodnoty znamenají. Pokud chci využívat dva čitače, neměl bych je mít nastavené úplně stejně?
TCCR1A a TCCR1B jsou registry, ktere rikaji Timeru 1 v jakem modu ma jet. Hodnota tudiz nemuze byt stejna.
Svit diod se ovlivnuje OCR1A a OCR1B. Pouziva se tedy jeden citac pro 2 LED, protoze tento to umoznuje.
Pokud chces pouzit dalsi TIMER je nutno uz vystacit S TIMER0 nebo TIMER2, ktere jsou ovsem 8-mi bitove