Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
Autores:
Nombre y Apellido
N de Legajo
Bruno Giovanon
G-3233/6
Mller Hernn
M-3985/3
Mayo / 2011
Introduccin:
<hidef.h>
/* for EnableInterrupts macro */
"derivative.h" /* include peripheral declarations */
"lcd.h"
<stdio.h>
<math.h>
// Variables globales
float aux;
char salida[50];
Bool alarma=0;
float kilos;
//valor actual del peso
float cero;
//Tara
// Constantes
#define digito 1/400;
const float PreProd=4.25;
/////////////////////////////////////////////////////////////////////////////////////////
// PeriphInit
// -------------------------------------------------------------------------------------// Initializes various registers and peripherals
/////////////////////////////////////////////////////////////////////////////////////////
void PeriphInit(void)
{
// Disables COP and Enable RESET and BKGD pin
SOPT1 = 0x13;
#if !CLOCK
// Selects FEE mode for fBUS = 8 MHz
// Using crystal low-range oscillator. FLL prescaler factor (P) = 64
ICGC1 = 0x38;
// Sets MFD multiplication factor (N) to 4 and RFD divisor (R) to 1
ICGC2 = 0x20;
// Waita until FLL frequency is locked
while (!(ICGS1 & 0x08))
;
#else
// Selecta FEI mode
// Sets trimming for fBUS = 8 MHz
ICGTRM = NVICGTRM;
// Using internal reference clock. FLL prescaler factor (P) = 64
ICGC1 = 0x28;
// Sets MFD multiplication factor (N) to 14 and RFD divisor (R) to 2
ICGC2 = 0x51;
// Waits until FLL frequency is locked
while (!(ICGS1 & 0x08))
;
#endif
// Configures PTA[6..5] as output LEDs
PTAD = 0x00;
PTADD = 0x60;
// Configures PTB[7..3] as output LEDs
PTBD = 0x00;
PTBDD = 0xF8;
/////////////////////////////////////////////////////////////////////////////////////////
// Delay
// -------------------------------------------------------------------------------------// Delay of multiples of 1ms
/////////////////////////////////////////////////////////////////////////////////////////
void Delay(int del)
{
// Selects fBUS as timer2 clock source and start timer
TPM2SC = 0x08;
while(del)
if(TPM2SC&0x80)
{
del--;
// Clears TOF flag
TPM2SC &= ~0x80;
}
// Stops timer2
TPM2SC = 0x00;
}
/////////////////////////////////////////////////////////////////////////////////////////
// PrintString
// -------------------------------------------------------------------------------------// Prints a string on the LCD
/////////////////////////////////////////////////////////////////////////////////////////
void PrintString(unsigned char *str)
{
unsigned char i;
LCDClear();
for(i = 0; str[i] != 0; i++)
if (str[i] == '.')
LCDPutChar(',', i+1);
else
LCDPutChar(str[i], i+1);
}
/////////////////////////////////////////////////////////////////////////////////////////
// SlideString
// -------------------------------------------------------------------------------------// Slides strings on the LCD
/////////////////////////////////////////////////////////////////////////////////////////
void SlideString(unsigned char *str, unsigned char d)
{
unsigned char i, j, start;
for(i = 0; str[i] != 0; i++)
{
Delay(d);
LCDClear();
if(i < NUM_DIGITS)
start = 0;
else
start = i-NUM_DIGITS+1;
for(j = start; j <= i; j++){
if (str[j] == '.')
LCDPutChar(',', NUM_DIGITS-i+j);
else
LCDPutChar(str[j], NUM_DIGITS-i+j);
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
// CodifBarra
// -------------------------------------------------------------------------------------// Funcion que enciende los LEDs en forma de barra ascendente segn sea el
valor
// del mdulo de la aceleracin espacial
/////////////////////////////////////////////////////////////////////////////////////////
void CodifBarra(int hexa){
unsigned char leds;
hexa=hexa>>5;
// Divido en 8 niveles el mdulo de aceleracion
leds=0b11111111;
// Enciendo todos los LEDs
while (7-hexa>=0){ // Se ejecuta una la cantidad de veces igual a
hexa++;
// la cantidad de LEDs que sea necesario apagar
leds=leds>>1;
}
PTBD = leds<<3; //5 bits menos significativos en PTB[7..5]
PTAD = leds;
/////////////////////////////////////////////////////////////////////////////////////////
// Funcion LeerADC
// -------------------------------------------------------------------------------------// Lee el puerto que se le indica y devuelve la lectura en unidades de Kg
// restando el valor de tara y setea una bandera que simboliza un sobrepeso
// absoluto mayor que 10Kg
/////////////////////////////////////////////////////////////////////////////////////////
float LeerADC(Bool tarar) {
int i;
kilos=0;
for(i=0;i<10;i++){
//promedio sobre 10 mediciones
while(!(ADCSC1 & 0x80));
kilos=(ADCRH*255+ADCRL)+kilos;
Delay(30);
}
kilos=kilos/10;
if(kilos>=4000){
//Propongo 4000 como valor mximo medido por el
ADC
alarma=1;
return 0;
}
kilos=kilos*digito;
alarma=0;
if(tarar)
return(kilos);
return(kilos-cero);
}
/////////////////////////////////////////////////////////////////////////////////////////
//Funcion Pesar
//--------------------------------------------------------------------------------------//Lee el valor del canal ADC, lo adapta al valor en la unidad correspondiente
//y lo muestra por display
/////////////////////////////////////////////////////////////////////////////////////////
void Pesar(Bool estado){
aux=LeerADC(0);
if(estado)
sprintf(&salida, " %1.3f Kg",aux);
if(!estado){
aux=aux*PreProd;
sprintf(&salida, "%4.2f |",aux);
}
PrintString(salida);
}
/////////////////////////////////////////////////////////////////////////////////////////
//Funcion Error
//--------------------------------------------------------------------------------------//Lee el valor del canal ADC, calcula el error absoluto de la medicion
//y lo muestra por display en unidades de gramos
/////////////////////////////////////////////////////////////////////////////////////////
void Error(Bool estado){
aux=LeerADC(0);
aux=aux*10+3000*digito;
if(estado)
sprintf(&salida, "+- %3.0f g",aux);
if(!estado){
aux=aux*PreProd/10;
sprintf(&salida, "%4.2f Ct",aux);
}
PrintString(salida);
}
/////////////////////////////////////////////////////////////////////////////////////////
// MAIN
// -------------------------------------------------------------------------------------// Entry point
/////////////////////////////////////////////////////////////////////////////////////////
void main(void)
{
Bool estado;
// inicializa los perifericos
PeriphInit();
// imprime un texto de bienvenida
SlideString("trabajo final de sintesis
",130);
// tara inicial
cero=LeerADC(1);
// bucle en el que permanece por siempre
for(;;) {
if(PTCD_PTCD7==0)
cero=LeerADC(1);
if(PTCD_PTCD5==0){
estado=1;
SlideString("Peso en Kg
",130);
}
if(PTCD_PTCD4==0){
estado=0;
sprintf(&salida,"Producto de %1.1f |/kg
SlideString(&salida,130);
",PreProd);
}
Pesar(estado);
CodifBarra(0x00);
if(alarma)
CodifBarra(0xff);
for(;PTCD_PTCD3==0;)
Error(estado);
}
}
Conclusiones:
La construccin del proyecto se inicia con el sensor de peso como base
para el desarrollo de los dems componentes, como el amplificador de seal, la
programacin, la fuente y el hardware. Una robusta construccin en madera y
metal se hizo necesaria para soportar el peso al cual se somete y adems
asegura la correcta sujecin de los componentes. La fuente de PC introduca
mucho ruido al amplificador por lo que fue necesario que se extraiga fuera de la
caja metlica de sta, adems se us cable blindado y filtro pasa bajos para la
seal.
Con respecto a la conversin analgica digital se obtiene muy buena
resolucin y buena jerarqua, teniendo en cuenta que es un proyecto hogareo
con un sistema de amplificacin simple.
Con respecto a la programacin se desarroll un cdigo simple usando
muchas de las funciones de los trabajos anteriores con pequeas
modificaciones. Se pudo representar el smbolo $ modificando el smbolo de
barra vertical desde la estructura que representa cada smbolo en LCD.H.
En la figura 3 se muestra una foto del modelo terminado y funcionando
donde se observa la correcta medicin del peso en Kg del paquete de yerba.
La placa de desarrollo fue amurada ms alta sobre una placa de madera, la
cual tambin oculta la fuente y el amplificador. El modelo se conecta a la red de
220 v y slo tiene un interruptor que, una vez encendido, la balanza est lista
para realizar su funcin.