MICROCONTROLADORES

BÁSCULA CON PIC16F1937 Y LCD.

Saludos Compañeros.

En este post les entregamos un circuito electrónico que ilustra el funcionamiento de una báscula.

Esta tiene una capacidad de peso máxima de 0 a 80 kg

Se empleó un microcontrolador PIC 16F1937 para esta aplicación en concreto

Se implementó una celda simulada en proteus en conjunto con un amplificador de instrumentación AD620 el cual nos ofreció una mejor resolución en la medida.

Se empleó un display LCD para visualizar el peso de cualquier material.

Como primera prueba, se tomaron ciertos valores de voltaje simulando una medida en la celda de carga.

Cabe resaltar que la celda de carga tiene una zona elástica donde fue posible trabajar el dispositivo sensor.

toma de datos celda de carga
Figura 1. Toma de datos de la celda de carga

 

Posteriormente se procedieron a graficar los datos obtenidos para determinar la zona lineal de trabajo así como la ecuación que modela los datos obtenidos.

celda de carga
figura 2. Comportamiento de la celda de carga

 

Basado en los datos obtenidos, se procedió a diseñar el circuito y el algoritmo que permite tomar la medición de masa en la celda de carga.

 

PROGRAMA.

 

/*

 * File:   newmain.c

 * Author: WIN

 *

 * Created on 28 de octubre de 2020, 11:11 PM

 */

 

 

#include <xc.h>

 

#include<stdio.h>

#include <string.h>

 

char outbuffer[100]={0};

float peso = 0.0;

float voltaje = 0.0;

 

// CONFIG1

#pragma config FOSC = HS        // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)

#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)

#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)

#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)

#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)

#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)

#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)

#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)

#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)

#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

 

// CONFIG2

#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)

#pragma config VCAPEN = OFF     // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)

#pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)

#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)

#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)

#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

#define _XTAL_FREQ 20000000

 

#define LCD_RS RB4

#define LCD_EN RB5

#define LCD_DATA PORTC

 

void set_lcd (void){

    LCD_RS=0;

    LCD_EN=1;

    __delay_ms(2);

    LCD_EN=0;

}

void lcd_init(void)

{

    LCD_DATA=2;

    set_lcd();

    LCD_DATA=56;

    set_lcd();

    LCD_DATA=12;

    set_lcd();

    LCD_DATA=6;

    set_lcd();

    LCD_DATA=1;

    set_lcd();

}

 

void lcd_write(unsigned char c)

{

     LCD_EN=1;

     LCD_DATA = ( c );

     __delay_ms(2);

     LCD_EN=0;

}

 

void lcd_goto(unsigned char pos)

{

     LCD_RS = 0;

     lcd_write(0x80+pos);

}

 

// Escribo una cadena de caracteres en el LCD

void lcd_puts(const char * s)

{

     LCD_RS = 1;

     while(*s)

          lcd_write(*s++);

}

// Escribo un caracter en el LCD

void lcd_putch(char c)

{

     LCD_RS = 1;     // write characters

     lcd_write( c );

}

 

void main(void) {

    // Pagina 40 del data sheet

    // Configurar el RA0 con entrada analogica

    ADCON0=0B00000001;

    // Organizamos los 10 bits a la derecha

    ADCON1=0B10010000;

   

    //Configuramos los pines de salida digitales

    TRISB=0;

    ANSELB=0;

    PORTB=0;

 

    //Configuramos los pines de salida digitales

    TRISC=0;

    PORTC=0;

 

    // Inicializamos la LCD

    lcd_init();

   

    while(1){

        GO=1;

        while(GO) continue;

       

        // Limpiamos la variable

        memset(outbuffer, 0 ,sizeof(outbuffer));

        // (ADRESH*256)+ADRESL, con esta operación convertimos de binario a decimal

        // 5.0/1023.0 == Convertimos de decimal (0 – 1023) a (0 – 5 voltios)

        voltaje = ((ADRESH*256)+ADRESL)*5.0/1023.0;

        // calculamos el peso a través de la ecuación de la gráfica

        peso = 16.562*voltaje – 0.1045;

        // sprintf perm ite convertir un numero de punto flotante a string

        sprintf(outbuffer, “%2.0f”, peso);

       

        //Contruimos el mensaje de la segunda fila de la LCD

        // ”  Peso = 59 kg  ” que equivale a 16 caracteres

        char mensaje1[] = ”  Peso = “;

        char mensaje2[] = ” kg  “;

        char mensaje3[25];

       

        // Copiamos los 4 espacio en blanco en la variable mensaje3 y concatenamos el mensaje

        // que se va imprimir en la fila 2, la información se guarda en la vble mensaje3

        strcpy(mensaje3, mensaje1);

        strcat(mensaje3, outbuffer);

        strcat(mensaje3, mensaje2); // En la vble mensaje3 se almacena ”  Peso = 59 kg  “

       

        lcd_goto(0);                    // selecciono primera línea

        lcd_puts(” Celda de carga “);   // Imprimimos la primera fila

        lcd_goto(0x40);                 // Selecciono segunda línea

        lcd_puts(mensaje3);             // Imprimimos la segunda fila

       

        __delay_ms(100);

       

    }

}

 

CONTENIDOS MÁS RELEVANTES.

soy el administrador del sitio web. si tienes alguna duda, no dudes en contactarme

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *