Presny zdroj napeti 1.00V

Potrebuji zdroj, ktery da presne 1.00V. Zkousel jsem treba 7805 a k tomu na vystup trim 10K kde jeden vyvod sel na zem, druhy na +5V a na prostrednim vyvodu (jezdec) jsem si reguloval vystupni U jake potrebuji. Kdyby mi stacila presnost na 1.0 V tak \to je v pohode, ale ja potrebuji 1.00V. Poradi mi nekdo ? V elektronice nejsek zadny extra znalec, spise takovy amater z dob pred 20-ti lety.

Jaká bude zátež a na co je třeba přesně 1.00V jesli to není tajné?
Pravděpodobně ti nezbyde než koupit nějakou referenci a na ni pověsit OZ (může zajistit posun úrovně), případně další obvody dle požadované zátěže.
tme.eu/cz/katalog/index.phtm … e%3D2%2C50

Můžeš také použít teplotně kompenzovanou třísvorkovou Zenerovu diodu s nastavitelným výstupním napětím a na výstup dát dělič napětí.

Odkaz zde:
hw.cz/Produkty/Nove-soucastky/AR … dioda.html

1.00V je udaj z ktoreho vyvodzujem, ze Ti staci nastavenie na 1%.
Ak nevies poriadne nastavit hodnotu obycajnym trimrom, pouzi viacotackovy, alebo daj rimer ako sucast odporoveho delica. Na jeho vystup zaves operacny zosilnovac. Ten moze byt napajany z tych 5V.

Trimer ako sucast odporoveho delica pouzi nasledovne.

Z 5V daj odpor 3k9, na jeho druhy koniec daj koniec trimra 500R, na druhy koniec trimra daj odpor 1k, ktory bude mat druhy koniec spojeny s GND stabilizatora. S bezca trimra si prived napatie na ten OZ. Ak vies trimrom dosiahnut iba 1.0V (nechapem v com sa to lisi od 1.00000000V, ale to nevadi :slight_smile: ) napada mi ci Ti nahodou nekmita ta 7805. Dal na nu 100n kondenzatory?

to Martin: Mam 7805 a odporovy delic s viceotackovym trimrem. Nastavim si vystupni U na 1.00V a kdyz 7805-ka da mensi ci vetsi U nez jake bylo pri nastavivani trimru, tak se ten rozdil projevi i na vystupu z toho trimru. pr: 7805 ma 5.00V, za trimrem mam 1.00V, kdyz 7805 ma aktualne 5.02V, tak vystup z trimru ma 1.02V.

K cemu to potrebuji ? Mam dvojity potenciometr kde jednim nastavuji vystupni U pro motorek a na display si zobrazuji na kolik % je nastavny vykon motorku (1.00 = 100%, 0.35 = 35%). Puvodne jsem uvazoval o PWR s 16F877A, ale ja tech motorku mam celkem 3 a vsechny reguluji soucasne a to nezavisle na sobe. Jine reseni me nenapadlo jak zobrazit % nastaveni vykonu samostatne pro kazdy motorek.

Ako som pochopil, jedna sa o jeden kus zariadenia. Preco Ti 7805 raz dava 5.00V a inokedy zase 5.02V? Z tej 7805 by si nemal uz nic ine napajat. Ma sluzit IBA ako napatova referencia.

Miesto 7805 mozes pouzit skutocnu napatovu referenciu napr.TL431. Praca s nou je podobna (zapojenie trimra na vystup).

Nebolo by bajjednoduchsie merat vystupne napatie na potenciometri ktorym nastavujes vystupne U na motorcek? Cez AD do procesora a ten by okalibrovane percenta zobrazoval na display. Zda s ami to ako uplne nejjednoduchsie.

Ja z te 7805-ky zivim jeste PICko a LCD display (20x4). Mam jeste v supliku jednu volnou 7805 a tak to zkusim saomstatne jen jako ten referencni zdroj. Pokud to nebude OK, asi pujdu do toho TL431.
Diky vsem za radu.

To mi nesedí. Jestliže je na výstupu 7805 dělič 1:5, musí se i odchylka od jm. napětí dělit v tomto poměru. Při 5,02V by na výtupu mělo být 1,004V.
Jestliže je to tak, jak píšeš, odchulka vzniká suprpozicí napětí v zemích se stabilizovaným napětím.

Mimochodem 7805 není použitelný jako zdroj referenčního napětí, ale jako stabilizátor. Jeho odchylka bývá 5%, některé typy mohou mít jen 2%, ale i to je dost. Jeho činitel stabilizace taky není nic moc a ani s výstupním šumem to zrovna není vynikající. Byl zde zmíněn TL431, který pro tyto účely dobře poslouží i když dává 2,5V.

Uz jsem se rozhodl, zitra se stavim do GME, nejake ty TL431 tam maji a ja budu mit po problemu.

Nevím, jesli jsem to pochopil správně: z jednoho jezdce si čteš napětí (které má pro tebe význam výkonu) a z druhého krmíš nějaký motor? Nechci ti kazit náladu, ale ta hodnota nebude v žádném případě odpovídat výkonu. Zatížený dělič (napájející motor) není lineární a motor rozhodně také ne. Navíc výkon roste s napětím kvadraticky (při konstantní zátěži). Takže hodnota může odpovídat maximálně napětí na motoru a to jen pouze pokud nebude dělič napájet motor přímo (nebude zatížen, bude za ním zasilovač) a pak by stačil 1 jezdec.
Nebo jsem úplně vedle, ale ten popis nebyl moc detailní :slight_smile:.
Co ty motory napájet pomocí PWM, přepočet na procenta bude pak pouze záležitostí výpočtu v mcu z hodnoty vložené do pwm.

Takze to zkusim popsat jinak:
Mam PWM pomoci NE555 a regulace probiha pomoci potenciometru. Na LCD chci zobrazit na kolik % je otoceny potenciometr. Protoze pouzivam dvojity potenciometr, tak tim prvnim reguluji NE555 a tim druhym poustim U = 0.00 - 1.00V do portu PICu a to pak prepoctu na % (0.00 = 000% , 1.00 = 100%). Vykon motoru si spocitam podle U a odebiraneho I (P=U*I), I merim pomoci ubytku U na odporu pred motorem. PWM z PICu zde nemuzu pouzit pac: 1) PWM z PICu mi bude regulovat podsviceni LCD, 2) reguluji celkem 3 motory nezavisle na sobe a to chce 3xPWM a to stejne 16F877A nema.

Pouzi tl431 ako ti uz radili a ked sa budes velmi nudit vypocitaj si ake hodnoty idu pre zatazenu odporovy delic kde zataz bude odpor tvojho potenciometra. Aj ked si myslim ze presnost bude druhorda v zhlabom na to ze na potaku budu nejake prechody odporova draha bezec.

Tak ze musi do ist v danej tolerancii

Presnost je jen informativni, takze to nejak extra neresim. Je to v duchu “tak nejak asi to je nastavene na %” , neni to urcene do atomove elektrarny :wink:

A preco PWM nerobis softwarovo? Si od casovaca sprav prerusenie kazdych 10us - to bude tvoj krok PWM a na 256 urovni bude perioda jeden krat za 2,56ms. To je na ovladanie motora myslim dostatocne rychla PWM (39Hz).
Kludne i styri taketo sw PWM.

Naco Ti je potom taka 555?

Riadenie podsvetlenia displeja pomocou PWM procesora bude urcite prioritnejsia uloha ako riadenie toho motora :slight_smile:, ze ma to skor nenapadlo :slight_smile:

Preco nepouzijes na taku ulohu normalnejsi/vhodnejsi procesor?
Preco druhu sekciu potenciometra nezavesis na Ucc a pri prevode tohto AD vstupu nepouzijes ako referenciu Un?
Preco priamo nemerias prvu sekciu potenciometra procesorom a druhe Ti je uplne zbytocna?

Kedy konecne ludia prestanu pouzivat procesory radu 16xxx? Myslim , ze dnes i z ponuky Microchipu jedno z najhorsich a najdrahsich (pomer vykon/cena) rieseni.

No, ja s PICem teprve zacinam, takze jeste nejsem tak dobry abych si dokazal sam udelat SW PWM od preruseni casovace. A proc mam zrovna 16F877A ? Ja mel jako prvni 16F84 (spousta jednoduchych tutorialu typu On/Off Led, klavesnice, tlacitka, …) a nejak jsem presel k 16F877A, ani nevim proc zorvna k tomuto procesotu, asi proto ze ma 8AD vstupu. Takze se prozatim ucim a jsem vicemene porad na zacatku. Presel bych i na 18Fxxxx, jen nevim jeste na ktery, kde pro konkretni typ bych nasel hodne “jednoduchych tutorialu” a pokud mozno literaturu v cestine (datasheet apod.). Aha, uz si vzpominam proc mam 16F877A, nakladatelstvi BEN vydalo knizku o tomto procesotu, presneji datasheet prelozeny do cestiny.

Cim skor zacnes s niecim na dnesne pomery “normalnym” (bez strankovania pamate, s normalnym stackom v RAM, instukcia na takt, …) tym viac casu si usetris.

Viem, ze sa to jednoduchymi kontrukciami na 16Fxxx len tak hemzi, ale je to velmi velmi medvedia sluzba vsetkym zaciatocnikom. Aj tie preklady knih k tomu nabadaju. V poslednej chvili som odhovoril kamarata od 16Fxxx (tiez s nimi chcel zacat, lebo si o nich kupil knizku a zdalo sa mu to dostatocne jednoduche na pochop) a dnes (po par mesiacoch z uplnej nuly) programuje graficky display, vyraba si roznu domacu automatizacnu techniku a tak. Programuje vylucne v C-cku a je velmi spokojny.

Moze sa Ti zdat, ze k vacsim proccesorom je toho v zrozumitelnej reci omnoho menej, ale ta namaha preluskat sa cez to sa bohate vyplati. :slight_smile:

sw PWM sa robi takto:

Rozhodnes sa, kolko urovnove PWM chces pouzit. Nech je to napriklad 256. Ale kludne to moze byt i 50 - zakladna perioda potom bude rychlejsia, alebo aj 2000. Podla toho si vyberies pomocnu premennu v ktorej bude umiesntena pozadovana strieda, ci jedno alebo dvoj bajtovu.
Od casovaca si aktivujes prerusenie, napriklad 1x za 10us, ak by si nestihal, tak 1x za 100us - to uz zavisi co Ti da Tvoj procesor.

No a potom do prerusenia vlozis nasledovny kod (napr. pre 4 PWM kanalov). Priklad budem kvoli zrozumitelnosti pisat v C-cku (konkretne pre ATmega s GCC). Vsetky PWM vystupy su na porte B

#include <avr/io.h>


#define POCET_PWM  4
#define POCET_DIELIKOV_PWM 200
// nastavi 1.vystupny pin na log.1
#define SET_VYST_1 PORTB = PORTB | 0x01
// nastavi 1.vystupny pin na log.0
#define RES_VYST_1 PORTB = PORTB & ~0x01

// nastavi 2.vystupny pin na log.1
#define SET_VYST_2 PORTB = PORTB | 0x02
// nastavi 2.vystupny pin na log.0
#define RES_VYST_2 PORTB = PORTB & ~0x02

// nastavi 3.vystupny pin na log.1
#define SET_VYST_3 PORTB = PORTB | 0x04
// nastavi 3.vystupny pin na log.0
#define RES_VYST_3 PORTB = PORTB & ~0x04

// nastavi 4.vystupny pin na log.1
#define SET_VYST_4 PORTB = PORTB | 0x08
// nastavi 4.vystupny pin na log.0
#define RES_VYST_4 PORTB = PORTB & ~0x08


volatile char prac_cnt = 0; // pracovne pocitadlo pwm, ktore sa po spusteni programu nastavi na hodnotu 0
volatile char pwm[POCET_PWM]; // definujem 12 pomocnych 8b premennych




// rutina, ktora sa zavola z pravidelneho prerusenia od casovaca
void fn_generovanie_sw_pwm(void)
{


// nastavenie novej hodnoty premennej prac_cnt od 0 do hodnoty POCET_DIELIKOV_PWM

   prac_cnt = prac_cnt + 1;
   if (prac_cnt >= POCET_DIELIKOV_PWM) {
      prac_cnt = 0;
   }


   // takto zapisana podmienka zabezpeci, ae ak pwm[x] = 0; vystup bude v stave log.0
   if (prac_cnt < pwm[0]) SET_VYST_1;
   else RES_VYST_1;
 
   if (prac_cnt < pwm[1]) SET_VYST_2;
   else RES_VYST_2;

   if (prac_cnt < pwm[2]) SET_VYST_3;
   else RES_VYST_3;

   if (prac_cnt < pwm[3]) SET_VYST_4;
   else RES_VYST_4;

   return;

}


