robot1
Elect. Analogica
Elect. Digital
Pro. Mecatronicos
Info. de Interes
Regresar
Regresar
Regresar
Ingeniero Fernando Ruiz
Proyectos Mecatronicos
Contacto
© www.ingenierofernandoruiz.com 2011. Website Design by Fernando Ruiz Version 2.0

Electronica Digital: Indice

Generacion de ondas con un microcontrolador

  • Onda diente de Sierra
  • Onda cuadrada
  • Onda triangular
  • Generador de ondas (triangular,cuadrada y triangular)
  • Generador de ondas con modulacion de frecuencia y amplitud(triangular,cuadrada y triangular)
  • Generador de ondas con modulacion de frecuencia y amplitud auxiliado con un arreglo de variables(triangular,cuadrada y triangular)

Control de Displays de 7 segmentos

  • Prueba de funcionamiento de los display de 7 segmentos
  • Cronometro sencillo
  • Cronometro con botones de inicio,pause,reset y potenciometro de variacion de tiempo
  • Examen de programacion (despliege de matriculas y conversion ADC en displays-5V a 1023bits)

 

Ingeniero Fernando Ruiz

comentarios y sugerencias blog

Publicacion 4 de marzo 2011

Generacion de Ondas con un microcontrolador (PIC)

Introduccion

Acontinuacion presento las practicas de laboratorio de electronica, en este caso mediante un arreglo de resistencias y un microcontrolador generamos ondas, que visualizaremos mediante un osciloscopio. En este documento se muestra la lista de componente electonicos, el diagrama de conexion y el codigo de programa para cada practica. Espero que sea de utilidad

Desarrollo

Programas que desarrollamos para generar ondas y una breve explicacion

Onda diente de Sierra .- Genera una onda de sierra

Onda cuadrada.- Genera una onda cuadrada

Onda triangular.- Genera una onda triangular

Generador de ondas (triangular,cuadrada y triangular).- mediante 3 botones desplegamos las 3 ondas anteriores.

Generador de ondas con modulacion de frecuencia y amplitud(triangular,cuadrada y triangular).-mediante 3 botones desplegamos las 3 ondas anteriores y con dos potenciometros variamos la amplitud y la frecuencia de la onda.

Generador de ondas con modulacion de frecuencia y amplitud auxiliado con un arreglo de variables(triangular,cuadrada y triangular).--mediante 3 botones desplegamos las 3 ondas anteriores que se guardaron previamente en una variable de tipo arreglo y con dos potenciometros variamos la amplitud y la frecuencia de la onda.

Software

  • PIC C compiler
  • Pickit2 v2.61

Material

  • Pic18f2620
  • 10 resistencias de 10k
  • 10 resistencias de 22k
  • cable para protoboar
  • Osciloscopio
  • Pickit2 (cable programador )
  • Protoboard
  • 3 push bottons

Diagramas de conexion

Circuito simple para progrmas sin variacion de frecuencia y Amplitud

dia1

 

Circuito de conexion para programas de variacion de frecuencia y Amplitud

 

dia2

Programacion

Onda diente de Sierra. (Codigo C)

#include <18F2620.h>
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81 //data memory organization tablita
//declaracion de variables
int x;

void main()
{
set_tris_b(0); // 0=output-salida 1=input-entrada //puertos del b 8 -->binario(0b00000000)todo salida ----255 todos entrada
//while(1){}for(;;){}ciclos infinitos
for(;;)
{PuertoB=x;
x++;
delay_us(100);
//if(x>255) {borrar}
}
}

Fotos

c2

Onda diente de sierra generada por el PIC.

Onda cuadrada. (Codigo C)

#include <18F2620.h>
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81 //data memory organization tablita

//declaracion de variables
int x;
int16 tiempo=500; //valor maximo 2 a la 16 = 65635

void main()
{
set_tris_b(0); // 0=output-salida 1=input-entrada //puertos del b 8 -->binario(0b00000000)todo salida ----255 todos entrada
//while(1){}for(;;){}ciclos infinitos
for(;;)
{
PuertoB=0;
delay_us(tiempo);
PuertoB=255;
delay_us(tiempo);

}

}

Fotos

c1

Onda Cuadrada Generada por el PIC .

Onda triangular. (Codigo C)

#include <18F2620.h>
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81 //data memory organization tablita

//declaracion de variables
int x;

void main()
{
set_tris_b(0); // 0=output-salida 1=input-entrada //puertos del b 8 -->binario(0b00000000)todo salida ----255 todos entrada
//while(1){}for(;;){}ciclos infinitos
for(;;)
{
for(x=0;x<255;x++)
{
PuertoB=x;
delay_us(100);
}
for(x=255;x>0;x--)
{
PuertoB=x;
delay_us(100);
}

}
}

 

Generador de ondas. (triangular,cuadrada y triangular). (Codigo C)

#include <18F2620.h>
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81 //data memory organization tablita

//declaracion de variables
int x;
int16 tiempo=500; //valor maximo 2 a la 16 = 65635

void main()
{
set_tris_b(0); // 0=output-salida 1=input-entrada //puertos del b 8 -->binario(0b00000000)todo salida ----255 todos entrada
set_tris_a(255);
for(;;)
{
if(input(pin_a0)==1)
{
//ejecutar onda diente de sierra
PuertoB=x;
x++;
delay_us(1000);
}
if(input(pin_a1)==1)
{
//ejecutar onda Triangular
for(x=0;x<255;x++)
{
PuertoB=x;
delay_us(500);
}
for(x=255;x>0;x--)
{
PuertoB=x;
delay_us(500);
}
}
if(input(pin_a2)==1)
{
//ejecutar onda cuadrada
for(x=0;x<255;x++)
{
PuertoB=0;
delay_us(500);
}
for(x=255;x>0;x--)
{
PuertoB=255;
delay_us(500);
}
}

}
}

Video

Generador de ondas con modulacion de frecuencia y amplitud(triangular,cuadrada y triangular) Codigo C

#include <18F2620.h>
#Device ADC=10 //int16 necesario para variables
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81 //data memory organization tablita
#Define AN3,AN4

int16 tiempo,Amplitud;
int x;

void main()
{
set_tris_b(0); // 0=output-salida 1=input-entrada //puertos del b 8 -->binario(0b00000000)todo salida ----255 todos entrada
set_tris_a(255);
setup_adc(ADC_CLOCK_INTERNAL);


for(;;)
{
set_adc_channel(3);
delay_us(20);
tiempo=read_adc();
set_adc_channel(4);
delay_us(20);
Amplitud=read_adc()/4;

if(input(pin_a0)==1)
{
//ejecutar onda diente de sierra
for(x=0;x<Amplitud;x++)
{
PuertoB=x;
delay_us(tiempo);
}
}
if(input(pin_a1)==1)
{
//ejecutar onda Triangular
for(x=0;x<Amplitud;x++)
{
PuertoB=x;
delay_us(tiempo);
}
for(x=Amplitud;x>0;x--)
{
PuertoB=x;
delay_us(tiempo);
}
}
if(input(pin_a2)==1)
{
//ejecutar onda cuadrada

PuertoB=0;
delay_us(tiempo*1000);
PuertoB=Amplitud;
delay_us(tiempo*1000);
}

}
}

Video

 

Generador de ondas con modulacion de frecuencia y amplitud auxiliado con un arreglo de variables(triangular,cuadrada y triangular) Codigo C

#include <18F2620.h>
#Device ADC=10 //int16 necesario para variables
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81 //data memory organization tablita
#Define AN3,AN4

int16 tiempo,Amplitud;
int x;
byte const Osierra[255]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,

51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,

104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,

144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,

184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,

224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254};
byte const Ocuadrada[255]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,

254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,

254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,

254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254};
byte const Otriangular[255]={0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,

96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,

176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254

,254,252,250,248,246,244,242,240,238,236,234,232,230,228,226,224,222,220,218,216,214,212,210,208,206,204,202,200,198,196,194,192,190,188,186,184,182,180,178,176,

174,172,170,168,166,164,162,160,158,156,154,152,150,148,146,144,142,140,138,136,134,132,130,128,126,124,122,120,118,116,114,112,110,108,106,104,102,100,98,96,94,

92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,62,60,58,56,54,52,50,48,46,44,42,40,38,36,34,32,30,28,26,24,22,20,18,16,14,12,10,8,6,4,2};


void main()
{
set_tris_b(0);
set_tris_a(255);
setup_adc(ADC_CLOCK_INTERNAL);

for(;;)
{

set_adc_channel(3);
delay_us(20);
tiempo=read_adc();
set_adc_channel(4);
delay_us(20);
Amplitud=read_adc()/4;

if(input(pin_a0)==1)
{
//onda cuadrada
for(x=0;x<Amplitud;x++)
{
PuertoB=Ocuadrada[x];
delay_us(tiempo);
}
}
if(input(pin_a1)==1)
{
//onda tringular
for(x=0;x<Amplitud;x++)
{
PuertoB=Otriangular[x];
delay_us(tiempo);
}
}
if(input(pin_a2)==1)
{
//onda Diente de sierra
for(x=0;x<Amplitud;x++)
{
PuertoB=Osierra[x];
delay_us(tiempo);

}
}

}

}

Control de Display de 7 segmentos

Introduccion

Acontinuacion presento 4 practicas de laboratiorio de electronica digital, en las que trabajamos programando el microprocesador PIC18f2620 con la finalidad de manipular displays de 7 segmentos a nuestro gusto. Este documento contiene la lista de componetes electronicos,el diagrama de conexion , el codigo del programa en C, fotos y videos del trabajo.

Desarrollo

Explicacion breve.-

Prueba de funcionamiento de los display de 7 segmentos.- En esta practica el programa controla los 4 displays para que muestren los numeros del 0 al 9 cambiando de numero cada segundo. Solo es un programa para que use para verficar el buen funcionamiento de todos los displays .

Cronometro sencillo.- En esta practica al energizar el microcontrolador se activan los 4 displays y se empieza a contar el tiempo, es decir, el primer display de la derecha aumenta un segundo hasta llegar a 9 , luego el segundo display aumenta 1 y espera que el primer display vuelva a contar hasta 9 para aumentar otra unidad, esto hasta llegar la cuenta hasta 59 y luego el tecer display aumenta y asi sucesivamente como un cronometro normal.

Cronometro con botones de inicio,pause, reset y potenciometro para regulacion de tiempo.- En esta practica al energizar el programa se muestran ceros en los displays, al presionar el boton de inicio el cronometro empieza a funcionar normamente. Si se presiona el boton de pause el display mantiene la cuenta hasta soltarse.Cuando se presiona el boton de reset la cuenta se borra y se despliegan ceros. El potenciometro sirve para aumentar o disminuir la velocidad de avance del cronometro.

Examen de programacion (despliege de matriculas y conversion ADC en displays-5V a 1023bits).- Este fue mi examen de electronica analogica en el primer periodo, tube que mostrar mi matricula al presionar un boton, la de un compañero con otro boton y con el tercer boton se mostraba la conversion ADC , es decir, los bits que producia un voltaje regulado por un potenciometro de 0 a 5 volts, en bits eran de 0 a 1023 porque trabajamos con 10bits el ADC.

 

Software

  • PIC C compiler
  • Pickit2 v2.61

Material

  • Pic18f2620
  • 3 resistencias de 10k
  • 1 potenciometro
  • 4
  • 4 resistencias de 220ohm
  • cable para protoboar
  • 4 Display de 7 segmentos Catodo
  • Pickit2 (cable programador )
  • Protoboard
  • 4 transistores 2n2222 (npn)
  • 3 push bottons

