Stavy spínačov.
Moderátor: Moderátoři
Keď je tam 0V nemôže sa prepísať obsah druhého registre. napríklad pri natĺkaní závažia.
Vidím to na tri dosky:
-ENCODER s registrom VPRED/VZAD
do ENCODERA by som zapojil ešte jeden obvod 74HC14 a obvod 74HC08 zamenil za 74HC00. Nakreslím to...
-2x doska 11ks HC138 + 9x HC574 + HC74
prvá doska - encoder + 2x hc139+11x hc138
druhá doska - 4x hc74 + 18x hc574.
Led "umiestnené" na doske s encoderom by ukazovali aktuálnu polohu kolesa. a doska s HC574 by ukazovala polohu nevyvážku na pravoboku a lavoboku. Usporiadané by to bolo asi takto:
Tri stĺpce led, pričom stredný by ukazoval aktuálnu polohu, pravý by ukazoval umiestnenie závažia na pravobok a ľavý na ľavobok.
Hmm... 11 ks HC138 sa ušetrí, Ok.
Ale tá druhá doska bude mať 220 drôtov. Ako som to nakreslil, z display dosky ide z jednej 150, len 80.
Nakreslil so ti inak, Ten encoder som doplnil na vstupoch 3x rovnaké vstupy (optočlevy), preto je použitý ďalší invertor 74HC04, a keďže signál riadiaci hodimy 74HC74 ide mimo dosky na dispay dosku musí sa oddeliť dvomi invertormi, aby to neblblo.
- Přílohy
-
Kombi_72LED__G.png- (174.04 KiB) Staženo 55 x
Spoločný odpor lediek 1...72 sa nepripojí na 5V ale na spínací tranzistor.
Spoločný odpor lediek 101...172 sa nepripojí na 5V ale na iný spínací tranzistor.
Cez vstupy 1 sa budú registre 74HC574 striedavo pripájať jednotlivé rady a s ními aj príslušné napájanie cez spomenuté spínacie tranzistory.
Pridám schému...ochvíľu.
18ks HC574
2ks HC74
1ks HC14
2ks PNP BCxxx
- Přílohy
-
MUX_LED.PNG- (35.96 KiB) Staženo 52 x
Netusim jak je to mechanicky provedene, jak daleko draty povedou apod. ale nez tohle asi bych oprasil puvodni myslenku se spinaci a nasadil dokola nejake levne optozavory jako napr tyto za necele 3,-Kc/ks http://www.ebay.com/itm/100PCS-TCRT5000 ... 2ec9223534 a spinal jimi primo led. Kabel muzes pouzit taky treba ploche "ksandy" co se davala k IDE HDD apod.
Pripadne bych to videl jako impulz naucit se pracovat s nejakym MCU, neni to zas tak slozite. Pak by se cela vec skladala vicemene ze 1ks snimace, 1ks MCU a 72ks ledek zapojenych do matice.
Tých lediek tam bude 216, ani s MCU ich neobslúžiš bez 432 vodičov.
Niektoré časti by s MCU boli oveľa jednoduchšie, žiaľ staviteľ nie je MCU priklonený.
Rýchly nástrel MCU
Matica 8x8 na výstup lediek, to sú dva 8bitové porty.
3 bity z encodéra, dva bity z merača nevyváženosti, ešte 3 bity zostávajú do využitia troch 8bit portov.
Matica vy mohla fungovať v režime 1:4.
Ešte by to zvládlo 4-5 sedem-segmetoviek a nejaké indikácie.
Treba povedať, že zobrazovanie aktuálnel polohy a polohy nevyváženosti je to najjednoduchšie čo by mohla MCU robiť. Nakoniec by sa dostalo aj k monštru MCU (aspoň32 biťák s 500MB RAM 500MB HDD, s full HD 40" minitorom). K tomu 10 ajťákov a dvaja strojný inžiniery, ktorým ani po dvoch rokoch to nebude poriadne fungovať.
O 32biťaku hovorím v súvislosti so zjednodušením HW. Zopár senzorov, grafický monitor. Meranie a vyhodnocovanie uhlov pod 1°. K tomu už je len na krok databáza ráfikov, výpočet hmotnosti závaží...adď.
Akuráť, že sw si treba napísať, ...a tam už treba byť expert aj na mechaniku, prípadne napísať samoučiaci sa program.
Ani do toho by investor nechcel ísť
Kód: Vybrat vše
//
// main.c
// program snima signal A, B enkoderu a rozsvicuje ledky
// signal A je pripojen na int0;
//
// neodzkouseno !
#define input_a (PD0)
#define input_b (PD1)
#define ENCODER_TOTAL (72)
const uint16_t c1z16 = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
const uint8_t c1z8 = {1,2,4,8,16,32,64,128};
uint8_t poloha;
uint16_t temp;
uint8_t column, row;
main()
{
poloha = 0;
init_portd();
init_portf();
init_portk();
init_portl();
init_interrupt();
while(1)
{
}
}
ISR(INT0)
{
if (bit_is_set(PINB, input_b))
{
poloha++;
if (poloha>(ENCODER_TOTAL-1))
{
poloha=0;
}
}
else
{
poloha--;
if (poloha>(ENCODER_TOTAL-1))
{
poloha=(ENCODER_TOTAL-1);
}
}
// vypocet radku a sloupce binarne
column= 0x07 & poloha; // roste rychle
row = poloha>>3; // roste pomaleji
// zobrazeni v matici (16x8 ledek)
//
// PORTF, roste rychle, COLUMN, aktivni v nule
// PORTK, roste pomaleji, ROW_L
// PORTL, roste nejpomaleji, ROW_H
// zobrazeni v matici (16x8 ledek)
// zhasnout vse
PORTF = ~0; // katoda sviti v nule, katody proto negujeme
PORTK = 0;
PORTL = 0;
// rozsvitit
temp = c1z16[row];
PORTK = (uint8_t) temp; // roste pomaleji, ROW_L
PORTL = (uint8_t) temp >>8; // PORTL, roste nejpomaleji, ROW_H
PORTF = ~ c1z8[column]; // PORTF, roste rychle,
// katoda sviti v nule, katody proto negujeme
}
- Přílohy
-
130106_72led.png- (5.73 KiB) Staženo 37 x
-encoder takýmto spôsobom indikuje polohu na dvoch rôznych miestach pri točení vpred a vzad. Taká chyba je pre encoder "smrtelná".
Musí sa INT generovať na "rising edge" a rovnako aj na "falling edge" v tom istom mechnickom mieste , nezávisle od smeru otáčania. A zároveň sa to musí poznať o ktorý prípad ide. V jednom sa inkrementuje, v druhom dekrementuje, a v ďalších dvoch sa počítadlo polohy nemení.
