Uspávání KM driveru vs. dynamika

jaké jsou rozdíly z pohledu řízení
Uživatelský avatar
Thomeeque
Příspěvky: 8870
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

21. 3. 2014, 10:26

Já se projdu asi po o: http://www.ges.cz/cz/74hc123-GES05000311.html" onclick="window.open(this.href);return false; (už jsem ukecal kolegy vyrazit do vietnamské restaurace poblíž, ani to nedalo moc práce :)) Případně raději http://www.ges.cz/cz/74hct123-GES05000396.html" onclick="window.open(this.href);return false; ? :)
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Mex
Příspěvky: 10288
Registrován: 6. 2. 2014, 10:29

21. 3. 2014, 11:00

ledvinap píše:Jeste jednou pripomenu, ze kondenzator se vybiji jen v prubehu STEP pulzu a v EMC je delka pulzu konstantni nezavisle na frekvenci. Takze pokud je cas potrebny na vybiti kondenzatoru delsi nez delka step pulzu, tak se proud zvysi az v kroku, ktery dostatecne vybije kondenzator. Nezavisle na rychlosti.
Touché!
Jasně, máš pravdu.
Uživatelský avatar
CZ_Pascal
Příspěvky: 870
Registrován: 14. 1. 2008, 8:24
Bydliště: Brno

21. 3. 2014, 6:54

Thomeeque píše: .....
PS: Mikrokontroler mi tu přijde trochu overkill, navíc klopák by měl být rychlejší (čímž neřikám, že by 20MHz uC byl na tento účel pomalej), přesto díky za tip.
Chlapi já se vám divím... vy asi fakt nevíte co s časem :shock:

Použít elegantně jedinej šváb za pár kaček bez jakýhokoliv bastlení místo kondíků a diod a klopáků a buhvíjakýho smetí kolem aby to možná udělalo aspoň přibližně na desátý pokus to co ten uC naprosto spolehlivě a jednoduše nezávisle na délce řídícího pulzu s možností SW odfiltrování případných zákmitů na vstupu atd...

No jak říkám.... chtěl bych mít opět čas si hrát s blbostma :oops:
Uživatelský avatar
Thomeeque
Příspěvky: 8870
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

21. 3. 2014, 7:31

Tak 74HC123 už mi na nepájivym poli hezky klopí, jak je třeba, teď to ještě nějak vbastlit místo původního řešení, jde se na to..

@CZ_Pascal: Njn, jsme tu děsný zabedněnci.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Mex
Příspěvky: 10288
Registrován: 6. 2. 2014, 10:29

21. 3. 2014, 8:13

To CZ_Pascal:
No, praxe říká, že je dobré použít programovatelný chip jen tehdy, když to skutečně přinese nějakou značnou výhodu, aby to kompenzovalo nevýhody.
Hlavní nevýhoda je v tom, že je to obtížněji opravitelné a udržovatelné (většinou to dokáže opravit jen autor, nebo někdo, kdo má k dispozici dobrou dokumentaci).
Výhodou samozřejmě je, pokud to přinese nějakou lepší funkčnost a zjednoduší konstrukci.
Ale zrovna zde by se nahradil jeden triviální chip jiným jedním (programovatelným) chipem. Funkčnost by byla stejná, obvodová složitost taky, cena vyšší, pracnost návrhu vyšší a opravitelnost horší. Teda aspoň podle mě. A to jednochipy miluju.

Pokud někdo dostane do ruky na opravu nějaké neznámé zařízení, a je na něm evidentně vadný nějaký běžný chip 74xx, tak to človek při odpolední kávě hladce opraví a ještě se u toho může šťourat v nose. Když je tam ale oddělaný nějaký procesor, tak to většinou ani nestojí zato dál zkoumat, většinou je to předem zabité.
Uživatelský avatar
Thomeeque
Příspěvky: 8870
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

21. 3. 2014, 11:29

Tak jsem zbastlil takový divoký adaptér (fotky zde), který jsem zatím pokusně nastrkal do patice původní 7414 a zdá se, že problém je vyřešen, akceleruje to stejně ze spánku jako z plného proudu. Zkusil jsem v linuxCNC nastavit všechny Driver Timming hodnoty na 200ns (což je oproti nabízeným presetům hodně málo) a bez problémů. Testoval jsem to zatím jen krátce, další testy udělám, až to tam zapojím pořádně.

