I have a 100A DC/AC zero-switching SSR rated for 3-32 VDC input and 24-480 VAC output. My load is an Omega heater that can be operated at 115 VAC or lower. Input voltage is being provided by two Arduino Uno PWM pins. I'm using a 120/24 VAC transformer to supply the AC power to Terminal 2 of the SSR. I'm using a MAX 31865 RTD to read the temperature of the metal plate attached to the heater. I'm a beginner with electronics, so I'm having quite a bit of trouble with this project in general, but I'd like to specifically ask about a strange behavior I've noticed:
The SSR will operate even if the input voltage is less than the 3 VDC minimum operational voltage. In the code below, the value 100 is repeatedly written to the PWM plus pin. I measured 1.8 V across the input terminals on the SSR. Despite the low input voltage, the SSR LED is on, and the metal plate's temperature increased by a noticeable amount. My thought is that there should be zero load current, so the temperature shouldn't increase at all.
Other things that may be worth noting: I did a continuity test with the multimeter probes across the output terminals & it beeped (closed circuit). Also, I measured ~10 VAC across the SSR output terminals.
Does anyone know why this is happening? Is the SSR faulty, or am I doing something wrong or misunderstanding the situation? I'd be happy to supply more information as needed.
#include <Adafruit_MAX31865.h>
#include <Arduino.h>
// The value of the Rref resistor. Use 430.0 for PT100 and 4300.0 for PT1000
#define RREF 4300.0
// The 'nominal' 0-degrees-C resistance of the sensor 100.0 for PT100, 1000.0 for PT1000
#define RNOMINAL 1000.0
// PWM pins
int PWM_Pin_plus = 9;
int PWM_Pin_minus = 3;
//Thermo pins
const int CS = 10;
const int DI = 11;
const int DO = 12;
const int CLK = 13;
Adafruit_MAX31865 thermo = Adafruit_MAX31865(CS, DI, DO, CLK);
void setup() {
Serial.begin(19200);
pinMode(PWM_Pin_plus, OUTPUT);
pinMode(PWM_Pin_minus, OUTPUT);
thermo.begin(MAX31865_2WIRE);
}
void loop() {
double temp = thermo.temperature(RNOMINAL, RREF);
Serial.println(temp);
analogWrite(PWM_Pin_plus, 100);
analogWrite(PWM_Pin_minus, 0);
delay(500);
}
I see. So the reason the LED is on for a seemingly low input voltage is that the voltage is actually switching rapidly between 0 and 5 V, and the 5V input is enabling the LED. That makes sense!
If you are trying to "dim" a heater, don't do that!!!
The temperature can't change instantly so almost all heating/cooling systems cycle on & off... When the temperature is below the target the heat is switched on and then it's switched off when you reach (or are slightly above) the target.
"Slow PWM" would be something like switching it on for 1/2 second and then off for 5 seconds. You can do that for temperature adjustment when there is no temperature sensor.
You can't (easily) "dim" an AC SSR. Most AC SSRs use TRIACS. A TRIAC latches-on until current drops to zero, which is the next AC zero crossing. A "zero crossing" SSR also waits for the zero-crossing to turn-on. That means it's going to be on for at-least one-half cycle.
And it means PWM won't work (AC light dimmers use something similar to PWM, but it's synchronized with the 50/60Hz power line frequency.)
PWM isn't analog DC or regular AC so your 1.8V meter reading is probably just "close" to the average. (Meters don't read PWM reliably).
But... The "minimum" doesn't mean what you think. It's the "guaranteed minimum" The relay is specified to turn-on at 3V (or more). You can be pretty-sure it will also turn-on at 2.99V but it's not guaranteed. It might turn-on at 2V or lower, etc.
Thanks for all that info! As a sanity check, it's good to know that 3V isn't a hard cutoff for the SSR.
For context, the eventual goal is to have a DIY PID temperature controller for sample cups heaters in my professor's lab. The idea was that the PID value would be written to the PWM pins, which would change the effective input voltage to the SSR, which would switch the heater on/off. I'm trying to recreate this project where someone was able to pull it off. Keyword: "trying"
PWM is the best way to control a heater BUT circuit parameters are important. The Arduino probably puts out a several hundred hertz PWM signal, that is fine but it will not work with your SSR. It would be best if you took your PWM frequency to several seconds per cycle. The duty cycle can be whatever. It can get low enough that the SSR will not always fire but that is not a problem. Just drive the input to it properly and it will work great. I have many of these in Industrial control systems that have been operational for many years and no failures.
Your SCR or triac has what is called a holding current. It will not turn off as long as that amount or more current is flowing. That is what they do not work on DC, without the zero cross they cannot commutate or turn off.
Your voltage measurement across the SSR is invalid as it appears you are using a multimeter on a PWM signal, that appears to your meter as an AC signal. Use a scope to get a valid reading.
Operating the SSR below its minimum voltage can destroy it. The SCR or Triac contained inside requires a minimum gate signal and if you are below that you can cause punch through on the semiconductor and cause it to fail This is because only a small area starts to conduct and gets hot before the rest of the device can conduct. The 3 to 32 volt range or what is specified is where it is designed to work, going outside that also takes it out of warranty and its operating specifications.
Posting an annotated schematic makes it a lot easier to follow your design.
The Zero crossing of the SSR limits its commutation frequency to that of the line frequency × 2 or 120Hz in the US. A PWM with a higher frequency will beat, or hetrodyne with the asynchronous power frequency, and the relay will "chatter" (a mech relay might also lock up). Use digitalWrite instead of PWM, and reduce the loop frequency to under the powerline frequency, so you can establish a PLL to smoothly control the power every 1/2 cycle.
If 1/2 of a power cycle causes too great a swing for control, your heating element is too big for the app.
Thanks for all of the information and suggestions, everyone! I'll work on implementing these changes and post an update once I get it functioning properly.