A simple demand N2 heating system using a stripped version of my K42 controller board to monitor a OMRON D6F-50A6-000 MEMS AIRFLOW SENSOR with a 600W N2 heater reduce to 200W using 1 second period PWM. Like most things this is a prototype. The pump normally runs between 12 and 20 Kelvin trapping processing gasses and various contaminates until the cold heads warm to above 25K. At that point the system starts a regeneration process (warm-up, pump-out, cool-down) using internal heaters and external mechanical pumps. The regeneration process is greatly improved if the purge gas is also warm >300K.
Control board
https://github.com/nsaspook/vtouch_v2/tree/eadogs/n2heater
N2 inlet heater and flow sensor. 5 L/min gas flow gives 5vdc output to the ADC on the controller
Gas line flow testing.
Operational testing.
The middle LED is the PWM SSR signal, the right LED is gas flow detection.
touch_board.pdf
Control board
C:
/*
* VISTA HC end-station N2 CRYO heater controller for 600W inline heater
* PWM to about 200W for N2 purge
*
* FLow sensor OMRON D6F-50A6-000
* TE SSR-480D125
* Power Supply Mean Well RD-50A
* Enclosure: CAMDENBOSS CDIC00005
* PIC18F47K42 Touch Board: basic function
*/
#pragma warning disable 520
#pragma warning disable 1498
#include <stdint.h>
#include <stdio.h>
#include "mcc_generated_files/mcc.h"
#include "timer.h"
#include "n2heater.h"
/*
* software time variables
*/
volatile uint16_t tickCount[TMR_COUNT] = {0}, max_heat_time = 0;
uint32_t flow = 0, temp = 0, count = 0;
const char *build_date = __DATE__, *build_time = __TIME__, build_version[5] = "1.0";
uint16_t controller_work(void);
/*
Main application
*/
void main(void)
{
char buffer[80];
uint16_t pwm_value = PWM_OFF;
// Initialize the device
SYSTEM_Initialize();
INTERRUPT_GlobalInterruptHighEnable();
SSR_PWM_SetLow();
TMR0_StartTimer();
BLED2_SetHigh(); // boot LED indicator
WaitMs(5000);
BLED2_SetLow();
/*
* software timer 1 second PWM cycles
*/
StartTimer(TMR_PWM, PWM_DUTY);
StartTimer(TMR_PERIOD, PWM_MS);
StartTimer(TMR_LOG, LOGGING);
while (true) {
pwm_value = controller_work();
if (TimerDone(TMR_PERIOD)) {
StartTimer(TMR_PERIOD, PWM_MS);
StartTimer(TMR_PWM, pwm_value);
SSR_PWM_SetHigh();
LED1_SetHigh();
}
if (TimerDone(TMR_PWM)) {
StartTimer(TMR_PWM, PWM_DUTY);
SSR_PWM_SetLow();
LED1_SetLow();
}
/*
* testing logging & WDT reseting every 10 seconds
*/
if (TimerDone(TMR_LOG)) {
StartTimer(TMR_LOG, LOGGING);
CLRWDT();
sprintf(buffer, "%lu: Flow %lu, Temp %lu \r\n", count++, flow, temp);
}
}
}
/*
* I/O and program state setting
*/
uint16_t controller_work(void)
{
static uint16_t pwm_val = PWM_HIGH;
ADCC_StartConversion(AIR_TEMP);
while (!ADCC_IsConversionDone());
if ((temp = ADCC_GetConversionResult()) > FLOW_TEMP) {
pwm_val = PWM_LOW;
}
if (!BUTTON1_GetValue()) {
BLED2_SetHigh();
LED2_SetHigh();
return PWM_HIGH;
}
ADCC_StartConversion(AIR_FLOW);
while (!ADCC_IsConversionDone());
if ((flow = ADCC_GetConversionResult()) > FLOW_RATE) {
if (max_heat_time >= MAX_HEAT) { // shutdown after a long run
BLED2_SetLow();
LED2_SetLow();
max_heat_time = MAX_HEAT + 1;
return PWM_OFF;
} else {
BLED2_SetHigh();
LED2_SetHigh();
return pwm_val;
}
} else {
// flow rate below setpoint, reset max heater time
max_heat_time = 0;
}
BLED2_SetLow();
LED2_SetLow();
return PWM_OFF;
}
/**
End of File
*/
N2 inlet heater and flow sensor. 5 L/min gas flow gives 5vdc output to the ADC on the controller
Gas line flow testing.
Operational testing.
touch_board.pdf
Attachments
-
38.8 KB Views: 2
Last edited: