1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

MOSFET switching issue

Discussion in 'Electronic Projects Design/Ideas/Reviews' started by earckens, Dec 30, 2017.

  1. earckens

    earckens Member

    Joined:
    Aug 25, 2016
    Messages:
    453
    Likes:
    8
    Location:
    Ghent, Belgium
    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.
     

    Attached Files:

  2. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,279
    Likes:
    355
    Location:
    Brisbane Australia
    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: Dec 30, 2017
  3. earckens

    earckens Member

    Joined:
    Aug 25, 2016
    Messages:
    453
    Likes:
    8
    Location:
    Ghent, Belgium
    The I/O output level is 0 to 5V. The 1N60 datahseet is attached.
     

    Attached Files:

  4. dave

    Dave New Member

    Joined:
    Jan 12, 1997
    Messages:
    -
    Likes:
    0


     
  5. be80be

    be80be Well-Known Member

    Joined:
    Aug 23, 2008
    Messages:
    4,943
    Likes:
    146
    Location:
    morristown,tn

    Agnd is the ground for the ADC module.
    And the 1N60 i think comes in a 3 pin package the center not used tho.
    [​IMG]
    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: Dec 30, 2017
  6. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,279
    Likes:
    355
    Location:
    Brisbane Australia
    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.
     
  7. earckens

    earckens Member

    Joined:
    Aug 25, 2016
    Messages:
    453
    Likes:
    8
    Location:
    Ghent, Belgium
    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.
     
  8. be80be

    be80be Well-Known Member

    Joined:
    Aug 23, 2008
    Messages:
    4,943
    Likes:
    146
    Location:
    morristown,tn
    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
     
  9. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,279
    Likes:
    355
    Location:
    Brisbane Australia
    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.
     
  10. earckens

    earckens Member

    Joined:
    Aug 25, 2016
    Messages:
    453
    Likes:
    8
    Location:
    Ghent, Belgium
    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 (text):


    // 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
    // and for two values: https://community.particle.io/t/uploading-sensor-data-to-thingspeak/5497
    // 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
    #define DS3231_I2C_ADDRESS 0x68
    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
    int temperaturePin = A0; // analog input for LM35 temperature sensor
    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__);
      // uncomment following line when compiling and uploading,
      // 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();
      temperatureT1 = analogRead(temperaturePin);
      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(temperatureT1); // send temperature read from analog input temperaturePin
        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(temperatureT1); // send temperature read from analog input temperaturePin
          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(temperatureT1); // send temperature read from analog input temperaturePin
          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;
    }
     
     
  11. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,279
    Likes:
    355
    Location:
    Brisbane Australia
    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.
     
  12. earckens

    earckens Member

    Joined:
    Aug 25, 2016
    Messages:
    453
    Likes:
    8
    Location:
    Ghent, Belgium
    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?
     
  13. dr pepper

    dr pepper Well-Known Member Most Helpful Member

    Joined:
    Oct 6, 2008
    Messages:
    4,867
    Likes:
    280
    Location:
    North west UK
    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.
     
  14. earckens

    earckens Member

    Joined:
    Aug 25, 2016
    Messages:
    453
    Likes:
    8
    Location:
    Ghent, Belgium
    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.
     
  15. jpanhalt

    jpanhalt Well-Known Member Most Helpful Member

    Joined:
    Jun 21, 2006
    Messages:
    6,173
    Likes:
    529
    Location:
    Cleveland, OH, USA
    ONLINE
    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: Dec 30, 2017
  16. earckens

    earckens Member

    Joined:
    Aug 25, 2016
    Messages:
    453
    Likes:
    8
    Location:
    Ghent, Belgium
    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.
     
  17. Ian Rogers

    Ian Rogers Super Moderator Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,378
    Likes:
    920
    Location:
    Rochdale UK
    ONLINE
    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
     
  18. dr pepper

    dr pepper Well-Known Member Most Helpful Member

    Joined:
    Oct 6, 2008
    Messages:
    4,867
    Likes:
    280
    Location:
    North west UK
    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.
     
  19. alec_t

    alec_t Well-Known Member Most Helpful Member

    Joined:
    Jul 10, 2011
    Messages:
    9,372
    Likes:
    1,235
    Location:
    Cardiff, Wales
    :confused: 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 ??
     
  20. be80be

    be80be Well-Known Member

    Joined:
    Aug 23, 2008
    Messages:
    4,943
    Likes:
    146
    Location:
    morristown,tn
    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.
     
  21. earckens

    earckens Member

    Joined:
    Aug 25, 2016
    Messages:
    453
    Likes:
    8
    Location:
    Ghent, Belgium
    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.
     

Share This Page