Zdravim, potreboval bych pomoct, potrebuji na vystupu ADC7 (porty nastavene) priradit pwm signalem 0-5V. Nevim jak ten PWM nastavit aby bylo brano jako 0-5V ani ten prevod moc nechapu. Koukam do toho a hledam neco cele dopoledne a nejsem schopny nic najit:-( (zacatecnik, prosim o trpelivost se mnou:-) )
Fórum › Mikrokontroléry
Atmega16 generovani analogove hodnoty pwm signalem na vystupu ADC
pwm je samo o sobe digitalni - 0V nebo 5V... ale pokud pouzijes vhodny filtr napriklad RC clanek - muzes z toho dostat i ruzne napeti
(jinak je to vsechno o vykonu - stale sepnuto = 100% vykonu, strida 1:1 => 50% ... a tak dale...)
Diky za rychle odpovedi, budu jich ted par potrebovat. ja jsem dobre pochopil ten servomotor, tam je perioda dlouha 20 ms pri 50Hz takze jsem za frekvenci PWM dosadil 50hz, s delickou 64 mi vyslo ICR1 3455, tak jsem si rozdelil periodu 20 ms na 3455 dilku takze pro 1 ms je to 173 a pro 2 ms 345 a posilane hodnoty prepocitavam na tento interval a je to v cajku.
Tady ale nemam danou periodu tak jsem z toho zmateny:D pro fast pwm tam je vypocet frekvence pwm, kdyz dosadim frekvenci krystalu 11059200, delicku treba 64 a ocr0 je 256 vyjde mi 675Hz. timto tak nejak koncim:D Nevim jak douha je perioda...nebo pockat. Takze ja tam budu posilat hodnoty 0-256!! takze prepoctu tech 0-1023 co mam v AVr na 0-256, je to spravne? A co tedy ovlivnuje ta frekvence. Ja mam i knizku v pdf na programovani ATMega16 a je to tam popsane, ale nerozumim tomuto a nastaveni bitu 5 a 4. je to o chovani OC0 a s tim jestli je to vystup ale nepochopil jsem to:-(
Za vystupem ACD7 mam RC clanek a potom ten operacni zesilovac, takze to je v pohode. Problem je, ze mi jeden clovek napsal toto: "Máš nějaký zvláštní důvod proč pin ADC7? Tam totiž nejde použít hw pwm, musel bys to generovat programově.
HW výstupy použitelné pro pwm jsou OC0, OC1A a OC1B." No ve schematu je ale OC2, ICP, OC1A (chapu, tam mam ten muj servomotor a posilam mu OCR1A), OC1B, INT1, INT0....OC0 tam neni, takze to ma jako hodnotu uvnitr a neni to automaticky vystup? Takze jen v programu poslu generovanou hodnotu OC0 na ADC7? Taky se ted divim proc to bylo navrzeno v ADC7 jako vystup....:/
Velice dekuji za trpelivost v pripade prilis stupidnich otazek!! Vazne se snazim sam nejdriv vse pochopit, vyhledat a potom se az ptat.
ja bych se zucastnil par poznamkama
1) ADC7 NENI vystup ale vstup. Jestli to chces brat jako vystup tak pouze jako PA7, port A bit 7. Tedy ma-li to byt "tvrdy" vystup musis nastavit 7. bit v DDRA na 1
2) frekvence zmen ti bude udavat "cistotu" vystupniho signalu za RC filtrem. Da se rict ze bude platit, cim vyssi frekvence, tim cistejsi ( = hladsi) signal na vystupu
3) chovani OCx podle bitu znamena toto. Mas naprogramovany citac, ktery ti na zaklade hodnoty v TCNTx nahazuje/shazuje OCx. Tedy dle datasheetu 0,0 = nic s vystupem OCx nedela, 0,1 = hodi pulz (doufam, ze se nepletu) na OCx, 1,0 = shodi OCx, 1,1 = nahodi OCx. Jenze tohle te nezajima, protoze ty budes pracovat s PA7, takze nechas nastaveni 0,0.
4) ty potrebujes generovat PWM v SW, tedy asi nejlip nastavit citac na CTC rezim, povolit preruseni od COMPARE a od OVERFLOW. Pri udalosti COMPARE treba nahodis PA7, pri udalosti OVERFLOW shodis PA7, nebo naopak
jj, diky!!!
1. - ano je nastaven v ddr na vystup. myslel sem si to tak (2. a 3.).
Takze pwm rezimy nepouzivat. ale CTC. Mno skoda, tem PWM jakztakz rozumim, jak budu delat PWM podle CTC, uz mi z toho puka hlava...mno nic nejaky prikladek by nebyl? Pro nezasveceneho cloveka je to fakt docela dzungle, zrejme jsem to podcenil.
Prosim o pomoc s temi piny,
void init_PWM1(void) //nastaveni pwm
{
TCCR0 = 01001001;
OCR0 = 0;
TCNT0 = 0;
}
void PWM1(int pulse) //funkce
{
OCR0 = pulse;
}
int main(void)
{
PWM1(read_ADC1) //cte hodnotu z prevodniku, to uz mi funguje, tuto hodnotu chci poslat zas pryc
//takze ted je na vystupu OCR0 hodnota z ADC1, tu rovnici z 0-1023 na 0-256 si tam dopisu o to nejde, jen nevim jak mam nastavit ty preruseni a zmenit pin???
projdi si datasheet k procesoru, kolem citacu
je tam jeden registr TIMSK - tam si zvolis ktere preruseni chces pouzivat
tedy ve tvem pripade to bude TIMSK|=(1<<OCIE0)|(1<<TOIE0)
v hlavnim programu pak musis povolit globalne preruseni prikazem sei()
musis pouzit knihovnu # include <avr/interrupt.h>
a samotnou obsluhu preruseni udelas pres
ISR (TIMER0_COMP_vect) pro udalost kdy TCNT0 je rovno OCR0
ISR(TIMER0_OVF_vect) pro udalost preteceni TCNT0
To xhans69 : jj. uz by to melo byt hotove diky. A prosim te jeste jednu vec. Kdyz mam hodnoty co mi jdou do ADC prevodniku, docela skacou, ten prubeh by mel byt jako plynulejsi, daly by se ty skoky nejak eliminovat nebo jen nejakou funkcickou linearizovat trosku. Zas to moc nejde, kdyz potrebuju aktualni hodnoty nemuzu cekat az pobere 50 a vyhodnoti...nevite jak na to? diky
To Hanisss :
to je ale problem vstupniho signalu. Da se to filtrovat budto SW tim ze poberes treba 10 hodnot a zprumerujes, zas tak pomale to neni a asi nepotrebujes extra rychlost vzhledem k prodleve na RC filtru na PWM vystupu, nebo HW, treba kondikem vhodne kapacity
jinak male upozorneni na co jsem pri hrani s ADC prisel ja. Jestli pouzivas vice vstupu, tak po prepnuti na jiny vstup je potreba chvilku pockat a pak teprve spustit mereni. Jinak to dela bordel a ukazuje nesmysly. Viz http://programujte.com/?akce=diskuze&kam=vlakno&tema=16631-m8-a-2-kanaly-z-adc-ovlivnujou-se
cauec, mam jeden dotaz k tomu preruseni...kdyz tam povolim to preruseni...nemuze to prerusit i buffery? mam tam nejake vypocty a at nastavim a zavolam kterykoliv z nich, chova se to porad stejne....jestli to neprerusuje program takze se to nepocita....
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Více PWM výstupů v Bascomu ?? — založil Zdeněk
[C] Průměrování ADC 16-bit hodnoty — založil Maty
ADC Mega8 vratenie hodnoty (C) — založil Teddy
Analogové hodiny — založil Petr
Projekt - analogove hodin — založil gany6
Moderátoři diskuze