T.
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Uživatelský avatar
CZ_Pascal
Příspěvky: 870
Registrován: 14. 1. 2008, 8:24
Bydliště: Brno

22. 3. 2014, 6:53

Mex píše:To CZ_Pascal:
No, praxe říká, že je dobré použít programovatelný chip jen tehdy, když to skutečně přinese nějakou značnou výhodu, aby to kompenzovalo nevýhody.
Ano Přesně tak. Naprosto brutálně se zjednoduší zapojení na jeden jediný osminožičkový šváb !
Mex píše: Hlavní nevýhoda je v tom, že je to obtížněji opravitelné a udržovatelné (většinou to dokáže opravit jen autor, nebo někdo, kdo má k dispozici dobrou dokumentaci).
Ano přesně tak. Ten šváb je naprogramovaný během chviličky a pokud náhodou nevyhovuje timing tak se jen jednoduče upraví nějaká konstanta v programu.
Autorem je Thomeque takže přesně ví jak so to opravit. Určitě to půjde snáze jak klubko zapájených drátů s diskrétními součástkami kde s žádným časováním pokud to nevyjde už nehne a všechno zahazuje a bastlí další hnízdi.
Mex píše: Výhodou samozřejmě je, pokud to přinese nějakou lepší funkčnost a zjednoduší konstrukci.
Ano přesně tak... viz výše.
Mex píše: Ale zrovna zde by se nahradil jeden triviální chip jiným jedním (programovatelným) chipem. Funkčnost by byla stejná, obvodová složitost taky, cena vyšší, pracnost návrhu vyšší a opravitelnost horší. Teda aspoň podle mě. A to jednochipy miluju.
Ano přesně tak. Použil by se pouze jeden triviální mikročip místo klubka smetí nalepeného nabastleného kolem klopáku.

Mex píše: Pokud někdo dostane do ruky na opravu nějaké neznámé zařízení, a je na něm evidentně vadný nějaký běžný chip 74xx, tak to človek při odpolední kávě hladce opraví a ještě se u toho může šťourat v nose. Když je tam ale oddělaný nějaký procesor, tak to většinou ani nestojí zato dál zkoumat, většinou je to předem zabité.
Předpokládal jsem že Thomeque nezahájil seriovou výrobu s prodejem zařízení kterému by musel nabízet záruku a servis a stejně tak kde by opravdu zvítězila minimální cena nad elegancí jednočipu

Takže jsem rád že jsme se tak pěkně ve všech bodech shodli :twisted:

A jinak samozřejmě přeji ať to Thomeeque funguje ať už zvolil jakékoliv řešení.
Uživatelský avatar
Thomeeque
Příspěvky: 8870
Registrován: 30. 1. 2012, 10:20
Bydliště: Mimo ČR

25. 3. 2014, 10:27

Tak už chvíli jezdím a řešení se zdá se osvědčilo, mohu doporučit, přesné zapojení pro jednu osu vypadá takto:
sleep_detektor_parexelans.gif
sleep_detektor_parexelans.gif (6.07 KiB) Zobrazeno 10427 x
S daným RC (použil jsem původní) to usíná za cca 0.5s. Okrajové stavy (zapnutí, vypnutí) jsem neošetřoval, IMHO je to zbytečné.

T.

@CZ_Pascal: dík za přání. Jestli máš chviličku, napiš nám sem prográmek pro ATtiny13 - dva nezávislé kanály (osy), garantovaná rychlost probouzení řádově v µs (na přesnosti usínacího intervalu nezáleží), stačí základní funkce alá klopák, ale včetně všech konfiguračních záležitostí (konfigurace vstupů, výstupů atp.).
mimooborová naplavenina • kolowratský zázrak™ • NPS • GCU • HirthCalc • ncDP.ino
Uživatelský avatar
Hades
Příspěvky: 1206
Registrován: 11. 10. 2012, 10:59
Bydliště: Praha; Mimoň

26. 3. 2014, 6:26

geniálně jednoduché, jednoduše geniální, bejt tu tleskací smajlík, tak ti jich sem dám celou řádku...
oscar
Příspěvky: 1190
Registrován: 2. 5. 2010, 8:50
Bydliště: Perníkovice

26. 3. 2014, 8:44

Thomeeque píše: @CZ_Pascal: dík za přání. Jestli máš chviličku, napiš nám sem prográmek pro ATtiny13 - dva nezávislé kanály (osy), garantovaná rychlost probouzení řádově v µs (na přesnosti usínacího intervalu nezáleží), stačí základní funkce alá klopák, ale včetně všech konfiguračních záležitostí (konfigurace vstupů, výstupů atp.).
Predesilam pro rypaly ze neovladam Ccko a neovladam jednocipy. Ale rychly nacrt vyzkouseny v simulatoru:

Kód: Vybrat vše

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

char firstCounter = 0;
char secondCounter = 0;

char oldState = 0;
char setState = 0;

ISR(PCINT0_vect)        // interrupt service routine
{              // called when PCINT0 changes state
	setState = oldState ^ (PINB & 0x06); // change detection

   PORTB = (PORTB & ~(setState << 2));   
	oldState = PINB & 0x06;
	if (setState == 0x02)
		firstCounter = 0;
	if (setState == 0x04)
		secondCounter = 0;

   return;
}

void SystemInit(void)
{
   DDRB = 0b00011001;     // portb bits 0,3,4 output; 1,2 in

   PCMSK |= (1<<PCINT1);   // pin change mask: listen to portb bit 1
   PCMSK |= (1<<PCINT2);   // pin change mask: listen to portb bit 2
   GIMSK |= (1<<PCIE);   // enable PCINT interrupt

   sei();         // enable all interrupts
}

int main(void)
{
   oldState = PORTB & 0x06;
   SystemInit();

   while(1)
   {
		
		if (firstCounter == 5)
		{
			PORTB = (PORTB | 0x08); //sleep PB3
			firstCounter++; 
		}
		else
			if (firstCounter < 5)
				firstCounter++; 
			
		if (secondCounter == 5)
		{
				PORTB = (PORTB | 0x10); //sleep PB4
				secondCounter++;
		}
			else
		if (secondCounter < 5)
				secondCounter++;
		_delay_ms(10); 		
   }
} 


ta kriticka cast vypada prelozena takto:

Kód: Vybrat vše

