Fuente de alimentacion de 5V
Encontrar ayuda e información de circuitos programación de microcontroladores paso a paso para que todo usuario pueda realizar los ejemplos
lunes, 10 de octubre de 2011
Modulo adaptador rs232
Modulo adaptador rs232
Todos hemos visto que las computadoras tienen puertos de comunicación, que inclusive ocupamos muchas veces sin siquiera saber cómo trabajan, tal es el caso del puerto serie, al cual en la antigüedad de las computadoras le conectábamos el ratón, o un fax MODEM externo, o inclusive una impresora.Convertidor de analogico a digita
Convertidor de analogico a digital esta configuración produce una señal cuya tensióndepende del número de pulsos aplicadosa la entrada. Podemos obtener niveles escalonados de 0 a 7, en función de los pulsos de entrada.
lunes, 3 de octubre de 2011
Multimetro digital de 0 a 5v
Es un circuito que mide la tensión de 0 a 5v por medio de un microcontrolador 16f876 y la muestra en una LCD en este ejemplo estoy utilizando un potencimetro para demostrar que funciona y ademas muestra el convertidor de analógico a digital.
#include <16F876.h>
#device adc=10
#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)
#include <LCD.C>
void main() {
int16 q;
float p;
setup_adc_ports(AN0); //Canal 0 analógico
setup_adc(ADC_CLOCK_INTERNAL); //Fuente de reloj RC
lcd_init();
for (;;) {
set_adc_channel(0); //Habilitación canal0
delay_us(20);
q = read_adc(); //Lectura canal0
p = 5.0 * q / 1024.0; //Conversión a tensión
printf(lcd_putc, "\fADC = %4ld", q);
printf(lcd_putc, "\nVoltage = %01.2fV", p);
delay_ms(100);
}
Barómetro y altímetro
Mediante el uso de el sensor mpx4115 y el microcontrolador 16f876 recuerden que también funciona con el 16f870 la altitud y la presión y el promedio de la temperatura en la que se encuentra en algún cierto punto de la tierra. recuerde que este circuito funciona solamente con este tipo de sensor. al final de la pagina tienen el link para descargar el circuito y el programa.
#include <16F876.h>
#device adc=10
#FUSES XT,NOWDT
#FUSES
#use delay(clock=4000000)
#include <math.h>
#include <LCD.C>
#BYTE TRISA = 0x85
#BYTE PORTA = 0x05
void main() {
int16 q;
float tv,tr,temp,y,tf,error; //Variables ecuaciones
float p,presion,pres_atm,pres_psi,alt; //Variables cálculo presión y altura
int cnt=0;
bit_set (TRISA , 2);
setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0 y RA1 analógica, RA2 digital
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
for (;;) {
set_adc_channel(0); //Lectura presión en voltios
delay_us(20);
q = read_adc();
p = 5.0 * q / 1024.0;
presion= (0.475+p)/0.045; //Lectura presión en Kpa
set_adc_channel(1); //Lectura temperatura
delay_us(20);
q = read_adc();
tv = 5.0 * q / 1024.0;
tr = tv * 10000.0 / (5.0 - tv);
y = log(tr/20000.0);
y = (1.0/298.15) + (y *(1.0/4050.0));
temp=1.0/y;
temp = temp -273.15;
if (temp>=0 && temp<=85) TF=1.0;
else TF=3.0;
ERROR = TF * 1.5; //Cálculo del error de presión con la temperatura
//el error puede ser ± pero aquí usamos - o +
presion=presion-ERROR; //Presión en Kpa
pres_atm = presion * 0.0098692; //Presión en Atm
pres_psi = presion * 0.1450377; //Presión en Psi
alt = -7990.652789*log(presion/101.304); //Altura
if (BIT_TEST(PORTA,2)==0) cnt++; //Calcular número veces pulsa botón
if (cnt>=4) cnt=0;
Switch (cnt) { //Según número veces pulsa botón se elige menú
case 0:
lcd_gotoxy(1,1);
printf(lcd_putc, "\P= %5.2f Kpa ", PRESION);
printf(lcd_putc,"\nT = %04.2f C", temp);
break;
case 1:
lcd_gotoxy(1,1);
printf(lcd_putc, "\P= %4.2f atm ", PRES_atm);
printf(lcd_putc,"\nT = %04.2f C", temp);
break;
case 2:
lcd_gotoxy(1,1);
printf(lcd_putc, "\P= %3.2f psi ", PRES_psi);
printf(lcd_putc,"\nT = %04.2f C", temp);
break;
case 3:
lcd_gotoxy(1,1);
printf(lcd_putc, "\Alt= %7.2f m ", alt);
printf(lcd_putc,"\nT = %04.2f C", temp);
break;
}
delay_ms(100);
}}
domingo, 2 de octubre de 2011
control de velocidad de motor cc
Es un circuito mediante un teclado se puede controlar la velocidad del motor tiene 10 velocidades distintas en las cueles pude girar le dejo el circuito y el programa para descargarlo
#include <16f876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#USE DELAY (CLOCK=4000000)
#INCLUDE <MI_kbd.C>
#include <MI_lcd.c>
#USE STANDARD_IO (a)
int16 counter=0;
//*************** INT TIMER1*********************
#int_TIMER1
void TIMER1_isr(void) {
counter=get_timer0(); //Lectura contador TMR0
counter=counter*2*120; //Conversión a rpm
printf(lcd_putc,"%6lu rpm",counter);
lcd_gotoxy(1,1);
set_timer0(0); //Reinicia cuenta
set_timer1(3036); // Recarga a 0.5s
}
//**********************************************
VOID MAIN()
{
CHAR K,kant='0';
char PWMH=0,PWML=0;
lcd_init();
kbd_init();
PORT_B_PULLUPS(TRUE);
setup_timer_0(rtcc_ext_l_to_h|RTCC_DIV_2); //Configuración TMR0
setup_timer_1(T1_internal|T1_DIV_BY_8); //Configuración TMR1
set_timer0(0); //Borrado contador
set_timer1(3036); //Carga a 0.5s
enable_interrupts(int_timer1);
enable_interrupts(global); //Habilitación interrupciones
WHILE (1) {
k=kbd_getc();
if (k=='\0') k=kant;
if ((k=='*') || (k=='#')) k='0';
kant=k;
k=k-48;
PWMH=k*28;
PWML=255-PWMH;
for(PWMH;PWMH>0;PWMH--){
OUTPUT_HIGH(PIN_A0);}
for(PWML;PWML>0;PWML--){
OUTPUT_LOW(PIN_A0);}
}}
#include <16f876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#USE DELAY (CLOCK=4000000)
#INCLUDE <MI_kbd.C>
#include <MI_lcd.c>
#USE STANDARD_IO (a)
int16 counter=0;
//*************** INT TIMER1*********************
#int_TIMER1
void TIMER1_isr(void) {
counter=get_timer0(); //Lectura contador TMR0
counter=counter*2*120; //Conversión a rpm
printf(lcd_putc,"%6lu rpm",counter);
lcd_gotoxy(1,1);
set_timer0(0); //Reinicia cuenta
set_timer1(3036); // Recarga a 0.5s
}
//**********************************************
VOID MAIN()
{
CHAR K,kant='0';
char PWMH=0,PWML=0;
lcd_init();
kbd_init();
PORT_B_PULLUPS(TRUE);
setup_timer_0(rtcc_ext_l_to_h|RTCC_DIV_2); //Configuración TMR0
setup_timer_1(T1_internal|T1_DIV_BY_8); //Configuración TMR1
set_timer0(0); //Borrado contador
set_timer1(3036); //Carga a 0.5s
enable_interrupts(int_timer1);
enable_interrupts(global); //Habilitación interrupciones
WHILE (1) {
k=kbd_getc();
if (k=='\0') k=kant;
if ((k=='*') || (k=='#')) k='0';
kant=k;
k=k-48;
PWMH=k*28;
PWML=255-PWMH;
for(PWMH;PWMH>0;PWMH--){
OUTPUT_HIGH(PIN_A0);}
for(PWML;PWML>0;PWML--){
OUTPUT_LOW(PIN_A0);}
}}
Cerradura electrónica
Mediante un teclado matricial se puede enviar caracteres al microcontrolador la contraseña se guarda en la memoria Eeprom del microcontrolador mediante un relevador puedes activar cualquier cosa para que funcione con un código es 723 les dejo el circuito y el programa par descargarlo al final de la pagina
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use standard_io(a)
#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>
#rom 0x2100={'7','2','3'} //Posición 0,1 y 2 de la Eeprom con los datos…
//7,2, y 3 respectivamente
void main() {
char k;
int i;
char data[3], clave[3]; //Matrices para guardar clave y datos
lcd_init();
kbd_init();
port_b_pullups(TRUE);
while (TRUE) {
i=0; //posición de la matriz
printf(lcd_putc,"\fpulsar tecla 1\n"); //Para primer dato
while(i<=2){ //Para tres datos
k=kbd_getc(); //Lee el teclado
if (k!=0) //Si se ha pulsado alguna tecla
{data[i]=k; //se guarda en la posición correspondiente
i++; //de la matriz
printf(lcd_putc,"\fpulsar tecla %u\n",i+1); //Siguiente dato
}
}
for (i=0;i<=2;i++) { //Pasa datos de eeprom a la matriz clave
clave[i]=read_eeprom(i);}
if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
{ printf(lcd_putc,"\fPuerta Abierta"); //Compara los datos con la clave
output_high(PIN_A0); //Si es igual da pulso al relé
delay_ms(500);
output_low(PIN_A0);}
else printf(lcd_putc,"\fPuerta Cerrada"); //Clave erronea
delay_ms(1000);
}}
#include <16F876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use standard_io(a)
#include <lcd.c>
#include <kbd.c>
#include <stdlib.h>
#rom 0x2100={'7','2','3'} //Posición 0,1 y 2 de la Eeprom con los datos…
//7,2, y 3 respectivamente
void main() {
char k;
int i;
char data[3], clave[3]; //Matrices para guardar clave y datos
lcd_init();
kbd_init();
port_b_pullups(TRUE);
while (TRUE) {
i=0; //posición de la matriz
printf(lcd_putc,"\fpulsar tecla 1\n"); //Para primer dato
while(i<=2){ //Para tres datos
k=kbd_getc(); //Lee el teclado
if (k!=0) //Si se ha pulsado alguna tecla
{data[i]=k; //se guarda en la posición correspondiente
i++; //de la matriz
printf(lcd_putc,"\fpulsar tecla %u\n",i+1); //Siguiente dato
}
}
for (i=0;i<=2;i++) { //Pasa datos de eeprom a la matriz clave
clave[i]=read_eeprom(i);}
if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2]))
{ printf(lcd_putc,"\fPuerta Abierta"); //Compara los datos con la clave
output_high(PIN_A0); //Si es igual da pulso al relé
delay_ms(500);
output_low(PIN_A0);}
else printf(lcd_putc,"\fPuerta Cerrada"); //Clave erronea
delay_ms(1000);
}}
Contador de 0 al 99
Este circuito muestra el conteo de 0 al 99 mediante los display de 7 segmentos es realmente sencillo y fácil de programar con el microcontrolador 16f876.
#include <16F876.h>
#USE DELAY( CLOCK=4000000)
#FUSES XT,NOWDT,NOPROTECT,NOPUT
#USE fast_IO (B)
#USE fast_IO (A)
byte CONST DISPLAY[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
main(){
byte ud=0,dec=0;
SET_TRIS_B(0x00);
SET_TRIS_A(0x00);
OUTPUT_B(0);
for( ;; ){
for (dec=0;dec<10;dec++){ //Cuenta digito decenas
for (ud=0;ud<10;ud++){
OUTPUT_A(0x02); //cat_D=apagado,cat_U=encendido
OUTPUT_B(DISPLAY[ud]); //Digito unidades
delay_ms(50); //Para evitar parpadeos
if (dec==0) output_a(0x03); //Si decenas=0, cat_D=apagado
else output_a(0x01); //Si decenas>0, cat_D=encendido
OUTPUT_B(DISPLAY[dec]); //Digito decenas
delay_ms(50); //Para evitar parpadeos
}}}}
Contador del 0 al 255
Este es un contador con el microcontrolador 16f84a cuenta del 0 al 255 mediante un botón se puede contar los pulsos de entrada y se muestran el la LCD, el botón se puede reemplazar por cualquier sensor que trabaje de 0 a 5 V se puede cambiar el programa para que pueda contar mas 255 cambiando la variable que se usa en el programa en ccs. Y como ya saben les dejo la simulación y el circuito en proteus.
# include <16f84a.h>
# fuses XT,NOWDT
# use delay (clock= 4000000)
# include <LCD.C>
void main (){
char valor = 0;
char n_valor = 255;
lcd_init();
for (;;){
if (input (PIN_A4) == 0){
valor++;
delay_ms(100);}
if (valor > (n_valor-1)){
valor = 255;}
printf (lcd_putc,"\f CONTADOR",);
printf (lcd_putc,"\n %1u" ,valor ,);
delay_ms(300);
}}
Comunicación rs232 del pic a pc
A continuación se muestra el programa como pueden ver es realmente sencillo hacer este tipo de programas sola la variable prende es suficiente para enviar la información de todo el puerto a la pc. como ya lo saben les dejo el archivo simulado en proteus y el programa en ccs a final de esta pagina,es un archivo Wirar lo tienen que descomprimir suerte.
# include <16f873a.h>
# fuses XT,NOWDT
# use delay (clock= 4000000)
# use rs232(baud=9600, xmit = pin_c6, rcv=pin_c7, bits=8, parity=n)
void main () {
int prende;
while (1){
prende = input_b ();
printf(" PUERTO_B = %LX",prende);
delay_ms(500);} }
¿Qué es Mecatrónia?
MECATRÓNICA: Mecatrónica es la integración cinegética de la ingeniería mecánica con la electronica y con el control de computadores inteligentes para el diseño y la manufactura de productos y procesos. un ingeniero en mecatrónica es capaz de resolver problemas dentro y fuera de las industrias es capaz de realizar nuevos prototipos tecnologicos,
El termino "mecatrónica" fue acuñado en Japón a principios de los 80’s y comenzó a ser usado en Europa y USA un poco después.
D'vinci como un hombre que utilizaba su ingenio y sus conocimientos para crear los mas diversos inventos y aparatos a un Arquímedes que proponía ya sistemas de propulsión y control a maxwell que proponía la integración de las ciencias; todos estos hombres tenían algo en común contaban con un equipo interdisciplinario y se comprendían con el {sabían el lenguaje de todos.} A esto se refiere la mecatrónica que queremos hacer en la universidad y es el termino que define mejor el perfil del ingeniero que este tiempo necesita.
Sistema de riego
A continuación les demostrare como hacer un sistema de riego con el microcontrolador 16f873a controlando la hora de riego y el tiempo de riego por medio de un reloj digital y además tendrá un termómetro digital. Demostrando las variables en una lcd .
Bueno a continuación demostrare el programa en ccs le recomendaría que simularan este circuito en proteus 7 profesional. Para que se den una idea del funcionamiento del programa.
Programa en ccs y además les dejare el archivo .hex para cargarlo al microcontrolador solo que no tengo un espacio donde subir mis archivos para descargar pero les dejo el código maquina solo tienen que copiarlo en el bloc de notas y guardarlo con la extensión .hex y listo tienen su programa para cargarlo al microcontrolador suerte.
#include <16F873a.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
int segundos,minutos,horas,temperatura;
int seg=0;
int n_horas=24;
int n_minutos =60;
int prende= 0;
int ehoras,eminutos;
int ahoras,aminutos;
//INTERRUPCION//
#int_rtcc //Habilita interrupción timer0
void interrupt_timer(void){
seg++;
if(seg==59){ //Condición de cambio
segundos++; // cuenta 1 segundo
seg=0;
delay_ms(300);
}}
void main(void){
setup_adc_ports(RA0_ANALOG);// configura RA0 como entrada analogica
set_tris_a(0xff);
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //Configura timer0 y prescaler
set_timer0(131); //Inicializa timer0
enable_interrupts(INT_RTCC); //Habilita interrupción timer0
enable_interrupts(GLOBAL); //Habilita Interrupciones
lcd_init(); // inicializa el LCD
set_adc_channel(0);
delay_us(1000);
while(true){
temperatura=read_adc(); //lee valor analogico
if (input (PIN_A1) == 0){
horas++;
delay_ms(100);}
if (input (PIN_A2) == 0){
minutos ++;
delay_ms(100);}
if (horas > (n_horas-1)){
horas = 0;}
if (minutos > (n_minutos-1)){
minutos = 0;}
if (input (PIN_A3) == 0){
ehoras++;
delay_ms(100);}
if (input (PIN_A4) == 0){
eminutos ++;
delay_ms(100);}
if (ehoras > (n_horas-1)){
ehoras = 0;}
if (eminutos > (n_minutos-1)){
eminutos = 0;}
if (input (PIN_A5) == 0){
ahoras++;
delay_ms(100);}
if (input (PIN_C0) == 0){
aminutos ++;
delay_ms(100);}
if (ahoras > (n_horas-1)){
ahoras = 0;}
if (aminutos > (n_minutos-1)){
aminutos = 0;}
if(segundos>59){
segundos=0;
minutos++;
if(minutos>59)
{
minutos=0;
horas++;
if(horas>24)
horas=0;
} } {
if ((horas == ehoras)&& (minutos == eminutos))
((output_high(PIN_C2))&& (output_high(PIN_C3)));
if ((horas == ahoras)&& (minutos == aminutos))
((output_low(PIN_C2))&& (output_low(PIN_C3)));
}
printf (lcd_putc,"\fH:%02u:%02u Temp:%d%cC" ,horas,minutos,temperatura*2,0xdf);
printf (lcd_putc,"\nE:%02u:%02u A:%02u:%02u" ,ehoras,eminutos,ahoras,aminutos);
delay_ms(500);
}}}
//fin del programa ccs
Aquí tienen todos los archivos de la simulación en proteus y ademas el programa en ccs .
Suscribirse a:
Entradas (Atom)