Steuerung für Heizungsunterstützung mit PV

Begonnen von ^Cobra, 11.03.2025, 18:07:33 CET

Vorheriges Thema - Nächstes Thema

^Cobra

Moin Männers,
ich habe das gute Wetter in den letzten Tagen genutzt, über 5t Erde in eine Mulde geschüppt und 3 Kabel von meiner Hütte ins Haus gezogen und angeschlossen.
Eins dieser Kabel dienen dazu den erzeugten Strom von der PV Anlage die auf dem Dach der Hütte ist in ein Heizstab der Heizung zu pumpen.
Ein anderes liefert von der Heizung das "OK" fürs reinpumpen. Beides getestet, soweit alles funktiontüchtig.
(das dritte ist nur Ethernet, das alte wurde als Zugseil genutzt :D )

Derzeit schalte ich manuell die Heizung ein und eine provisorische LED zeigt mir das OK der Heizung.

Nun soll dafür eine Steurung her.
Mein gedanke (bis jetzt):
-akku Spannung (der PV) messen >= 27 V (24V System, bei 27V ist der Akku sogut wie voll und zumindest bisschen Sonnenenergie gibts auch)
-Rückmeldung der Heizung auf OK abfragen
-Heizung einschalten
-akku Spannung <=22V (bei 20V macht der Wechselrichter dicht)
-Heizung abschalten
-2h warten ( akku kann nicht ehr wieder voll sein)
-es geht von vorne los
-Watchdog soll genutzt werden

Die Frage die ich mir stelle:
-Versorgung der Schaltung? Z Diode, Spannungsregler... Durch das messen der Akku spannung muss die Versorungsspannung schon recht stabil sein, bis auf ein Transistor welches das Schütz schalten soll für die Heizung wird es kaum große verbraucher geben.
-Sollte ein LCD, 7 Segment oder einfach paar Status LEDs eingeplant werden? Was würdet ihr (und warum) tun? Hat alles seinen gewissen Reiz :D

Freue mich auf eure gedanken

Cobra

picass

#1
Fünf Tonnen Erde geschüppt...? Aha, dann machst du jetzt für eine Weile erstmal in "habe Rücken" ! Mal ehrlich: kann ich mir im Moment nicht wirklich vorstellen. Bist du so'n Herkulestyp und zudem Vorturner in Buddy-Bilding-Studios?

Stromversorgungen mache ich seit vielen Jahren nur noch mit solch kleinen IC-Festspannungs-Reglern. Wobei ich jede Form von sich im Betrieb ändernden Lastströmen - wozu schon mehrere LEDs zählen - outsurce, indem ich deren positiven Versorgunsanschluss direkt an die Energiequelle anschließe, also nicht aus dem IC-Kreis heraus. Muss sicher nicht betont werden, aber Spannungsspitzen des Schaltschützes sollte im µC-Kreis nicht mehr ankommen.

Die Anzeige? Ganz einfach ganz einfach halten. Mit einigen wenigen LEDs starten und erst mal den Gesamtbetrieb sicher stellen. Wenn danach das Fell juckt, kann auf LCD-Anzeige aufgewertet werden.
Na dann mal auf weiteren Klimawandel und viel Sonnenschein.
Grüße, picass

^Cobra

Nabend Picass,

Bin alles andere als ein Herculestyp :P
Aber wenn man ein Haus baut und nicht so viel Geld hat muss man anpacken. Will nicht wissen wie viel Beton ich mit der Schubkarre bewegt habe... 
Habe vorsichtshalber auf die Rechnung geschaut,es waren 6,25 Tonnen. 2 Abende und ein Samstag. Und ja, danach habe ich es gemerkt ;)

Zurück zum Thema:
Witzigerweise hatte ich ebenfalls beide Überlegungen. IC für Spannungsversorgung sowie erstmal nur mit LEDs paar Status Anzeigen.


^Cobra

Moin Männers!

Ich habe nun mal "auf die schnelle" ein Programmteil geschrieben, im simulator siehts gut aus.

Heute also fix eine Lochrasterplatine zusammen gezimmert und - geht nicht.
Der Analogwandler will einfach nicht.
Ich finde einfach den Grund dafür nicht. Hoffe da auf eure Tipps.

der Pic ist ein 16F690. Leider unterstützt dein kein direktes debuggen. Zumindest sagt das mein mplab.
Es wird der interne Takt benutzt.

für den Analogteil wären denke das die wichtiges Code ausschnitte:
     Banksel TRISC
    clrf TRISC     ;Port C Ausgänge
    movlw B'00110000'
    movwf ADCON1
   banksel WPUB
    movwf WPUB
    movlw b'00001111' ;RA0-RA2 u RA4 Analog, RC0-RC3 Digital
    movwf ANSEL

;Akuuspannung messen
    movlw b'00000001' ; A/D wandler einschalten, AN= aktiv, VDD als Vref, messung starten
    movwf ADCON0
    movlw d'50'
    CALL WaitX	;50ms warten
    BSF ADCON0,GO ;Start conversion
    BTFSC ADCON0,GO ;Is conversion done?
    GOTO $-1 ;No, test again
    movfw ADRESH    ; Akku Spannung messen 
    movwf Temp0	;

der Teil mit dem Englischen Kommentar war der letzte einfall (von der Doku), leider auch das ohne erfolg.
In der Simulation kann ich eine Spannung an dem pin AN0 anlegen und diese wird auch gemessen.
Verstehe einfach nicht was hier nun fehlt.

Der Gesamt Code wäre hier:
; Example of using GPR Uninitialized Data
;
GPR_VAR        UDATA
Temp0         RES        1      ; User variable linker places
Temp1         RES        1      ; User variable linker places
Temp2         RES        1      ; User variable linker places
PV_State      RES	 1	; Status Register von der PC Steuerung 
	 ;
;   ; Example of using Access Uninitialized Data Section (when available)
;   ; The variables for the context saving in the device datasheet may need
;   ; memory reserved here.
;   INT_VAR        UDATA_ACS
;   W_TEMP         RES        1      ; w register for context saving (ACCESS)
;   STATUS_TEMP    RES        1      ; status used for context saving
;   BSR_TEMP       RES        1      ; bank select used for ISR context saving
;
;*******************************************************************************

; TODO PLACE VARIABLE DEFINITIONS GO HERE

;*******************************************************************************
; Reset Vector
;*******************************************************************************

RES_VECT  CODE    0x0000            ; processor reset vector
    GOTO    START                   ; go to beginning of program

;*******************************************************************************
; TODO Step #4 - Interrupt Service Routines
;
; There are a few different ways to structure interrupt routines in the 8
; bit device families.  On PIC18's the high priority and low priority
; interrupts are located at 0x0008 and 0x0018, respectively.  On PIC16's and
; lower the interrupt is at 0x0004.  Between device families there is subtle
; variation in the both the hardware supporting the ISR (for restoring
; interrupt context) as well as the software used to restore the context
; (without corrupting the STATUS bits).
;
; General formats are shown below in relocatible format.
;
;------------------------------PIC16's and below--------------------------------
;
ISR       CODE    0x0004           ; interrupt vector location
;
;     <Search the device datasheet for 'context' and copy interrupt
;     context saving code here.  Older devices need context saving code,
;     but newer devices like the 16F#### don't need context saving code.>
;
;     RETFIE
;
; TODO INSERT ISR HERE


;*******************************************************************************
; MAIN PROGRAM
;*******************************************************************************

       #include GeneralConfigs.inc
; CONFIG
; __config 0x3FCC
 __CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF
 
 
#Define StatusLED   PORTC,0
#Define Relais	    PORTC,1
#Define ErrorLED    PORTC,2
#Define AkkuVolt    PORTA,0 ;BereitMeldung PV Akku und Heizung bereit zum zuheizen
#Define Temperatur1 PORTA,1 
#Define EIN_Taster  PORTB,4
#Define AkkuVoltOK  PV_State,0 ;Akku ist so gut wie voll und Heizung ist aufnahme bereit
#Define AkkuTempOK  PV_State,1
#Define AutoON	    PV_State,2 
    extern WaitX
    global Temp0,Temp1,Temp2 

MAIN_PROG CODE                      ; let linker place main program
START
;IO Config setzen
    bsf OSCCON,SCS  ;internen takt benutzten
    clrf PORTC
    Banksel TRISC
    clrf TRISC	    ;Port C Ausgänge
    movlw B'00110000'
    movwf ADCON1
    movlw b'11110000' ; Pull UP für RB4-RB7 ON
    banksel WPUB
    movwf WPUB
    movlw b'00001111' ;RA0-RA2 u RA4 Analog, RC0-RC3 Digital
    movwf ANSEL
    clrf ANSELH	;RB4-5 und RC 6-7 Digital IO 
 
    BCF STATUS,RP0 ;Bank 0
    BCF STATUS,RP1
    bcf AkkuVoltOK
        
StartWait
    CLRWDT  ;Watchdog zurück setzen
    bsf StatusLED ; LED einschalten -> Spannung liegt an
 
;Akuuspannung messen
    movlw b'00000001' ; A/D wandler einschalten, AN= aktiv, VDD als Vref, messung starten
    movwf ADCON0
    movlw d'50'
    CALL WaitX	;50ms warten
    BSF ADCON0,GO ;Start conversion
    BTFSC ADCON0,GO ;Is conversion done?
    GOTO $-1 ;No, test again
    movfw ADRESH    ; Akku Spannung messen 
    movwf Temp0	; 
    ;   
; Spannungsteiler wird so eingestellt das bei 32V 5V am Pic ankommen 
;es ergeben sich diese Spannungen
;5V/1024 => 0,0048828125 ca 0,005v => ein digit
;32V => 5V
;28V=>5V/32*28=>4,375	- start spannung
;22V=>5/32*22=>3,43	- stopp spannung

;5V=> 1024 
;4,37=>1024/5*4,375=> 896 => 11100000/00 (224) 0xE0	-start Wert D'224' nur High in klammer
;3,43=>1024/5*3,43=> 702=> 10101111/10 (175) 0xAF	-stopp Wert D'175' nur High in klammer

  ;einschalten 
  bsf STATUS,C	;Carry bit setzen
 SUBLW d'224' ; Startwert-akku Spannung wenn Akkuspannung > startwertist carry bit false

  btfss STATUS,C ;überspringe nachfolgenden wenn gesetzt
  bsf  AkkuVoltOK
  
 ;ausschalten
  movfw Temp0
  SUBLW d'175' ; Startwert-akku Spannung wenn Akkuspannung > Endwert ist carry bit false

  btfsc STATUS,C ;überspringe nachfolgenden wenn gesetzt
  bcf  AkkuVoltOK 
  
  ;Schalter Automatik EIN
  BCF AutoON
  BTFSS EIN_Taster ;//Wenn Schalter belegt bit = False
  bsf AutoON
  
  ;Freigabe heizen zusammen legen
  movfw PV_State
  SUBLW B'00000101'
  BTFSS STATUS,Z 
  goto RelaisOFF
  goto RelaisON
  
RelaisON  
  bsf Relais
  goto StartWait
  
RelaisOFF  
  bcf Relais
  goto StartWait  
    END
wäre euch sehr dankbar wenn ihr da noch eine Idee habt...

hustene grüße (scheiß Erkältung)
Cobra

^Cobra

Nachtrag: Auch meine Art der Auswertung funktioniert scheinbar nur in der
simulation...
Habe nun die Analog spannung erstmal bei seite geschoben und den Rest überprüfen wollen.
Beim AutoEIN schalter kam aber nichts. Habe dann HW und SW nochmal überprüft.
HW alles OK - SW - mit ein Testprogramm konnte eine LED eingeschaltet werden
bei mein Code wird mit ein SUBLW die bits abgezogen die an sein müssen, wenn ergebnis 0 ist, somit das Z
Flag gesetzt ist wird also dahin gesprungen zum einschalten. genau das passiert aber im "echten" pic einfach nicht :(
Wenn ihr da ebenfalls ideen habt, gern her damit...

Ottmar

Hi cobra
a) mir fällt auf, dass keine Bankumschaltung verwendet wird!
b) AD-channel ist RA0/AN0:RA2/AN2
Diese pins müssen als inputs in TRISA und in ANSEL als analog konfiguriert sein.
c)in ADCON0 würde ich bit7=1 setzen, für Result right justfied.

Vielleicht hilft's
MfG Ottmar


^Cobra

Moin Ottmar,

danke fürs drüberschauen.

zu 
a) : Doch, banksel WPUB bringt mich in die Bank 2, da ist dann auch ADCON1 sollte also passen.

b) TRISA ist bei Reset immer gesetzt und somit sind es bereits eingänge.

c) nope, benutzt nur die 8 bits vom Highteil, da ist rechts bündig angenehmer ;)

Ottmar

Hi cobra,
Verwendest Du den sleepmode? Wenn nicht würde ich den Versuch machen in ADCON1 nicht frc sondern z.B. fosc/16 o.ä. zu verwenden.

^Cobra

Moin Ottmar, da stand vorher Mal nix drin also fosc/2, da ich aber den internen oszi nutze hatte ich gedacht das der dann auch auf intern stehen muss.
Werde aber Mal da was anderes versuchen. Aber erst morgen. 
Nun erstmal schlafen und schauen wies mir morgen geht.

Habe übrigens schon ein anderen 16f690 genommen. Selbe Ergebnis.
Kann mich nicht erinnern schonmal Probleme mit analog Zeugs in der Form gehabt zu haben.
Auch das die Routine mit der Prüfung auf z nun nicht geht... Seltsam bis frustrierend 

^Cobra

seufz,
guten morgen.

Die Gute Nachricht: Bin nun eine Woche krank geschrieben und dank Laptop und TestKoffer kann ich auf dem Sofa oder Bett weiter Forschen.

Habe nun ein 18F14K22 gefunden, dieser ist Pingleich mit dem 16F690. Mein Gedanke war es damit debuggen zu können um besser die Probleme zu finden.
Allerdings schaffe ich es nicht das Projekt auf dem 18F ans laufen zu kriegen.
Habe alle Fehler weg bekommen bis auf diesen:
Error - file './build/default/production/Main.o', section 'Haupt', Symbol '_Haupt_002A' is not word-aligned.
It can not be used as the target of a call or goto instruction.
Errors    : 1
Verstehe aber nicht was der mir sagen will. Der Main teil wird nicht mit CALL oder GOTO aufgerufen.
Kennt das jemand? Würde ja 2 " word-aligned " machen, aber finde auch da nicht wo oder wie ich das machen soll.   Bei mein anderen 18F steht da auch nichts anderes...

^Cobra

wieder ein Schritt weiter.
Der 18F mag wohl die in der Doku verwendete sprung methode nicht. $-1 
Dafür namen gegeben und nun kann ich übersetzen und debuggen.
Dabei ist mir nun was aufgefallen:
in mein Register PV_State kann ich weder löschen, noch schreiben o.O muff.
Ebenfalls laufen meine Zeitschleifen irgenwie garnicht oder sehr langsam, da bin ich noch am schauen.

Ottmar

Hi cobra,
ich komme nochmals auf das banking vom 16f690zurück.
Nach dem Programmstart ist Bank 0 aktiv.
OSSCON liegt aber in Bank 1
dann würde die Osc.config 500kHz ins Leere gehen.
Erst danach schaltest Du mit
BANKSEL TRISC auf Bank 1 um.

vielleicht hilft's
drück Dir die Daumen

pic18

Zitat von: ^Cobra in 07.04.2025, 12:17:39 CESTDer 18F mag wohl die in der Doku verwendete sprung methode nicht. $-1 

der 18er hat eine andere Adressierung, da besteht ein Befehl aus zwei Byte, GOTO $-2 sollte dann gehen. Der Goto-Befehl besteht sogar aus zwei Worte = 4 Byte.
Der zweite Teil von Goto fängt mit NOP an, gefolgt von der Sprungadresse. Falls man aus versehen auf die zweite Hälfte trifft, passiert also nichts.
Auch die Interrupt-Adresse ist anders statt 0x0004 jetzt 0x0008, es gibt sogar zwei Interrupt einen HI und einen Lo 0x0018

^Cobra

Mahlzeit ihr beiden.

Ich habe nun mein Programm ans laufen gekriegt, so wie es soll. (erstmal)
zum Schluss hatte ich das Problem das nicht in mein Register PC_State das drin stand was sollte. bzw. es
schien so als würde dieses Register einfach nicht beschrieben.
Es stellte sich herraus das dieses verhalten bei allen Variablen war, und somit meine Zeitschleifen ins unendliche verliefen.
Grund:
Statt UDATA musste ich nun UDATA_ACS bei den 18F benutzen.

Beim versuch das bei mein 16F Projekt umzusetzen scheiters aber wieder an der Übersetzung.
Hier konnte ich aber mit einer Blinkende LED die Register der Zeitschleife überprüfen. Die
scheint also zu laufen.

@pic18 Achja, das mit dem $-2 sagt mir dunkel wieder was... da war mal etwas :P

werde morgen Früh mit meinen Testaufbau mal versuchen die Heizstäbe einzu schalten. Werde berichten.

pic18

ich drehe hier mit dem Virenschutz auf der Arbeit noch durch

Zitat von: ^Cobra in 07.04.2025, 10:58:08 CESTMein Gedanke war es damit debuggen zu können um besser die Probleme zu finden
debuggen habe ich noch nie gemacht. Ich schließe immer eine LCD-Anzeige an und lasse mir die Werte anzeigen.
Übrigens rechne ich etwas einfacher:

1024inc / 32V= 32inc/V
für 28V gilt
32inc/V *28V= 896inc  (896>>2= 224 =0xe0)

für 22V gilt
32inc/V *22V= 704inc  (704>>2= 176 =0xb0)


^Cobra

Hi pic18!
Ja eine LCD wäre was feines, aber auch die muss erstmal laufen :P Ist bei mir alles sehr lange her.

Wow, danke für den kürzeren rechenweg :D Darauf kam ich nicht.

Aber: Ich konnte bis morgen nicht warten, alles Nähe des Ladereglers hingesetzt (übringes, die 5V kommen von einer USB Buchse
des Ladereglers, wusste nicht das der sowas hat)
Und rein Zufällig war der Akku auch grade im Status "bereit zum heizen". Also Schalter umgelegt, Relais zieht an, Schütz zieht an, voll Dampf vorraus :D :) Und wo der Akku bei ca. 22, noch was war auch brav abgeschaltet.

Es gab nur 2 Zwischenfälle:
 1. ein 18F habe ich scheinbar gegrillt (Kabelsalat unter Spannung entwirren war nicht gut)
 2. das Hilfs relais kann nur als öffner dienen da beim Schließer der gesamte Ausgangsteil dann taktet. (Dachte eventuell doch mit ein grßeren Transistor das Schütz direkt zu schalten... mal sehen) Jetzt ist meine Status LED für das Schütz an, wenn das Schütz aus ist...
Morgen werde ich mir das am Tage nochmal anschauen, wenn alles gut läuft kommen Temperatursensoren, Zeit begrenzungen usw nach und nach rein.

Danke euch für die Hilfe.

Cobra

pic18

Zitat von: ^Cobra in 07.04.2025, 17:38:27 CESTJa eine LCD wäre was feines, aber auch die muss erstmal laufen

wenn es in Assembler sein muss, so hat Sprut ein Beispiel.
https://www.sprut.de/electronic/pic/programm/lcd.htm

Ich persönlich schreibe so etwas immer in C. Man könnte mal probieren, ob man in einen Assemblerprogramm einen C - Code einfügen kann. Umgekehrt habe ich es schon oft gemacht, das funktioniert. Oft schreibe ich Interrupt - Routinen oder auch Berechnungen in Assembler. Um deinen Spannungswert auszugeben hätte ich sogar eine Assembler Routine. Diese hat vier Bits nach dem Integerwert. Sie ist für den DS18B20 Temperaturfühler geschrieben.

^Cobra

Habe ich noch nie hingekriegt.
Selbst andersrum, also Beispielsweise mein asm Code in c zu benutzen, kriege ich nicht hin. Daher fällt mir der Wechsel so schwer 😂 
Der c Compiler nimmt für asm wohl den xc8, welcher ne andere Syntax Hat. Und diese ist für mich schwer nachvollziehbar (zumindest gewesen).

Ja,die Sprut Seiten kenne ich und habe auch für LCD das schonmal genommen, aber das jetzt auch noch freifliegend dran zu basteln ohne das was abreißt o.ä. hms, das liegt Grade alles auf 3/4 8 bei den Solar Akku,Regler und dem Sicherungskasten rum. 


pic18

ich habe den alten C Compiler in MBLAB-X installiert. Mit xc8 laufen meine alten Programme nicht. Ich kann ja mal ein paar Bilder von meinem Projekt heute Abend schicken.

^Cobra

Mach das.
Werde bei mir auch nochmal anschauen welche Compiler bei mir rumliegen. 

Übrigens geht der 16f690 immer noch nicht. 
Durch blinke Led kann ich zwar bestätigen das der läuft,auch taktmäßig richtig ist aber der ganze Rest... Tut jetzt nicht Not da der 18f14k22 genau so gut ist aber mich würde es interessieren was bei dem noch klemmt... Mag aber auch sein das der uC Schrott ist. 

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau

🡱 🡳