Fangspiegelheizung mit Pulsweitensteuerung

Damit die Fangspiegelheizung nicht immer mit einem ganzen Watt Heizleistung arbeitet, versorgt sie diese Pulsweitensteuerung.

Schaltung der Pulsweitensteuerung

Die Schaltung entkoppelt die Pulsweitensteuerung über C1 und die Schottkydiode D1 vom Rest des Systems. Das reduziert Rückflüsse aus der PWM  auf die Eingangstromversorgung, wo ja auch die Astrokamera dranhängt. Die ganze PWM-Steuerung ist über einen ATtiny85 realisiert. Über einen Taster kann man zyklisch 33%, 66% oder 99% der maximalen Heizöeistung anfordern. Die Heizung selber wird über einen MOSFET gesteuert. Die Schaltung soll möglichst robust sein. Deswegen habe ich diesen Transistor so ausgewählt, dass er  eigentlich in dieser Schaltung nicht kaputt gehen dürfte (62A / 30V).

PWM für Fangspiegelheizung
Schaltung Stromversorgungsbox mit Heizungssteuererung.

Da der USB-Hub des Elektronikmoduls auch noch 5 Volt Versorgungsspannung braucht, habe ich ein passendes Schaltreglermodul gleich mit eingebaut.

ProgrammCode

Der Programmcode für den ATtiny 85 ist nachfolgend gelistet.

/*
######################################################################################
## PWM-ATTINY.INO	
##
## Kleines Programm für ATTINY85 zur Steuerung einer Fangspiegelheizung. Die 
## FSP-Heizung muss so ausgelegt sein, dass bei direktem Anschluss an 13 Volt
## etwa 1W Heizleistung entsteht. Die hier vorliegende Steuerung bietet drei
## Stufen: 33, 66 und 99 Prozent. Nach dem Einschalten ist als Default die
## 33% Stufe aktiviert. Drücken des Tasters schaltet zyklisch die Modi durch:
## 33% -> 66% -> 99% -> 33% usw. Je nach aktiviert Stufe blitzt die LED
## unterschiedlich schnell auf:
## 33% : T=2.0s
## 66% : T=1.0s
## 99% : T=0.5s
##
## Kai Wicker, 28.02.2020
##   
## 01.03.2020, V1.0:  initial version based on FSP-Heizer-attiny.ino
## 05.03.2020, V1.1:  erste lauffähige Version auf Steckbrett, erfolgreiche
##                    Verifikation der Ausgabewerte per Oszi
## 07.03.2020, V1.2:  ein Tastendruck wir jetzt mit hellem Leuchten der LED
##                    quittiert
##
#######################################################################################
*/
//#define DEBBUG
/* im DEBUG Modus kann ueber IC-Pin2 = PB3 eine serielle Schnitstelle */
/* zum Ausgeben von Debugginginformationen benutzt werden. Hier wird  */
/* dann der gleich Wert ausgegeben, der in das PWM-Register           */
/* geschrieben wird. */

#ifdef DEBUG
#include 
const int rx = -1; // nicht benutzt
const int tx =  3; // Pin 2 = PB3
SoftwareSerial mySerial(rx,tx);
#endif

#define LED     4 // IC-Pin 3 = PB4
#define PWM     1 // IC-Pin 6 = PB1
#define TASTER  2 // IC-Pin 7 = PB2

// default values for start-up (default):
int hell = 1, pause = 1995;
int TASTE = 3, PWM_WERT = 33;
volatile unsigned long alteZeit = 0, entprellZeit = 20;
 
void setup() 
{
#ifdef DEBUG
  pinMode(rx,INPUT);
  pinMode(tx,OUTPUT);
  mySerial.begin(9600);
#endif
  pinMode(LED, OUTPUT);
  pinMode(TASTER, INPUT);
  pinMode(PWM, OUTPUT);
  attachInterrupt(0, interruptRoutine, LOW);
  digitalWrite(LED, HIGH);   
  delay (5000);
  digitalWrite(LED, LOW);    
}

void loop() 
{
#ifdef DEBUG
  mySerial.println(PWM_WERT/100.0*255);
#endif
  timing (pause, hell);
  analogWrite(PWM,PWM_WERT/100.0*255) ;   
  digitalWrite(LED, HIGH);   
  delay (hell);
  digitalWrite(LED, LOW);    
  delay (pause);
}

void interruptRoutine() 
{
  digitalWrite(LED, HIGH);
  if((millis() - alteZeit) > entprellZeit)
  { 
    TASTE = TASTE -1;
    if (TASTE==0) 
      TASTE = 3 ;
    alteZeit = millis(); 
  }
}

void timing (int &pause, int &hell)
{
  switch (TASTE)
  {
    case(1):
     pause    = 495;
     hell     = 1;
     PWM_WERT = 99;
     break;
   
   case(2):
     pause    = 995;
     hell     = 1;
     PWM_WERT = 66;
     break;
   
   case(3):
     pause    = 1995;
     hell     = 1;
     PWM_WERT = 33;
     break;
  
   default:
	 pause    = 1995;
     hell     = 1;
     PWM_WERT = 33;
     break;
  }
}