Autor Tema: Multimetro con PIC24FJ256GA702  (Leído 1685 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Richarlison

  • PIC10
  • *
  • Mensajes: 3
Multimetro con PIC24FJ256GA702
« en: 21 de Febrero de 2022, 23:49:17 »
Buenas noche, tardes o días, alguien puede  decirme como leer los valores de resistencias, corriente y voltaje, uso el uart para que atravez de teraterm despliegue los valores, pero solo me sale la frase, mas no el resultado. Uso el MPLAB V5.40 con el XC16
Aqui el codigo:

#include "mcc_generated_files/system.h"
#include <stdio.h>
#define FCY 4000000
#include <libpic30.h>
void BintoBCDIntlectura_voltios(float unidad, int decimales);
void BintoBCDIntlectura_amperios(float unidad, int decimales);
void BintoBCDIntlectura_ohmios();
/* Variable para recoger la lectura de los puertos analogicos*/
float lectura;
/* Variables para calculas las medidas*/
float voltaje,corriente,ohmios;
/* Valor real de la resistencia de 22ohm para medir amperaje*/
float mediaTotal;
const volatile unsigned long R=19;
volatile unsigned int muestra;
volatile unsigned char i;
/*Funcion para la lectura de los voltios
  Recibe la unidad en la que se va a medir y los decimales con los que mostrar el resultado
*/
void BintoBCDIntlectura_voltios(float unidad, int decimales)
{
 if (lectura == 0)
  {
  lectura = LATBbits.LATB7;//input LATB7
  /* Si no se esta leyendo nada */
    printf("0   mV     0.00V");
  }
 else
 {
    voltaje = ((5 *(lectura)) / 1024);
    printf("El voltaje es: ",(voltaje) * 3 * unidad, decimales);
 }
 __delay_ms(500);
}
/* Funcion para la lectura de los amperios
   Recibe la unidad en la que se va a medir y los decimales con los que mostrar el resultado
*/
void BintoBCDIntlectura_amperios(float unidad, int decimales)
{
  lectura =LATBbits.LATB5;//input LATBbits5
  for (int i = 1; i <= 20; i++)
  {
   corriente = lectura * (5 / 1023.0) / R + corriente;
  }
  corriente =corriente / 20;
  printf("La corriente es: ",corriente * unidad, decimales);
  __delay_ms(500);
}
/* Funcion para la lectura de los ohmios */
void BintoBCDIntlectura_ohmios()
{
  lectura = LATBbits.LATB4; //intput LATB4
  /* Si no se esta leyendo nada */
  if (lectura == 0)
  {
  printf("0 Ohms ");
  }
  ohmios =(lectura * 5 / 1024);
  muestra =(10000 * (5 - ohmios) / ohmios);
  mediaTotal = muestra;

  /* Si la medida esta por debajo de 1000 la muestra en Ohms */
  if (mediaTotal < 1000)
  {
    printf("La resistecia es de: ",mediaTotal * 1, 0);
    printf("Ohms");
  }
  /* Si la medida esta por encima de 1000 la muestra en KOhms */
  else {
    printf("La resitencia es de:",mediaTotal * 0.001, 2);
    printf("KOhms");
  }
  __delay_ms(500);
}
int main(void)
{
    SYSTEM_Initialize();
    while (1)
    {
    void BintoBCDIntlectura_voltios(float unidad, int decimales);
    void BintoBCDIntlectura_amperios(float unidad, int decimales);
    void BintoBCDIntlectura_ohmios();
    }
    return 1;
}

Lo adapte de arduino a pic

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Multimetro con PIC24FJ256GA702
« Respuesta #1 en: 22 de Febrero de 2022, 09:34:55 »
Buenas noche, tardes o días, alguien puede  decirme como leer los valores de resistencias, corriente y voltaje, uso el uart para que atravez de teraterm despliegue los valores, pero solo me sale la frase, mas no el resultado. Uso el MPLAB V5.40 con el XC16
Aqui el codigo:

#include "mcc_generated_files/system.h"
#include <stdio.h>
#define FCY 4000000
#include <libpic30.h>
void BintoBCDIntlectura_voltios(float unidad, int decimales);
void BintoBCDIntlectura_amperios(float unidad, int decimales);
void BintoBCDIntlectura_ohmios();
/* Variable para recoger la lectura de los puertos analogicos*/
float lectura;
/* Variables para calculas las medidas*/
float voltaje,corriente,ohmios;
/* Valor real de la resistencia de 22ohm para medir amperaje*/
float mediaTotal;
const volatile unsigned long R=19;
volatile unsigned int muestra;
volatile unsigned char i;
/*Funcion para la lectura de los voltios
  Recibe la unidad en la que se va a medir y los decimales con los que mostrar el resultado
*/
void BintoBCDIntlectura_voltios(float unidad, int decimales)
{
 if (lectura == 0)
  {
  lectura = LATBbits.LATB7;//input LATB7
  /* Si no se esta leyendo nada */
    printf("0   mV     0.00V");
  }
 else
 {
    voltaje = ((5 *(lectura)) / 1024);
    printf("El voltaje es: ",(voltaje) * 3 * unidad, decimales);
 }
 __delay_ms(500);
}
/* Funcion para la lectura de los amperios
   Recibe la unidad en la que se va a medir y los decimales con los que mostrar el resultado
*/
void BintoBCDIntlectura_amperios(float unidad, int decimales)
{
  lectura =LATBbits.LATB5;//input LATBbits5
  for (int i = 1; i <= 20; i++)
  {
   corriente = lectura * (5 / 1023.0) / R + corriente;
  }
  corriente =corriente / 20;
  printf("La corriente es: ",corriente * unidad, decimales);
  __delay_ms(500);
}
/* Funcion para la lectura de los ohmios */
void BintoBCDIntlectura_ohmios()
{
  lectura = LATBbits.LATB4; //intput LATB4
  /* Si no se esta leyendo nada */
  if (lectura == 0)
  {
  printf("0 Ohms ");
  }
  ohmios =(lectura * 5 / 1024);
  muestra =(10000 * (5 - ohmios) / ohmios);
  mediaTotal = muestra;

  /* Si la medida esta por debajo de 1000 la muestra en Ohms */
  if (mediaTotal < 1000)
  {
    printf("La resistecia es de: ",mediaTotal * 1, 0);
    printf("Ohms");
  }
  /* Si la medida esta por encima de 1000 la muestra en KOhms */
  else {
    printf("La resitencia es de:",mediaTotal * 0.001, 2);
    printf("KOhms");
  }
  __delay_ms(500);
}
int main(void)
{
    SYSTEM_Initialize();
    while (1)
    {
    void BintoBCDIntlectura_voltios(float unidad, int decimales);
    void BintoBCDIntlectura_amperios(float unidad, int decimales);
    void BintoBCDIntlectura_ohmios();
    }
    return 1;
}

Lo adapte de arduino a pic

Según yo (si no estoy equivocado) no te va a funcionar.

Las funciones básicamente hacen esto:

Código: C
  1. lectura = LATBbits.LATB4; //intput LATB4
  2.    .....
  3.   ohmios =(lectura * 5 / 1024);
  4.   muestra =(10000 * (5 - ohmios) / ohmios);
  5.   mediaTotal = muestra;

La variable lectura es de tipo float, y lo que parece que deseas utilizarla es para leer el conversor ADC, pero al utilizarla de la siguiente manera:

  lectura = LATBbits.LATB4;

Lo que estás leyendo es el estado lógico de RB4, es decir lectura tendrá un valor de 0 o 1.

Suponiendo que corriges ese problema, y lee de manera correcta el ADC en el canal de RB4, para realizar esta conversión:

Código: C
  1. (lectura * 5 / 1024);

No es necesario que lectura sea float, deber ser de tipo int (16 bits), ya que con el valor 1024 se entiende que el ADC es de 10 bits.

Las otras variables que posees ohmios, muestra, voltaje, pueden ser float ya que obtienes resultados con decimales.

Ahora bien, para saber si las operaciones que convierten las lecturas leídas en ohmios, voltios o amperios son correctas, se necesita conocer el circuito analógico (esquemático) que utilizas para  acondicionar las magnitudes.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado uZYNQ

  • PIC16
  • ***
  • Mensajes: 123
Re:Multimetro con PIC24FJ256GA702
« Respuesta #2 en: 22 de Febrero de 2022, 10:00:41 »
La función printf no imprime los resultados porque no los formatea (%d si es entero, %f si es float, etc). por los menos debería estar
 printf ( " Parte entera: %d , parte decimal %d", (voltaje) * 3 * unidad, decimales)

además unidad y decimales deben ser cero porque nunca los envía desde la función main.


 

anything