int main(void)
{

        DDRB = 0xff;
	pwm[0] = 12;
	pwm[1] = 146;
	pwm[2] = 75;
	pwm[3] = 190;

	while(1) {
// rutinu treba volat z casoveho prerusenia, tu je iba na testovacie ucely
// a okrem toho je zaREMovana
//		fn_generovanie_sw_pwm();
	}

}

neviem, ako by sa to zapisalo v asm hatmatilke a este k tomu pre kazdy typ procesora inak, C-cko sa mi preto na vyjadrenie algoritmu zda vhodnejsie. Mozem Ta zaroven ubezpecit, ze dnesne prekladace i zdanlivo rozvlacne napisany kod prelozia velmi velmi optimalne. Pri takychto algoritmoch. Pre porovnanie prikladam disasembler pwm rutiny

@00000024: fn_generovanie_sw_pwm
---- pwm_pokus.c ----------------------------------------------------------------------------------
37:       {
+00000024:   91800060    LDS       R24,0x0060     Load direct from data space
+00000026:   5F8F        SUBI      R24,0xFF       Subtract immediate
+00000027:   93800060    STS       0x0060,R24     Store direct to data space
43:          if (prac_cnt >= POCET_DIELIKOV_PWM) {
+00000029:   3C88        CPI       R24,0xC8       Compare with immediate
+0000002A:   F010        BRCS      PC+0x03        Branch if carry set
44:             prac_cnt = 0;
+0000002B:   92100060    STS       0x0060,R1      Store direct to data space
49:          if (prac_cnt < pwm[0]) SET_VYST_1;
+0000002D:   91900060    LDS       R25,0x0060     Load direct from data space
+0000002F:   91800061    LDS       R24,0x0061     Load direct from data space
+00000031:   1798        CP        R25,R24        Compare
+00000032:   F410        BRCC      PC+0x03        Branch if carry cleared
+00000033:   9AC0        SBI       0x18,0         Set bit in I/O register
+00000034:   C001        RJMP      PC+0x0002      Relative jump
50:          else RES_VYST_1;
+00000035:   98C0        CBI       0x18,0         Clear bit in I/O register
52:          if (prac_cnt < pwm[1]) SET_VYST_2;
+00000036:   91800062    LDS       R24,0x0062     Load direct from data space
+00000038:   1798        CP        R25,R24        Compare
+00000039:   F410        BRCC      PC+0x03        Branch if carry cleared
+0000003A:   9AC1        SBI       0x18,1         Set bit in I/O register
+0000003B:   C001        RJMP      PC+0x0002      Relative jump
53:          else RES_VYST_2;
+0000003C:   98C1        CBI       0x18,1         Clear bit in I/O register
55:          if (prac_cnt < pwm[2]) SET_VYST_3;
+0000003D:   91800063    LDS       R24,0x0063     Load direct from data space
+0000003F:   1798        CP        R25,R24        Compare
+00000040:   F410        BRCC      PC+0x03        Branch if carry cleared
+00000041:   9AC2        SBI       0x18,2         Set bit in I/O register
+00000042:   C001        RJMP      PC+0x0002      Relative jump
56:          else RES_VYST_3;
+00000043:   98C2        CBI       0x18,2         Clear bit in I/O register
58:          if (prac_cnt < pwm[3]) SET_VYST_4;
+00000044:   91800064    LDS       R24,0x0064     Load direct from data space
+00000046:   1798        CP        R25,R24        Compare
+00000047:   F410        BRCC      PC+0x03        Branch if carry cleared
+00000048:   9AC3        SBI       0x18,3         Set bit in I/O register
+00000049:   9508        RET                      Subroutine return
59:          else RES_VYST_4;
+0000004A:   98C3        CBI       0x18,3         Clear bit in I/O register
+0000004B:   9508        RET                      Subroutine return

rutina i so zavolanim prebehne na ATmega8 za 3.32us pri 14.7456MHz Xtale a ma 32 instrukcii.

No a samozrejme, sa do da zapisat este uspornejsie, ak viem, ze vsetky PWM vystupy su vedla seba

void fn_generovanie_sw_pwm(void)
{

char i = 0;
// nastavenie novej hodnoty premennej prac_cnt od 0 do hodnoty POCET_DIELIKOV_PWM
   prac_cnt = prac_cnt + 1;
   if (prac_cnt >= POCET_DIELIKOV_PWM) {
      prac_cnt = 0;
   }

   i = PORTB & 0xf0;
   if (prac_cnt < pwm[0]) i += 1;
   if (prac_cnt < pwm[1]) i += 2;
   if (prac_cnt < pwm[2]) i += 4;
   if (prac_cnt < pwm[3]) i += 8;
	PORTB = i;

   return;

}
@00000024: fn_generovanie_sw_pwm
---- pwm_pokus.c ----------------------------------------------------------------------------------
37:       {
+00000024:   91800060    LDS       R24,0x0060     Load direct from data space
+00000026:   5F8F        SUBI      R24,0xFF       Subtract immediate
+00000027:   93800060    STS       0x0060,R24     Store direct to data space
43:          if (prac_cnt >= POCET_DIELIKOV_PWM) {
+00000029:   3C88        CPI       R24,0xC8       Compare with immediate
+0000002A:   F010        BRCS      PC+0x03        Branch if carry set
44:             prac_cnt = 0;
+0000002B:   92100060    STS       0x0060,R1      Store direct to data space
63:       	i = PORTB;
+0000002D:   B398        IN        R25,0x18       In from I/O location
64:       	i &= 0xf0;
+0000002E:   7F90        ANDI      R25,0xF0       Logical AND with immediate
65:          if (prac_cnt < pwm[0]) i += 1;
+0000002F:   91200060    LDS       R18,0x0060     Load direct from data space
+00000031:   91800061    LDS       R24,0x0061     Load direct from data space
+00000033:   1728        CP        R18,R24        Compare
+00000034:   F408        BRCC      PC+0x02        Branch if carry cleared
+00000035:   5F9F        SUBI      R25,0xFF       Subtract immediate
66:          if (prac_cnt < pwm[1]) i += 2;
+00000036:   91800062    LDS       R24,0x0062     Load direct from data space
+00000038:   1728        CP        R18,R24        Compare
+00000039:   F408        BRCC      PC+0x02        Branch if carry cleared
+0000003A:   5F9E        SUBI      R25,0xFE       Subtract immediate
67:          if (prac_cnt < pwm[2]) i += 4;
+0000003B:   91800063    LDS       R24,0x0063     Load direct from data space
+0000003D:   1728        CP        R18,R24        Compare
+0000003E:   F408        BRCC      PC+0x02        Branch if carry cleared
+0000003F:   5F9C        SUBI      R25,0xFC       Subtract immediate
68:          if (prac_cnt < pwm[3]) i += 8;
+00000040:   91800064    LDS       R24,0x0064     Load direct from data space
+00000042:   1728        CP        R18,R24        Compare
+00000043:   F408        BRCC      PC+0x02        Branch if carry cleared
+00000044:   5F98        SUBI      R25,0xF8       Subtract immediate
69:       	PORTB = i;
+00000045:   BB98        OUT       0x18,R25       Out to I/O location
73:       }
+00000046:   9508        RET                      Subroutine return

cas sa skratina 2.85us a kod sa skrati na 27 instrukcii

Ono je to moc pekny,psat v Cecku, ale co ta cena za kompiler … :frowning: Nekradu SW.

Mohl by někdo to co psal Martin přeložit pro PIC16F887? Jen bych chtěl něco porovnat, mám udělanej 3x PWM na řízení otáček v PC podle teploty na různých místech a nastavení 3x PWM mi trvá 23us při 8Mhz a nezdá se mi moc reálné, že by to v C mělo být rychlejší. Neberu krystal, že je skoro jednou tak rychlejší.

Ani ja.

Preto pouzivam GCC pre AVR (v ramci balika Winavr) ktore je uplne zadarmo bez ziadnych obmedzeni. GCC je vyuzitelne okrem AVR aj pre ARM7, Cortex, PC-Win, PC-Linux, …

vrele doporucujem.