# MOSFET switching issue

#### earckens

##### Member
In the attached schematic MOSFET Q3 is switched one once a minute during a few seconds. The issue is that as soon as the gate is triggered to switch the MOSFET on, it stays on. Only when I attach a scope probe to the gate, does the MOSFET switch off when it must go off.

Any suggestion on design improvement?

Thanks!

EDIT: D9, 10 and 11 all trigger the same signal out. The issue I have is even there with only one output connected to the gate.

#### Attachments

• 29.1 KB Views: 35

#### Pommie

##### Well-Known Member
The MOSFET appears to be labeled 1N60 which is a diode!! What MOSFET is it?

You're driving the gate with 3 I/O pins, do you drive these low to turn it off or switch them to input? What voltage are the I/O working at?

Can I add that this is the most unconventional schematic I've seen in a while.

Edit, LED3 seems to be connected between AGND and GND!!! What is AGND?

Mike.

Last edited:

#### earckens

##### Member
The I/O output level is 0 to 5V. The 1N60 datahseet is attached.

#### Attachments

• 361.7 KB Views: 37

#### be80be

##### Well-Known Member
Agnd is the ground for the ADC module.
And the 1N60 i think comes in a 3 pin package the center not used tho.

Like those
funny this is what there calling them
MCIGICM 10pcs CS1N60 1N60 TO-92 N-Channel Power MOSFET 0.8A 600V
https://www.aliexpress.com/item/CS1N60-1N60-TO-92-N-Channel-Power-MOSFET-0-8A-
600V/32526022646.html
There a diode I have some I got to play with a crystal radio.
I have the glass ones but I seen the 3 pin I just looked there they where.

Last edited:

#### Pommie

##### Well-Known Member
How do you simultaneously switch 3 I/O lines without getting a conflict?

Your MOSFET appears to connect AGND and GND!! What is AGND?

Mike.

#### earckens

##### Member
How do you simultaneously switch 3 I/O lines without getting a conflict?

Your MOSFET appears to connect AGND and GND!! What is AGND?

Mike.
In the schematic the source and drain are wrong, A-GND is general ground, GND is to be connected to A-GND when the mosfet is switched. In effect, the Vcc must go through the load, then to GND, and through the mosfet drain to source to A-GND.
When connected like that on a prototype board it works, except again for the parasitic behavior of the gate described above.

#### be80be

##### Well-Known Member
1N60 is not a
TO-92 N-Channel Power MOSFET 0.8A 600V
It's diode that just happens to come in a TO-92 case

#### Pommie

##### Well-Known Member
The source is connected to GND not AGND! As I said, an unusual schematic which I'm struggling to understand.

Again, How do you simultaneously switch 3 I/O lines without getting a conflict? Show us the code.

Mike.

#### earckens

##### Member
The source is connected to GND not AGND! As I said, an unusual schematic which I'm struggling to understand.

Again, How do you simultaneously switch 3 I/O lines without getting a conflict? Show us the code.

Mike.
Hi, even with the protoype board and only one digital output connected this issue is present.

A 100nF cap just added between gate and source does not help.

Code:
Code:
// https://www.instructables.com/id/Arduino-Sleep-and-Wakeup-Test-With-DS3231-RTC/
// Arduino wake-up with DS3231
// corrected the library for use with Atmega168P
// corrected by: https://github.com/rocketscream/Low-Power/issues/45
// and also: https://github.com/rocketscream/Low-Power/issues/14
// connect DS3231 pin INT/SQW to D2 on Arduino (INT0, PCINT18, PD2)
// v8: includes ethernet shield and upload to Thingspeak
//    code from https://github.com/iobridge/ThingSpeak-Arduino-Examples/blob/master/Ethernet/Arduino_to_ThingSpeak.ino
// V9: modified for transmission over HC12 via hardware serial
//   1. prepare values for transmission: int sendDutyCycle, time and date
//   2. serialPrint only what needs to be transmitted
//   3. includes Thingspeak code
//   4. send 3 integers: humidity %, minute, hour and sensor identification (A, B, ..)
//
// V10: code without thingspeak, no ethernet module, and cleaned up
// status: 1/12/17: tested ok
// V11: send 4 integers: duty cycle %, temperature, minute, hour and sensor identification (A, B, ..)