Diagramas de conexion

Circuito del cronometro

dia2

Programacion

Prueba de funcionamiento de los display de 7 segmentos. (Codigo C)

#include <18F2620.h>
#Device ADC=10 //int16 necesario para variables
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81
#bit Display1=0xf82.0
#bit Display2=0xf82.1
#bit Display3=0xf82.2
#bit Display4=0xf82.3
int x;
byte const numero1[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01100111};
void main()
{
for(;;)
{
set_tris_c(0);
set_tris_b(0);
for(x=0;x<10;x++)
{
PuertoB=numero1[x];
Display1=1;
Display2=1;
Display3=1;
Display4=1;
delay_ms(1000);
Display1=0;
Display2=0;
Display3=0;
Display4=0;
}
}
}

Foto

f1

 

Cronometro sencillo. (Codigo C)

#include <18F2620.h>
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81
#bit Display1=0xf82.0
#bit Display2=0xf82.1
#bit Display3=0xf82.2
#bit Display4=0xf82.3

int x=0,y=0,w=0,z=0,c1=0;

byte const numero[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01100111};

//desplegar de 1 al 9

void main()
{
for(;;)
{
set_tris_c(0);
set_tris_b(0);
for(;;)
{
for(x=0;x<10;x++)
{
while(c1<250)
{
PuertoB=numero[x];
Display1=1;
Delay_ms(1);
Display1=0;
//
PuertoB=numero[y];
Display2=1;
Delay_ms(1);
Display2=0;
//
PuertoB=numero[w];
Display3=1;
Delay_ms(1);
Display3=0;
//
PuertoB=numero[z];
Display4=1;
Delay_ms(1);
Display4=0;
c1++;
}
c1=0;

if(x>=9)
{
y++;

if(y>=6)
{
y=0;
w++;

if(w>=9)
{
w=0;
z++;
}
}
}
}
}
}
}

Fotos

f2

 

Cronometro con botones de inicio,pause,reset y potenciometro para regulacion de la velocidad de avance(Codigo C)

#include <18F2620.h>
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81
#bit Display1=0xf82.0
#bit Display2=0xf82.1
#bit Display3=0xf82.2
#bit Display4=0xf82.3
#define AN3

int x=0,y=0,w=0,z=0,c1=0,tiempo;

byte const numero[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01100111};

//desplegar de 1 al 9

void main()
{
set_tris_c(0);
set_tris_b(0);
set_tris_a(255);
setup_adc(ADC_CLOCK_INTERNAL);
for(;;)
{


while(input(pin_a0)==0)
{
PuertoB=numero[0];
Display1=1;
Delay_ms(1);
Display1=0;
//
PuertoB=numero[0];
Display2=1;
Delay_ms(1);
Display2=0;
//
PuertoB=numero[0];
Display3=1;
Delay_ms(1);
Display3=0;
//
PuertoB=numero[0];
Display4=1;
Delay_ms(1);
Display4=0;
}

while(1)
{

for(x=0;x<10;x++)
{
set_adc_channel(3);
tiempo=read_adc();
while(c1<(250/tiempo))
{
PuertoB=numero[x];
Display1=1;
Delay_ms(1);
Display1=0;
//
PuertoB=numero[y];
Display2=1;
Delay_ms(1);
Display2=0;
//
PuertoB=numero[w];
Display3=1;
Delay_ms(1);
Display3=0;
//
PuertoB=numero[z];
Display4=1;
Delay_ms(1);
Display4=0;
c1++;
while(input(pin_a1)==1)
{
PuertoB=numero[x];
Display1=1;
Delay_ms(1);
Display1=0;
//
PuertoB=numero[y];
Display2=1;
Delay_ms(1);
Display2=0;
//
PuertoB=numero[w];
Display3=1;
Delay_ms(1);
Display3=0;
//
PuertoB=numero[z];
Display4=1;
Delay_ms(1);
Display4=0;
}
if(input(pin_a2)==1)
{
x=0;
w=0;
y=0;
z=0;
}

}

c1=0;
if(x>=9)
{
y++;

if(y>=6)
{
y=0;
w++;

if(w>=9)
{
w=0;
z++;
}
}
}

}


}
}
}

Foto

f3

Video

 

 

Examen de programacion (despliege de matriculas,conversion ADC y despliege en displays- 5V a 1023bits) . (Codigo C)

#include <18F2620.h>
#device ADC=10
#fuses INTRC,NOMCLR,NOBROWNOUT //INTRC= CRISTAL INTERNO ,NOMCLR= NO RESET
#use delay (internal=8M) //31 hz hasta 8 megas
#byte PuertoB=0xf81
#bit Display1=0xf82.0
#bit Display2=0xf82.1
#bit Display3=0xf82.2
#bit Display4=0xf82.3
#define AN3

int m,c,d,u,r,r1,r2;
int16 a;

byte const fer[4]={0b00000110,0b01001111,0b01100110,0b01011011};//1342
byte const wero[4]={0b00000110,0b01100110,0b01111101,0b01100111};//1469
byte const numero[10]={0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01100111};

void main()
{
set_tris_c(0);
set_tris_b(0);
set_tris_a(255);
setup_adc(ADC_CLOCK_INTERNAL);
for(;;)
{
if(input(pin_a0)==1)
{
while(input(pin_a1)==0 && input(pin_a2)==0)
{
//matricula fer 1342
PuertoB=fer[3];
Display1=1;
Delay_ms(1);
Display1=0;
//
PuertoB=fer[2];
Display2=1;
Delay_ms(1);
Display2=0;
//
PuertoB=fer[1];
Display3=1;
Delay_ms(1);
Display3=0;
//
PuertoB=fer[0];
Display4=1;
Delay_ms(1);
Display4=0;
}
}
if(input(pin_a1)==1)
{
while(input(pin_a0)==0 && input(pin_a2)==0)
{
//matricula Wero 1469
PuertoB=wero[3];
Display1=1;
Delay_ms(1);
Display1=0;
//
PuertoB=wero[2];
Display2=1;
Delay_ms(1);
Display2=0;
//
PuertoB=wero[1];
Display3=1;
Delay_ms(1);
Display3=0;
//
PuertoB=wero[0];
Display4=1;
Delay_ms(1);
Display4=0;
}

}
if(input(pin_a2)==1)
{
while(input(pin_a0)==0 && input(pin_a1)==0)
{
set_adc_channel(3);
a=read_adc();//1123
if(a>=1000)
{
m=a/1000; //da 1 millares
r=a%1000;// residuo 123=r
c=r/100;// da 1 centenas
r1=r%100;// residuo1 23=r1
d=r1/10;// da 2 decenas
r2=r1%10;// residuo 3=r2
u=r2;
}
if(a<1000 && a>=100)
{
c=a/100;// da 1 centenas
r1=a%100;// residuo1 23=r1
d=r1/10;// da 2 decenas
r2=r1%10;// residuo 3=r2
u=r2;
m=0;
}
if(a<100 && a>=10)
{
d=a/10;// da 2 decenas
r2=a%10;// residuo 3=r2
u=r2;
c=0;
m=0;

}
if(a<10)
{
u=a;
m=0;
c=0;
d=0;
}


//Conversion ADC
PuertoB=numero[u];
Display1=1;
Delay_ms(1);
Display1=0;
//
PuertoB=numero[d];
Display2=1;
Delay_ms(1);
Display2=0;
//
PuertoB=numero[c];
Display3=1;
Delay_ms(1);
Display3=0;
//
PuertoB=numero[m];
Display4=1;
Delay_ms(1);
Display4=0;
}

}

}
}

Video

 

 
a2
aa3
aa4
aa5
aaa6
aa7
aa7
Regresar
   
 
A I