Waveforms in 8051 Microcontroller


Square Wave
To create a square wave generation using Delay.
let us say we want to construct a 1khz square waveform
the processor instruction cycle of 8051 is 1.085microseconds
so for 1khz (1milli seconds =1/1khz), is 1ms/1.085microseconds = 921.6 (this value is set to the for loop)

#include <reg51.h>
void delay()
{
int i=0;
for(i=0;i<922;i++)
}
void main()
{
P0=0xff;
delay();
P0=0x00;
delay();
}
Sine Wave generation
Since sine wave is plotted in a digital device the number of samples determines the smoothness, hence in this case, more the samples, smoother is the waveform. so a lookup table is been created to get the samples. in the following examples, there are totally 36 samples are taken, starting from 0 degrees to 360 degrees with a step of 10 degrees
DegreesA = 5 (1+Sin theta)
Where 5 is the full scale voltage
DAC = 25.6 * A
05128
307.5192
609.3239
9010256
etc…like this we need to calculate for 13 samples  with a step of 30degree
// SINE WAVE
#include<reg51.h>
int main()
{
int j;
int c[37]={128,150,172,192,210,226,239,248,254,255,254,248,239,226,210,192,172,150,128,106,84,64,46,30,17,8,2,0,2,8,17,30,46,64,84,106,128};
while(1)
{
for(j=0;j<36;j++)
{
P1=c[j];
}
P1=128;
}}   


Triangular Waveform
//Triangular wave
#include<reg51.h>     
void main()
{
int j;
while(1)
{
for(j=0;j<256;j++)
{
P0=j;
}
for(j=255;j>0;j=j-2)
{
P0=j;
}
}
}

Saw tooth or Ramp Waveform
// SAWTOOTH WAVE
#include<reg51.h>
void main()
{
int j;
while(1)
{
for(j=0;j<256;j++)
{
P1=j;
}}}

Pulse Width Modulation (PWM) Generation in 8051
#include <reg51.h>
sbit pinpwm = P2^0;          
unsigned char PWM = 0;//PWM is the variable to alter the pulse width from 0 to 255     
unsigned int temp = 0;   
int main(void)
{
  P2=0x00;
    PWM = 0; //0% duty cycle        
//Initialize the timer
    TMOD &= 0xF0;   
    TMOD |= 0x01;   
   
    TH0 = 0x00;     
    TL0 = 0x00;     
   
    ET0 = 1;         //enable timer interrupt
    EA  = 1;         //enable all interrupts
   
    TR0 = 1;         // Start Timer 0
    PWM = 220;       //a duty cycle of 220/256
  while(1)       
  {}
}
// Timer0 ISR
void Timer0_ISR (void) interrupt 1  
{
    TR0 = 0;    // Stop Timer 0
    if(pinpwm)    // if high
    {
        pinpwm= 0;
        temp = (255-PWM); //this is in decimal
        TH0  = 0xFF;
        TL0  = 0xFF - temp&0xFF;    //to handle in hex
    }
    else         // else if low
    {
        pinpwm = 1;
        temp = PWM;
        TH0  = 0xFF;
        TL0  = 0xFF - temp&0xFF;
    }
    TF0 = 0;     // Clear the interrupt flag
    TR0 = 1;     // Start Timer 0
}

Here the PWM Waveform is generated with a duty cycle of 220/256(86%) duty cycle. PWM are advantageous in controlling the power to machines be reducing the supply voltage by altering the pulse width.
Duty Cycle means, the time percentage for which the duty is done. in the image show above, the high waveform for 86% and low waveform (0) for 14%.


Pradeep Kumar TS

Comments

Popular Posts