#include <Wire.h>
#include <RTClibExtended.h>
#include <LowPower.h>
// #include <SPI.h> //Thingspeak
RTC_DS3231 RTC;      //we are using the DS3231 RTC

// Variable Setup
// NOTE: pin D8 is used for reading incoming square wave for duty cycle measurement

long lastConnectionTime = 0;
boolean lastConnected = false;
int failedCounter = 0;
int wakePin = 2;    //use interrupt 0 (pin 2) and run function wakeUp when pin 2 gets LOW
int ledPin = 13;    //use arduino on-board led for indicating sleep or wakeup status
int wakeStatus = 11; //use D10 to drive 5V power to sensor module and HC-12 with MOSFET, 1=wake
byte goToSleepNow = 1;
byte ledStatus = 1;
volatile word timerValue[4];
volatile byte testState = 0;
volatile boolean signalPresent = false;
boolean newValuesAvailable = false;
float pwmPeriod, pwmWidth, pwmFrequency, pwmDutyDisplay;
unsigned long pwmDuty;
const byte x = 10; // loop value: loop amount = x
int sendDutyCycle;  // contains integer value of float cycleValue
int dutyCycleStatus = 8;
int temperatureT1 ;

//-------------------------------------------------

void wakeUp()        // here the interrupt is handled after wakeup
{
}

//------------------------------------------------------------

void setup() {
//Set pin D2 as INPUT for accepting the interrupt signal from DS3231
pinMode(wakePin, INPUT);
//switch-on the on-board led for 1 second for indicating that the sketch is ok and running
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
digitalWrite(wakeStatus, LOW);
delay(1000);
//Initialize communication with the clock
Wire.begin();
RTC.begin();
// A convenient constructor for using "the compiler's time":
// DateTime now (__DATE__, __TIME__);
// then comment following line and immediately upload again

// RTC.adjust(DateTime(__DATE__, __TIME__));   //set RTC date and time to COMPILE time, see instructions above

//clear any pending alarms
RTC.armAlarm(1, false);
RTC.clearAlarm(1);
RTC.alarmInterrupt(1, false);
RTC.armAlarm(2, false);
RTC.clearAlarm(2);
RTC.alarmInterrupt(2, false);
//Set SQW pin to OFF (in my case it was set by default to 1Hz)
//The output of the DS3231 INT pin is connected to this pin
//It must be connected to arduino D2 pin for wake-up
RTC.writeSqwPinMode(DS3231_OFF);
//example: Set alarm1 every day at 18:33: 00 seconds, 33 minutes, 18 hours, 0 = every day;
// if for example Sunday then: dowSunday if a date then date of the month
//
// see for explanation: https://github.com/JChristensen/DS3232RTC#alarm-methods
RTC.setAlarm(ALM1_MATCH_SECONDS, 30, 00, 0, 0);   //set your wake-up time here:
// every 00 minutes past the hour;
// if every minute is needed change MINUTES to SECONDS
// matches seconds AND minutes when _MINUTES is used. Sequence of time:
// first seconds, then minutes, hours, daydate
// or: seconds (but enter 00, is ignored), minutes then hours, daydate for ALM2
// zero's mean: always
// example: Set alarm1 every day at 18:33
// RTC.setAlarm(ALM1_MATCH_HOURS, 33, 18, 0);  set your wake-up time here
// RTC.alarmInterrupt(1, true);

RTC.alarmInterrupt(1, true); //set alarm1

Serial.begin(115200);
}

//------------------------------------------------------------

