PWM výpočet střídy

hoj , je nějaký vzorec na výpočet střídy jak mam 16 bitový Fast PWM třeba ICR0 = 555 kolik to je milisekund ? v katalogu se vtom nemůžu vyznát

Jak často přeteče čítač záleží na tom, na jakém kmitočtu běží MCU a jaký prescaler máš pro daný čítač nastavený. Dále záleží na tom, jestli běží v CTC módu nebo v jiném. V CTC módu přeteče při dosažení nastavené hodnoty, jinak čítá 0x0000-0xFFFF (16-bitový čítač) nebo 0x00-0xFF (8-bitový čítač).

V případě použití čítače pro fast PWM je kmitočet PWM daný rozsahem čítače. V tomto příoadě platí :
**
Ft=Fmcu/prescaler/65536 (16-bitový čítač)**

nebo

Ft=Fmcu/prescaler/256 (8-bitový čítač)

Střída PWM je poměr zapnuto/celý rozsah.

jo tak to už vůbec nechápu, chci ovládat servo tj 1,5 ms puls co 50Hz Fcpu 8 MHz preskaler = 1 a 16 bitový timer jak spočítat ICR0 ?

Neumíš řídit tříkolku a chceš jezdit formulí ? To asi nepůjde. Budeš muset začít pomaleji. Mimochodem - při 8 MHz MCU a prescaleru 1 je pro 16-bitový čítač kmitočet 50Hz nedosažitelný (moc nízký). Jednak si budeš muset udělat trošku pořádek v jednotkách (impulz 1,5 ms každých 50Hz je nesmysl) a jednak budeš muset nejdřív pochopit jak funguje ten čítač/časovač. Mimochodem - servo se neřídí PWM sigálem, ale pulzy délky 600-2400us (0,6-2,4 ms) podle úhlu natočení serva s odstupem 20ms (to je těch Tvých 50Hz). Při 8 MHz MCU se při použití 16-bitového čítače dá pomocí hardwarového PWM generátoru dosahnout impulzů 600-2400us každých 20ms z rozlišením 1us. Ale bez pochopení toho, jak čítač funguje toho dosáhneš jenom jedním ze dvou způsobů : 1) čirou náhodou 2) někdo Ti to napíše. Tady Ti pomůžeme, ale ne tak, že bysme Ti to tu napsali. Nasměrujeme, poradíme, pomůžeme najít chybu, ale nebudeme to tu za Tebe psát.

Takže 1. krok je pochopení čítače :
Frekvence poskočení čítače o 1 : F1=Fmcu/prescaler
Frekvence přetečení celého čítače : Ft=Fmcu/prescaler/Tmax (65536 pro 16-bitový čítač, 256 pro 8-bitový čítač).
Frekvence přetečení čítače v CTC režimu : Ft=Fmcu/prescaler/Tctc (max. 65536 pro 16-bitový čítač, max. 256 pro 8-bitový čítač).

Projdi si datasheet, použij vyhledávání na Internetu a až pochopíš, jak čítač funguje (proč to tak je), přijdeš i na to, jak nastavit čítač tak, aby přetekl každých 20ms. Pak už bude HW generování pulzů o šířce potřebné pro servo hračka.

pozor ! ne vsechna serva takovehle rozpeti pobiraj, “standard” je 1-2ms…

Díky za upřesnění. Hodil jsem sem časy, které jsem vyčetl na serva.cz/rizeni-serva-teorie/ :

nj prescaler mam 8 to sem špatně napsal já nechci aby mi to někdo psal mě to funguje vice méně proto že sem to vysoušel náhodně tady je ten kod je to
na attiny 10

#include <avr/io.h>
#include <util/delay.h>

int main(void){

	CCP = 0xD8;
	CLKPSR = 0x00;  //preskaler = 1

	DDRB |= (1<<PB2);

	TCCR0A |= (1<<WGM01);                             // Fast PWM
	TCCR0B |= (1<<WGM02) | (1<<WGM03);               // Fast PWM
	TCCR0B |= (1<<CS01);                            // Prescaler 8
	TCCR0A |= (1<<COM0A1);// | (1<<COM0A0);        // Clear OC0A
	ICR0 = 19999;


	uint16_t i;

	while(1){

		// levo
		for(i=400;i<2200;i++){
			OCR0A = i;

			_delay_ms(5);
		}


		// pravo
		for(i=2200;i>400;i--){
			OCR0A = i;

			_delay_ms(5);
		}

	}
}

chtěl sem to spočítat protože mi to u atmeg8 vyšlo jinak

To bych řekl, že máš správně. Výpočty sedí. Délka pulzů je 400-2200us. Jen mi není jasný, jak Ti to tedy mohlo vyjít pro ATmega8 jinak. Pokud nastavíš mcu na 8 MHz, pak je úplně jedno, jaký mcu použiješ (samozřejmě - musí mít 16-bit. časovač s ICP a PWM generátorem). Veškeré výpočty se odvíjí od kmitočtu mcu a ne od jeho typu. Snad jenom ten delay 5ms je moc krátký, když pulzy mají odstup 20ms. Možná bych ještě změnu hodnoty OCR synchronizoval s přetečením časovače.

už vím já sem totiž u atmegy pužival 11059200 krystal a prescaler 1024 a to ma rozlišeni 9,25 us
a ta synchronizace to bude v přerušeni dobré ne ?

Tak to jo. Pro synchronizaci bude přerušení ideální. Při 8 MHz systémových hodin a prescaleru 8 víš, že od přetečení čítače máš 8*400 => 3200 taktů procesoru na to, abys to zvládnul. To je moře času. Jenom připomínám, že musíš použít přerušení od ICP a ne TOV, protože TOV nastává pouze při přetečení 0xFFFF->0x0000.