ISR(PCINT0_vect)        // interrupt service routine
{              // called when PCINT0 changes state
  32:	1f 92       	push	r1
  34:	0f 92       	push	r0
  36:	0f b6       	in	r0, 0x3f	; 63
  38:	0f 92       	push	r0
  3a:	11 24       	eor	r1, r1
  3c:	2f 93       	push	r18
  3e:	8f 93       	push	r24
  40:	9f 93       	push	r25
	setState = oldState ^ (PINB & 0x06); // change detection
  42:	86 b3       	in	r24, 0x16	; 22
  44:	86 70       	andi	r24, 0x06	; 6
  46:	90 91 62 00 	lds	r25, 0x0062
  4a:	89 27       	eor	r24, r25
  4c:	80 93 63 00 	sts	0x0063, r24

   PORTB = (PORTB & ~(setState << 2));   
  50:	28 b3       	in	r18, 0x18	; 24
  52:	98 2f       	mov	r25, r24
  54:	99 0f       	add	r25, r25
  56:	99 0f       	add	r25, r25
  58:	90 95       	com	r25
  5a:	92 23       	and	r25, r18
  5c:	98 bb       	out	0x18, r25	; 24
pravdepodobne by se to do tech "radove us" dalo stihnout (nechce se mi hledat jak dlouhe jsou instrukce). jinak optimalizovat v asm.
Uživatelský avatar
CZ_Pascal
Příspěvky: 870
Registrován: 14. 1. 2008, 8:24
Bydliště: Brno

26. 3. 2014, 9:10

... Mno v assembleru pokud nemusim nedelam, ale baj voko by to mohlo vypadat takhle :

Kód: Vybrat vše


.include "tn13def.inc"

; definice registrovych promnenych
#define	INT_Sreg r1

#define	WReg r16
#define Timer_Reg r17
#define TMR_Flag r18
#define CNT1 r19
#define CNT2 r20


//Vystup SLEEP 1
#define SL1_ON	cbi PORTB, 0
#define SL1_OF	sbi PORTB, 0

//Vystup SLEEP 2
#define SL2_ON	cbi PORTB, 1
#define SL2_OF	sbi PORTB, 1



.CSEG
.ORG 0x0000

	rjmp RESET_H ; Reset Handler
	rjmp BAD_INT ; IRQ0 Handler
	rjmp PCINT0_H ; PCINT0 Handler
	rjmp TIM0_OVF_H ; Timer0 Overflow Handler
	rjmp BAD_INT ; EEPROM Ready Handler
	rjmp BAD_INT ; Analog Comparator Handler
	rjmp BAD_INT ; Timer0 CompareA Handler
	rjmp BAD_INT ; Timer0 CompareB Handler
	rjmp BAD_INT ; Watchdog Interrupt Handler
	rjmp BAD_INT ; ADC Conversion Handler
;
.ORG 0x000A
RESET_H:	
	ldi r16, low(RAMEND); Main program start
	out SPL,r16 ; Set Stack Pointer to top of RAM
	sei ; Enable interrupts
	rjmp FirstInit

PCINT0_H:	; PCINT0 Handlerr			// preruseni pro STEP (zmnena na pinu)
	in	INT_Sreg, SREG					; uschovat status registr
	sbic PINB, PB2						; Vstup pro SLEEP 1
	SL1_OF								; pokud je PB2 = 1 tak vypnu rezim spanku
	sbic PINB, PB3						; Vstup pro SLEEP 1
	SL2_OF								; pokud je PB3 = 1 tak vypnu rezim spanku
	sbic PINB, PB2
	clr CNT1							; pokud je PB2 = 1 tak vynuluji odpocet 1
	sbic PINB, PB3
	clr CNT2							; pokud je PB2 = 1 tak vynuluji odpocet 2
	out	SREG, INT_Sreg					; obnovim status registr
reti


TIM0_OVF_H: ; Timer0 Overflow Handler
	in	INT_Sreg, SREG					; uschovat status registr
	sts	TCNT0, Timer_Reg				; nastavim casovac pro 100Hz
	ldi TMR_Flag, 0b00000001			; nastavim priznak 100Hz ticku
	out	SREG, INT_Sreg					; obnovim status registr
reti

BAD_INT:	// osetreni neocekavanych preruseni

reti

FirstInit:
	clr r0
	ldi WReg, 0b00000011		; PB3 a PB2 vstup  PB1 a PB0 vystup
	out	DDRB, WReg
	out PORTB, r0

	ldi Timer_Reg, 0xA3			; 100Hz Timer pro Prescaller 1/1024 a 9.6 MHz
	ldi WReg, 0b00000101		; Prescaler 1/1024
	sts	TCCR0B, WReg
	ldi WReg, 0b00000010		; preruseni pro preteceni casovace
	sts	TIMSK0

	ldi	WReg, 0b00001100		; preruseni PCINT0 pri zmnene pinu PB2 nebo PB3
	sts PCMSK, WReg
	ldi WReg, 0b00100000		; povoleni preruseni od PCINT5..0
	sts	GIMSK, WReg

	sei							; povoleni preruseni

Main:
	cpi TMR_Flag, 0b00000001	; nastal 100Hz Tick ?
	brne Main					; pokud ne tak cekam dal:
	clr TMR_Flag				; zrusim priznak 100Hz Ticku
	cpi CNT1, 50				; je counter na 50 ? (tedy napocital 0.5 sekundy)
	brne A						; pokud neni tak A:
	SL1_ON						; counter odpocital 0.5 sekundy tak nahodim rezim spanku
	rjmp Next					; jdu skontrolovat dalsi counter
A:
	inc CNT1					; pricitam dalsi setinu sekundy pro CNT1
Next:
	cpi CNT2, 50				; je counter na 50 ? (tedy napocital 0.5 sekundy)
	brne B						; pokud neni tak B:
	SL2_ON						; counter odpocital 0.5 sekundy tak nahodim rezim spanku
	rjmp Main					; Hotovo
B:
	inc CNT2					; pricitam dalsi setinu sekundy pro CNT2
	

	rjmp Main
Ča pro spánek nastavitelnej pro oba porty nezávisle v setinách sekundy (maximálne 2.5 sekundy)

Zhruba třetí a pátá instrukce od začátku přerušení je nastavení pinu pro SLEEP režim. Přerušení obvykle naběhne do 4 cyklů
sakumprásk by mohla bát reakce těsně pod 1uS
Program jsem netestoval - zas tolik času na něco co nepotřebuji nemám :(
Mex
Příspěvky: 10288
Registrován: 6. 2. 2014, 10:29

26. 3. 2014, 10:37

CZ_Pascal píše:... Mno v assembleru pokud nemusim nedelam, ale baj voko by to mohlo vypadat takhle :
Jojo, to je fakt mnohem výhodnější, než použít chip za 5 Kč v katalogovém zapojení ... ;-)
A když už tam přece jen nacpat ten jednochip, tak by to chtělo využít i to druhé přerušení (INT0), po IRQ nedělat žádné schovávání statusu a testy, ale okamžitě vysypat na výstupní pin aktivní úroveň. Pak by se ta reakce na vstup mohla dát udělat docela rychlá (i když stále řádově pomalejší, než u obyčejného MKO).
Skutečně ne vždy je vyžití jednochipu výhoda.
Uživatelský avatar
CZ_Pascal
Příspěvky: 870
Registrován: 14. 1. 2008, 8:24
Bydliště: Brno

27. 3. 2014, 6:08

Mex píše: Jojo, to je fakt mnohem výhodnější, než použít chip za 5 Kč v katalogovém zapojení ... ;-)
A když už tam přece jen nacpat ten jednochip, tak by to chtělo využít i to druhé přerušení (INT0), po IRQ nedělat žádné schovávání statusu a testy, ale okamžitě vysypat na výstupní pin aktivní úroveň. Pak by se ta reakce na vstup mohla dát udělat docela rychlá (i když stále řádově pomalejší, než u obyčejného MKO).
Skutečně ne vždy je vyžití jednochipu výhoda.
Ty asi stále nechápeš rozdíl mezi vývojem nového zařízení, kde samozřejmě mohu zapojovat jak chci a samozřejmě se rozhodnu pro 5-ti korunove reseni, nebo situaci kdy uz mam neco hotove a potrebuji do toho elegantne bez klubka dratu a smetí kolem švába za 5 kc zapojit nejakou funkcionalitu a jeste si vybrat na kterem pinu budu mit vstupy a na kterem vystupy.

Podle tebe ten jeho driver má asi nejaky brutalni akcelerace ze mu je 1us na probuzení málo :lol:

Priklad (neodladeny) jsem daval pouze proto ze o to Thomeque pozadal, jinak mi to muze byt sumafuk jak si co kdo zapojuje...
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22371
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

27. 3. 2014, 6:15

taky bych sel do neceho programovatelnyho paklize to zrovna nemaji byt serie

onehda jsem delal neco z klopaku a jen jedna mala drobnost a cele to bylo naprd a neslo to moc resit a cpu to resil zcela elegantne
ono staci mizerna dokumentace nebo jeji mizerne cteni a pak jsi rad ze jsi schopny ledasco resit softwarove

jo a jen tak bokem by se jeste dalo tim procakem resit i nejaky ty sekvence napajeni a podobny veci co tam byvaji jak se tu onehda resilo
Vsechna prava na chyby vyhrazena (E)
PBr
Příspěvky: 941
Registrován: 16. 6. 2007, 8:21
Bydliště: Slovensky Grob
Kontaktovat uživatele:

10. 4. 2014, 12:00

Este by ma celkom zaujimalo ako to v reale bude fungovat - teda je fajn, ze ten monostabil, ci procak zareaguje superrychlo, ale ako rychlo sa to prejavi v silovej casti?
Nejaka ta milisekunda by sa mohla ziskat tym, ze dajme tomu ten monostabil by mohol reagovat na nastupnu hranu step ale vlastny krok by sa spravil az na zostupnej hrane.
Toz len uvaha...
Odpovědět

Zpět na „krokove unipolarni bipolarni a servomotory“