void loop() {

//On first loop we enter the sleep mode
if (goToSleepNow == 1) {                                 // value 1 = go to sleep
attachInterrupt(0, wakeUp, LOW);                       //use interrupt 0 (pin PD2) and run function wakeUp when pin 2 gets LOW
digitalWrite(ledPin, LOW);                             //switch-off the led for indicating that we enter the sleep mode
ledStatus = 0;                                         //set the led status accordingly
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);   //arduino enters sleep mode here
detachInterrupt(0); //execution resumes from here after wake-up
//test signal jumper pin 7 to pin 8
//tone(7,2400);
//digitalWrite(7,HIGH);
//digitalWrite(7,LOW);
//When exiting the sleep mode we clear the alarm
RTC.armAlarm(1, false);
RTC.clearAlarm(1);
RTC.alarmInterrupt(1, false);
goToSleepNow = 0;                                      // value 0 = do not go to sleep
}

//cycles the led to indicate that we are no more in sleep mode
if (ledStatus == 0) {
ledStatus = 1;
digitalWrite(ledPin, HIGH);
}
digitalWrite(wakeStatus, HIGH);  // set wakeStatus to HIGH, wake mode
delay (1000);
measure(); //execute duty cycle measurement during wakeUp
delay (500);
digitalWrite(wakeStatus, LOW);                       //initiate wake status LOW, sleepmode
goToSleepNow = 1;
RTC.alarmInterrupt(1, true);
}

void measure()
{
DateTime now = RTC.now();
int repeat1 = 0;
unsigned long signalMax1 = 0; // max value for duty cycle
unsigned long signalMin1 = 1000000; // min value for duty cycle
// unsigned long currentMillis = millis();
unsigned long cycleTotal = 0;
float cycleValue = 0;

while (repeat1 < x)
{
getPwmValues();
if (newValuesAvailable)
{
repeat1++;
newValuesAvailable = false;
if (signalPresent)
{

if (pwmDuty < signalMin1) signalMin1 = pwmDuty;
if (pwmDuty > signalMax1) signalMax1 = pwmDuty;
cycleTotal += pwmDuty;
pwmDutyDisplay = pwmDuty / 1000.0;
}
}
}
if (signalPresent)   // if signal is present
{
DateTime now = RTC.now();
cycleTotal -= signalMin1;
cycleTotal -= signalMax1;
cycleValue = cycleTotal / 1000.0 / (x - 2);

Serial.print('<'); // this section for HC-12 transmission
Serial.print(cycleValue);  // ref Robin2's Serial Output Basics
Serial.print(',');   // http://forum.arduino.cc/index.php?topic=396450.0
Serial.print(',');
Serial.print(now.minute(), DEC); // send minute
Serial.print(',');
Serial.print(now.hour(), DEC); // send hour
Serial.print(",B>"); // send sensor identifier
}
else   // if no signal is present
{

if (digitalRead(dutyCycleStatus) == true)  //if true then 5V present on pin 8, sensor present
{
Serial.print('<'); // this section for HC-12 transmission
Serial.print(",100");  // ref Robin2's Serial Output Basics
Serial.print(',');   // http://forum.arduino.cc/index.php?topic=396450.0
Serial.print(',');
Serial.print(now.second(), DEC);
Serial.print(',');
Serial.print(now.minute(), DEC);
Serial.print(",B>");
}

else        //if false then 0V on pin 8 then there is hardware error
{
Serial.print('<'); // this section for HC-12 transmission
Serial.print(",0");  // ref Robin2's Serial Output Basics
Serial.print(',');   // http://forum.arduino.cc/index.php?topic=396450.0
Serial.print(',');
Serial.print(now.second(), DEC);
Serial.print(',');
Serial.print(now.minute(), DEC);
Serial.print(",B>");
}
}
}

void pwmMeasureBegin()
{
for (byte j = 0; j < 4; j++)
{
timerValue[j] = 0;
}

TCCR1A = 0;       // normal operation mode
TCCR1B = 0;       // stop timer clock (no clock source)
TCNT1  = 0;      // clear counter
TIFR1 = bit (ICF1) | bit (TOV1); // clear flags
testState = 0;   // clear testState
signalPresent = false; //reset
TIMSK1 = bit (ICIE1); // interrupt on input capture
TCCR1B =  bit (CS10) | bit (ICES1);// start clock with no prescaler, rising edge on pin D8
}

ISR (TIMER1_CAPT_vect)
{
signalPresent = true;
switch (testState) {
case 0: // first rising edge
timerValue[0] = ICR1;
testState = 1;
break;
case 1: // second rising edge
timerValue[1] = ICR1;
TCCR1B &=  ~bit (ICES1); // capture on falling edge (pin D8)
testState = 2;
break;
case 2:  // first falling edge
testState = 3;
break;
case 3: // second falling edge
timerValue[2] = ICR1;
testState = 4;
break;
case 4: // third falling edge
timerValue[3] = ICR1;
testState = 5;  // all tests done
TCCR1B = 0; //stop timer
break;
}
}

void getPwmValues()
{
static boolean measurementInProcess = false;

if (!measurementInProcess)
{
pwmMeasureBegin();
measurementInProcess = true;
delay(50);//time for signalPresent to be set
}
else if (testState == 5 || !signalPresent)//measurement complete or noSignal
{
if (!signalPresent)
{
//      Serial.println("100% duty cycle. No PWM signal, zero data");
//      float cycleValue = 100.0;
//      Serial.print(cycleValue, 3);
//      Serial.println(" %");
//      displayTime();
//      Serial.println();
//      Serial.println();
}
calculatePwmValues();
measurementInProcess = false; //reset
}
}

void calculatePwmValues()
{
word periodValue = timerValue[3] - timerValue[2];
// word is the same as unsigned int
word widthValue = timerValue[2] - timerValue[1];
word diffValue = widthValue - periodValue;

pwmPeriod = (periodValue * 0.0625);
pwmWidth = diffValue * 0.0625;
pwmDuty = (pwmWidth / pwmPeriod) * 100000;
pwmFrequency = 1000 / (pwmPeriod);

newValuesAvailable = true;
}

#### Pommie

##### Well-Known Member
I don't want to wade through all your code I just wanted the bit where it switches the pin(s) off.

Does a 10k resistor from gate to source solve the problem?

Mike.

#### earckens

##### Member
I don't want to wade through all your code I just wanted the bit where it switches the pin(s) off.

Does a 10k resistor from gate to source solve the problem?

Mike.
Removed the cap, added 10k between G and S, I measure controller output no higher than 1V when switched. Same when assigned different controller outputs.
When I force the mosfet with 5V from the supply at the gate, it switches ok. When I measure controller outputs when disconnected from gate, all outputs switch to 5V when activated.

Defective mosfet?

#### dr pepper

##### Well-Known Member
The fet needs to be a logic level one, and your scem doesnt show a pull down on the gate, if the micro has push pull o/p's thats fine, however if the micro only pulls up and goes high imp when off thats why your load doesnt switch off.
Do you have a logic probe?, if so bung it on the o/p from the micro to the fet gate, if it stays high then you've a software issue, if it goes logic high to neither a logic high or low then the above is the case.

#### earckens

##### Member
The fet needs to be a logic level one, and your scem doesnt show a pull down on the gate, if the micro has push pull o/p's thats fine, however if the micro only pulls up and goes high imp when off thats why your load doesnt switch off.
Do you have a logic probe?, if so bung it on the o/p from the micro to the fet gate, if it stays high then you've a software issue, if it goes logic high to neither a logic high or low then the above is the case.
Hi, the controller output is low impedance, so unless the drawn current is too high (>20mA) it will go high.
The issue I see is that when connected to the gat 150R resistance the output does not even go higher than 1V. You have a point when you hint at output issues too: however, any output I use, this issue shows up (by the way, pwm is not involved, I use purely high or low output values).
Current status: when forcing the mosfet high or low at the gate using direct 5V potential, the mosfet switches ok regardless of a oscilloscope present on the gate or not. Currently a 10k resistor is connected between G and S.
When using any controller output I get 1V max only at the gate.

