- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 12

Thema: Analog Comparator (Assembler): wo ist der Fehler?

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #9
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Vielleicht bekommst du aus folgendem Code ne Anregung. Ist zwar C (AT90S2313), sollte aber zu verstehen sein. Ich hatte den AC nicht direkt benutzt um eine IRQ auszulösen, sondern zur Zeitmessung via InputCapture von Timer1 (Kapazitätsmessung).
    Für deinen Fall einfach den AC-IRQ aktivieren und die gewünschte Flanke einstellen, sollte dann gehen.

    Code:
    #include "use.h" 
    #include <AVR.h>
    #include "ports.h"
    #include "capacity.h"
    //#include "morse.h"
    
    extern void ioinit(); 
    extern void wait_10ms (const byte);
    
    #include <math.h>
    // Multiplikator:
    // k = (ny * R * ln 2)^{-1}
    // mit ny = 8MHz und R = 10k:
    
    // k = 18pF / Einheit
    
    word measure_time (byte loadTime)
    {
    	// Load capacity via AIN+ push-pull
    	SET (PORT_AIN_POS); MAKE_OUT (PORT_AIN_POS);
    	wait_10ms (loadTime);
    
    // disable all interrupts
    	cli();
    	
    	// stop timer1
    	TCCR1B = 0;
    	
    	// enable AC (ACD = 0)
    	// AC Input Capture on -> connect to Input Capture of Timer/Counter1
    	// AC Interrupt on Falling Output Edge
    	ACSR = _BV(ACIC) | _BV (ACIS1);
    	
    	// disconnect timer1 from output pin OC, no PWM
    	TCCR1A = 0;
    	
    	// reset timer1 to 0
    	TCNT1 = 0;
    	
    	// clear Timer1 OVerflow and Input Capture Flag
    	TIFR |= _BV (TOV1) | _BV (ICF1);
    	
    	// start timer 1 at full speed
    	// no clear on compare match
    	// no noise cancel
    	// input capture edge = falling
    	TCCR1B = _BV (CS10);
    
    	// here we go! 
    	// start discharging via external resistor
    	// AIN+ to high Z
    	MAKE_IN (PORT_AIN_POS); CLR (PORT_AIN_POS); 
    	
    	byte flag;
    	
    	do
    	{
    		flag = TIFR & (_BV (TOV1) | _BV (ICF1));
    	} while (flag == 0);
    	
    	if (flag & _BV (TOV1))
    		return 0xffff;
    		
    //	if (flag & _BV (ICF1))
    	return (word) ICR1;
    	
    	// restore status of machine
    //	ioinit();
    	
    //		morse (_O_);
    //	if (flag & _BV (ICF1))
    		
    //		morse_dec (capture-4);
    //		morse (_FRAGE_);
    }
    -------------------------------------------------------

    Als Temperaturdifferenzschaltung hatte ich mal die Schaltung unten gebastelt. Mit µC schien mit da mit Spatzen auf Kanonen geschossen, ausserdem lässt sich eine µC-Schaltung nicht so simpel über Potis nachtrimmen.
    • Komparator D schaltet, wenn T_innen > T_aussen ist.
    • Komparator A schaltet, wenn T_aussen > T_const (zB T_const über Frostgrenze).
    • Komparator B funktioniert als Und-Glied
    • danach ein Zeitglied und Komparator C als Schmitt-Trigger

    Die T-Abhängigen Widerstände sind NTCs.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken tempdiff.png  
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress