Cryogenic pump N2 heater flow control

Thread Starter

nsaspook

Joined Aug 27, 2009
7,733
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.

IMG_20200816_100254.jpg
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
*/
https://github.com/nsaspook/vtouch_v2/tree/eadogs/n2heater
IMG_20200816_163947.jpg
N2 inlet heater and flow sensor. 5 L/min gas flow gives 5vdc output to the ADC on the controller
IMG_20200817_082555.jpg
Gas line flow testing.
IMG_20200817_082528.jpg
Operational testing.
The middle LED is the PWM SSR signal, the right LED is gas flow detection.
touch_board.pdf
 

Attachments

Last edited:
Top