#### jpanhalt

##### Well-Known Member
My initial impression (since deleted as Pommie in post 10 said effectively the same thing) was that you needed a turn-off resistor.* It is bothersome that with a 10k resistor on an output pin you only read 1 V. EDIT: Is that read with a scope or with a voltmeter? If voltmeter, you are probably just seeing an average.

An output pin should be able to drive more than that. Also noted that D10 (Arduino) is Atmega !SS pin. Are you sure that function is turned off?

Can you completely disconnect D10 and D11 and leave only D9 attached to your mosfet?

*Some programs toggle the impedance (i.e., input vs output) state of a pin instead of toggling the logic state of an output pin.

Last edited:

#### earckens

##### Member
My initial impression (since deleted as Pommie in post 10 said effectively the same thing) was that you needed a turn-off resistor.* It is bothersome that with a 10k resistor on an output pin you only read 1 V. EDIT: Is that read with a scope or with a voltmeter? If voltmeter, you are probably just seeing an average.

An output pin should be able to drive more than that. Also noted that D10 (Arduino) is Atmega !SS pin. Are you sure that function is turned off?

Can you completely disconnect D10 and D11 and leave only D9 attached to your mosfet?

*Some programs toggle the impedance (i.e., input vs output) state of a pin instead of toggling the logic state of an output pin.
Measured with scope.
The output pins used for this function are configured digital output (no pwm).
Yes, I currently work off prototype board with one output only connected to G.

#### Ian Rogers

##### User Extraordinaire
Forum Supporter
Two things...
A) Check Burt's suggestion where your mosfet may be a diode...
B) Check out Mike's theories.... If the outputs are not switched together ( which they are not ) all three pins may be damaged... This means if the device is a mosfet, the switching will now be indeterminate...

Also... I had a great difficulty switching a mosfet at low voltage.. I had to use one of these ONSEMI MGSF2N02ELT1G

#### dr pepper

##### Well-Known Member
Another quick one, is the voltage on the gate below the avalanche level for the fet, if not while static while switching, that would hold it on.
If theres any inductance in the load that could mess you up.

#### alec_t

##### Well-Known Member
If I'm reading the schematic correctly you are using the Arduino outputs D9-11 to drive the FET which switches AGND to GND; but the Arduino ground is AGND and the 5V regulator ground is also AGND, so aren't you effectively asking the Arduino to turn itself and its power supply on ??

#### be80be

##### Well-Known Member
If what he really has is a 1N60 it's not a Fet It's a diode that come's in a 3 pin package and seeing the poster not saying if for sure it's a 1N60.

Not said nothing just blowing over good deal
I no they sell them saying there mosfet

Cause I got a bag of 50 1N60 there diodes and when looking i found some in 3 pin package

Now if you got really one of these
http://www.unisonic.com.tw/datasheet/1N60.pdf
it would never work for what your trying to do.

#### earckens

##### Member
If I'm reading the schematic correctly you are using the Arduino outputs D9-11 to drive the FET which switches AGND to GND; but the Arduino ground is AGND and the 5V regulator ground is also AGND, so aren't you effectively asking the Arduino to turn itself and its power supply on ??
A-GND is the main ground, for the power supply (Vcc), for the Arduino, for the whole circuit.
GND is ground for anything that needs to be powered on or off by the MOSFET: switching the gate means connecting GND to A-GND, means powering up anything connected to GND.
Note: drain and source in the schematic need to be reversed.