• Power Bipolar Transistors are limited by DC operations.

    Power transistors are big bulky because they have to deal with a large amount of current in a very short amount of time. They are the fastest of all the transistors.

    Heat is the biggest enemy of the transistor. As silicon is heavily dependent on temperature. As the die temperature increases the more sensitive it becomes. And at a certain point, it burns out. At the moment of burning there is a short which generates so much heat that the silicon just burns itself off.

    Even the TIP3055 can only handle instantaneous current pulses for a very short amount of time. If that same transistor is put under a continuous load it will burn out in a few instances.

    If we look at the derating curve of any power transistor. We will find out that they are only good for up to 1Amps of DC operation. And even at 1 Amp, it will need a sizeable amount of aluminium heatsink.

  • How to set up UART of ATmega328pb in Atmel Studio 7.0

    To set up uart in Atmel studio 7.0.

    Firstly you will need a common baud rate.

    Then you go to section 24.11 of the datasheet. You will find common calculated values for the UBRRn register.

    UBRRn register is comprised of high and low registers.

    First, you have to initialise the Data direction registers for the RX and Tx Pins. Then you initialise the UART peripheral.

    DDRD &= ~(1 << DDD0);				// PD0 - Rx Input
    DDRD |= (1 << DDD1);				// PD1 - Tx Ouput
    USART_Init();					// UART intialise

    Here is the basic UART library code.

    /*
    * Name: UART library Code
    */
    void USART_Init( )
    {
    	/*Set baud rate */
    	
    	UBRR0L = 103;
    	/* Enable receiver and transmitter */
    	UCSR0B = (1 << RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
    	/* Set frame format: 8data, 1stop bit */
    	UCSR0C = (3<<UCSZ00);
    }
    
    void USART_Transmit(uint8_t data )
    {
    	
    	/* Wait for empty transmit buffer */
    	while ( !( UCSR0A & (1<< UDRE0 )) )
    	;
    	/* Put data into buffer, sends the data */
    	UDR0 = data;
    	
    }
    
    unsigned char USART_Receive( void )
    {
    	/* Wait for data to be received */
    	while ( !(UCSR0A & (1<<RXC0)) )
    	;
    	/* Get and return received data from buffer */
    	return UDR0;
    }
    
    void USART_SendString(char *str)
    {
    	unsigned char j=0;
    	
    	while (str[j]!=0)		/* Send string till null */
    	{
    		USART_Transmit(str[j]);
    		j++;
    	}
    }
  • How to ATMega328PB to avrdude.conf

    I recently bought a few Arduino Uno clones. They were not cheap. They utilise the ch34 IC, which is a USB to UART solution. They all have SMD atmega328pb soldered on them.

    The problem is that two of them stopped working with the Arduino ide. On inspection, i found out that my software was not updated so firstly I updated the software which now includes a configuration for the atmega328pb.

    But somehow the internal bootloader in these SMD chips got corrupted and it stopped working. I then probed the chip with AVRdude prograamer.

    Found that the chip is atmega328pb. The configurations were not included at the time of installation. But the avrdude program allows you added other avr parts from Atmel.

    For Windows 10

    1. Go to
    C:\WinAVR-20100110\bin

    2. Then open

  • LM317 Adjustable Voltage Regulator

    This is a very inexpensive voltage regulator IC. Which can be either used as a fixed voltage regulator or variable voltage regulator.

    It just needs only two resistors for setting the output voltage.

    LM317 is made by different companies. ST, Ti, On Semi, CDIL, HTC Korea etc.

    For setting the output voltage

    V(output) = [ V(reference) * ( 1 + R2/R1) ] + [ I(adjustment) * R2 ]

    Vref = 1.25V

    I(adj) = 50 uA

    For setting 5 V at the output

    R2 = 2.2k + 680 ohm

    R1 = 1k ohm

    There are many version of this chip

    Lm317M for 500mA maximum current

    LM317T for 1.5A max current

    LM317L for 100mA max current

  • Battery Monitoring with Led Light Control Using ESP32 Bluetooth for my Solar System

    I need to monitor battery voltage to check weather my charging system is working correctly or not. But to do that i have get up and walk with my multimeter towards the battery and i have to take these reading in night.

    I placed my battery in a corner where there is very little light. So I added a transistor switch which can be controlled using Bluetooth to turn on the led light. Which provides enough light to act as a night light.

    The ESP32 also has an ADC built into it. Which is very poor in terms of accuracy. It gets you the idea that there is something to work with but it does not give very precise reading like a multimeter.

    Also, the ESP32 ADC is non-linear. The ADC also has an attenuation feature. Which by default is set to 11db. which gives us a workable range of up to 3.3V. But there are flat-out regions which need to be taken into account if you want to measure anything from this ADC. There is a 0 – 0.2V region in which the value read is constant, and there is a 2.9V to 3.3V region which also gives you constant reading values.

    Resolution is 12-bit by default.

    To measure a large voltage using this device. I made a voltage divider.

    Battery +ve———/\/\/ R1 \/\/\/ ———— Vout —————— /\/\/\/\/ R2 \/\/\/\/ ———-GND

    R1 = 10 kilo Ohm

    R2 = 1 kilo Ohm

    Which gives me a dividing factor of 11.

    So if 11 V is available at the battery anode. Then the V out is 1V.

    Normally the lead acid battery voltage goes from 10V(fully discharged) to 14.6V(Maximum charge) to 15V(Over Charged)

    The ADC values are converted to battery voltage using the following equation

    ( (analogValue * (3.3/4096 ) ) * ((9820+985)/985) ) + 3.3

    #include "BluetoothSerial.h"
    
    #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
    #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
    #endif
    
    BluetoothSerial SerialBT;
    
    
    char var1;
    int analogValue;
    uint8_t i;
    int avg_adc;
    
    void setup()
    {
      Serial.begin(115200);
      SerialBT.begin("ESP32test"); //Bluetooth device name
      Serial.println("pair it with bluetooth!");
    pinMode(2, OUTPUT);
     
    }
    
    void loop()
    {
      /*
       * UART 
       */
      if (Serial.available()) {
      
        SerialBT.write(Serial.read());
      }
    
    
    /*
     * Bluetooth serial
     */
      if (SerialBT.available()) {
          var1 = SerialBT.read();
        Serial.write(var1);
      }
        if (var1 == '9')
    {
      digitalWrite(2,HIGH);
    }
    else if(var1 == '1')
    {
      digitalWrite(2,LOW);
    }
    
    
    avg_adc = 0;
    for(i =0 ; i< 100; i++)
    {
      avg_adc += analogRead(34);
    }
    analogValue = avg_adc / 100;
    
    SerialBT.printf("ADC = %d\n",analogValue);
      SerialBT.printf("volt = %f\n",   ( (analogValue * (3.3/4096 ) ) * ((9820+985)/985) ) + 3.3 ) ;
        delay(1000);
    }

    Since the ADC is not accurate it goes all over the place. To dampen its effect on the reading I am averaging 100 readings of ADC.

    avg_adc = 0;
    for(i =0 ; i< 100; i++)
    {
      avg_adc += analogRead(34);
    }
    analogValue = avg_adc / 100;

    TIP3055 BJT is used as a low-side switch. R1 gives a base current of 330uA(=3.3/10000) which gets multiplied by the beta or hFE 70 of transistor to get a collector current of 0.023A or 23mA.

  • General Timer based on RTC using stm32f103rb

    This timer uses stm32 internal rtc peripheral to display time.

    The initialization code is generated using CUBEMX which is embedded inside the CUBE IDE.

    /* USER CODE BEGIN WHILE */
    	
    	RTC_TimeTypeDef readTime;	// RTC Time structure
    	RTC_DateTypeDef readDate;	// RTC Date structure
    	uint8_t time_hou_var[2];
    	uint8_t time_min_var[2];
    	uint8_t time_sec_var[2];
    
    	while (1)
    	{
    
    
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
    		/*  function to read time from RTC shadow register */
    		    HAL_RTC_GetTime(&hrtc, &readTime, RTC_FORMAT_BIN);
    
    		/* function to read date from RTC shadow register	*/
    		    HAL_RTC_GetDate(&hrtc, &readDate, RTC_FORMAT_BIN);
    
    		    itoa(readTime.Hours,(char *)time_hou_var,10);
    		    textPtr = ((uint8_t *)(time_hou_var));
    		    LCD_Fill(0, 40, 240, (40 + 1)+30, WHITE);
    		    WriteString(10,(40*1)+10,textPtr,RED);
    
    		    textPtr = ((uint8_t *)":");
    		    WriteString(40,(40*1)+10,textPtr,GREEN);
    
    		    itoa(readTime.Minutes,(char *)time_min_var,10);
    		    textPtr = ((uint8_t *)(time_min_var));
    		  //  LCD_Fill(0, 40, 240, (40 + 1)+30, WHITE);
    		    WriteString(45,(40*1)+10,textPtr,RED);
    
    		    textPtr = ((uint8_t *)":");
    		    WriteString(70,(40*1)+10,textPtr,GREEN);
    
    		    itoa(readTime.Seconds,(char *)time_sec_var,10);
    		    textPtr = ((uint8_t *)(time_sec_var));
    		    //   LCD_Fill(0, 40, 240, (40 + 1)+30, WHITE);
    		    WriteString(75,(40*1)+10,textPtr,RED);
    
    		    HAL_Delay(1000);
    
    		    if(HAL_GPIO_ReadPin (GPIOA, KEY1_Pin))
    		    {
    		    	// Set The LED ON!
    		    	HAL_GPIO_WritePin(GPIOA, LED1_Pin, GPIO_PIN_SET);
    
    		    }
    		    else
    		    {
    		    	// Else .. Turn LED OFF!
    		    	HAL_GPIO_WritePin(GPIOA, LED1_Pin, GPIO_PIN_RESET);
    		    	//HAL_GPIO_WritePin(LCD_BL_EN_GPIO_Port, LCD_BL_EN_Pin, GPIO_PIN_RESET);
    		    	HAL_GPIO_TogglePin(LCD_BL_EN_GPIO_Port, LCD_BL_EN_Pin);
    		    }
    }

    The code uses itoa() function which needs stdlib.h header file.

    itoa() function in C language converts the integer into ASCII digits which are stored in a buffer.

    itoa( integar_to_be_converted, Buffer_to_store_conversion, Base_system);

    You can choose the base system in itoa function. For conversion to decimal number system, you enter 10

    for binary, you can write 2.

    for hexadecimal, you can write 16.

    and so on.

  • ESP32 schematics

    This module contains an ESP32 Wroom 32d chip.

    Here is the schematics for this module.

  • How to interface potentiometer to ESP32 to read ADC Values

    Here is the simple code to read the ADC value and show it in the serial monitor of Arduino ide.

    const int Analog_channel_pin= 34;
    int ADC_VALUE = 0;
    float voltage_value = 0; 
    void setup() 
    {
    Serial.begin(115200);
    }
    void loop() 
    {
    ADC_VALUE = analogRead(Analog_channel_pin);
    Serial.print("ADC VALUE = ");
    Serial.println(ADC_VALUE);
    delay(1000);
    voltage_value = (ADC_VALUE * 3.3 ) / (4095);
    Serial.print("    Voltage = ");
    Serial.print(voltage_value);
    Serial.println("volts");
    delay(1000);
    }
    The output of serial monitor
  • Blown LM358P due to transients

    An LM358p is a dual opamp IC which I used in a single supply configuration. I drive the LM358 just shy of its absolute maximum voltage which is +30V. So I gave I supplied 28.8V (+-0.1V). It works flawless but the power supply is a Meanwell switching supply which introduces transient when plugging into the mains supply.

    The transient arise when I was plugging in the AC wire to the mains. I used an anchor 6A 3-pin male plug for connection. It was at the brief moment when the transient arise.

    The transient which arises apparently has enough power that it blew the epoxy off the silicon and it did with a loud bang.

    Blown LM358P due to transients

    Doing rough calculation at the moment this happened

    Let’s say the transient is double the supply voltage of = 2 x 28.9 V= 57.8V

    let’s say the current drawn by the IC is 40mA which is its absolute maximum.

    power = voltage x current = 57.8V x 40mA = 2.312W

    so for a brief moment, this 2W is radiated by the silicon chip. Which caused the heating up of the epoxy and generating enough expanding force which blew out like that.

    but let’s take a more reasonable transient voltage(ISO 7637-2: 2011) of approximately 110V at a rise time of 0.5uS.

    so power = 110V x 40mA = 4.4W .

  • FAKE BD139 NPN transistors

    I have recently found out that there are FAKE transistors in the market. I have a built a circuit design and when I bought the transistor from the Lajpat rai market in Delhi; I assembled the circuit on a test bench for measurements. But I was surprised that the BD139 did not work with 10mA at 30V and they began overheating. They heat up so much that bubbles appear on the front epoxy and it cracked. I thought that maybe it was damaged so I replaced the whole circuit with a new transistor set. But they also didn’t hold and this time they burnt a resistor along with them. I saw flames engulfing the 1/4 Watt resistors.

    So I again made the circuit using the minuscule BC546B. Which neither get warm nor went into thermal runaway.

    on the BD139 it was marked that it was manufactured by NXP. And I then checked the NXP website and found out that the NXP closed its manufacturing of this transistor in 2001.

    There are a lot of BD139 transistors circulating in the market. It is essential that you must buy from a good source.