Autor Tema: celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]  (Leído 3513 veces)

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

Desconectado kenier15

  • PIC10
  • *
  • Mensajes: 2
celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« en: 28 de Septiembre de 2018, 23:24:37 »
BUEN DIA

el problema que e tenido es que  no logro hacer funcionar la celda, leei  la hoja caracteristica del conversor analogo digital de 24bits el  hx711 trae una parte de codigo en c 
//este codigo creo que es de matlab se poco o nada de matlab
Código: [Seleccionar]
sbit ADDO = P1^5;
sbit ADSK = P0^0;
unsigned long ReadCount(void){
 unsigned long Count;
 unsigned char i;
 ADDO=1;
 ADSK=0;
 Count=0;
 while(ADDO);
 for (i=0;i<24;i++){
 ADSK=1;
 Count=Count<<1;
 ADSK=0;
 if(ADDO) Count++;
 }
 ADSK=1;
 Count=Count^0x800000;
 ADSK=0;
 return(Count);
}

y lo modifique hasta este punto

Código: [Seleccionar]
  #define HX711_DO  PIN_a0
#define HX711_CLK PIN_a1
unsigned long ReadCount(void){
 unsigned int32 Count;
 unsigned char i;
 unsigned int8 A_1,A_2,A_3;
 
output_bit( HX711_DO, 1);
output_bit( HX711_CLK, 0);
 Count=0;
 while(input(HX711_DO));
 for (i=0;i<24;i++){
 output_bit(HX711_CLK, 1);
 Count=Count<<1;            //estoy un poco confundido con esta linea por que empieza a desplazar bits antes de recivir el primer dato
 output_bit( HX711_CLK, 0);
 if(input(HX711_DO)) Count++;
 }
 output_bit( HX711_CLK, 1);
 Count=Count^0x800000; // eso no logro entenderlo
 output_bit( HX711_CLK, 0);
 return(Count);
}


el codigo que uso para leer los datos y mostrarlos en pantalla es este

Código: [Seleccionar]
                                                                   
 for(;;)                               
 {
                                                                                           
   
   lcd_gotoxy(1,1);             
   printf(lcd_putc,"valor= %Lu              ",count);       
   
   output_high(pin_b3);               
   count=ReadCount();                     
   
 }
}

tampoco entiendo bien la forma como  comparten los datos el conversor y el pic
por que entendi en mi bajo ingles es que 
cuando se pone en 0 el pin de Dout "datos" el conversor analogo empieza a enviar bits desde el mas significativo "MSB" hasta el menos signficativo. por cada pulso que recive en la entrda de reloj admite un maximo de 25 a 27 pulsos por lectura.
en el pic por lo que entiendi empieza recivir los bits y los va desplazando  dentro de un for de 24 ciclos en la variable  Count=Count<<1; 

hoja tecnica del modulo
https://www.mouser.com/ds/2/813/hx711_english-1022875.pdf

la celda luego de un tiempo empieza a lanzar Valores sola y estos valores van aumentado significativa mente sin necesidad de poner peso en la celda
intente enterder la libreria que trae el conversor en la hoja de datos  entendi algunas cosas otras simple mente no pude
jajaja la verdad estoy un poco cansado llevo una semana tirando codigo y solucionando problemas de un proyecto en el que trabajo agradeceria cual quien ayuda  :8} :8} :sleepy:

el cansansio me daña la ortografia  :8} :8}

de ante manos gracias a quien me pueda dar una mano o alla trabajado con este modulo y la celda de carga anterior mente

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7867
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #1 en: 29 de Septiembre de 2018, 08:47:57 »
Hola, veo que te metiste en uno de esos problemas fáciles, ja..ja  :D :D

Por lo que veo de su hoja de datos, bastante mala por cierto, es que el protocolo de salida de datos es parecido a I2C (pero no lo es) , lo que lleva a decirte que deberás respetar al dedillo todo lo que implica tiempos de las señales, eso quiere decir flancos de bajada, de subida y tiempo de mantenimiento de las señales en ON y OFF.

Si usara SPI o I2C (en ese orden los protocolos mas usados en conversores A/D para celdas de carga en serio) no deberías preocuparte por esos tiempos, ya que la mayoría de los PICs tienen alguno de ellos, y si no el CCS, mágicamente, lo implementa, esa es una de sus fortalezas respecto a los demás compiladores, aunque no sea ANSI 100%.

Respecto a la otra duda que tienes, sobre porque la comparación, es para saber si el valor es negativo o positivo.
Así lo dice en la hoja de datos, de manera escueta...

Output Data Rate and Format
When using the on-chip oscillator, output data rate is typically 10 (RATE=0) or 80SPS (RATE=1).
When using external clock or crystal, output data rate is directly proportional to the clock or crystal frequency.
Using 11.0592MHz clock or crystal results in an accurate 10 (RTE=0) or 80SPS (RATE=1) output data rate.
The output 24 bits of data is in 2’s complement format.
When input differential signal goes out of the 24 bit range, the output data will be saturated at 800000h (MIN)
or 7FFFFFh (MAX), until the input signal comes back to the input range.


Para poder ayudarte mas, deberias subir tu esquema completo (aunque sea a mano alzada) para saber que esta bien y que no.

Ahh, me olvidaba!!
La variable que deberás utilizar para recibir el dato debería ser de 32 bits, revisa bien el código y el manual de CCS, no recuerdo si la variable Long es de 32 bits, capaz que si, pero si no lo es, estarias perdiendo datos continuamente.
Se puede armar un tipo de variable de 24 bits, pero mejor si lo evitas. :D :D

Saludos
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado kenier15

  • PIC10
  • *
  • Mensajes: 2
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #2 en: 29 de Septiembre de 2018, 15:21:21 »
Hola, veo que te metiste en uno de esos problemas fáciles, ja..ja  :D :D

Por lo que veo de su hoja de datos, bastante mala por cierto, es que el protocolo de salida de datos es parecido a I2C (pero no lo es) , lo que lleva a decirte que deberás respetar al dedillo todo lo que implica tiempos de las señales, eso quiere decir flancos de bajada, de subida y tiempo de mantenimiento de las señales en ON y OFF.

Si usara SPI o I2C (en ese orden los protocolos mas usados en conversores A/D para celdas de carga en serio) no deberías preocuparte por esos tiempos, ya que la mayoría de los PICs tienen alguno de ellos, y si no el CCS, mágicamente, lo implementa, esa es una de sus fortalezas respecto a los demás compiladores, aunque no sea ANSI 100%.

Respecto a la otra duda que tienes, sobre porque la comparación, es para saber si el valor es negativo o positivo.
Así lo dice en la hoja de datos, de manera escueta...

Output Data Rate and Format
When using the on-chip oscillator, output data rate is typically 10 (RATE=0) or 80SPS (RATE=1).
When using external clock or crystal, output data rate is directly proportional to the clock or crystal frequency.
Using 11.0592MHz clock or crystal results in an accurate 10 (RTE=0) or 80SPS (RATE=1) output data rate.
The output 24 bits of data is in 2’s complement format.
When input differential signal goes out of the 24 bit range, the output data will be saturated at 800000h (MIN)
or 7FFFFFh (MAX), until the input signal comes back to the input range.


Para poder ayudarte mas, deberias subir tu esquema completo (aunque sea a mano alzada) para saber que esta bien y que no.

Ahh, me olvidaba!!
La variable que deberás utilizar para recibir el dato debería ser de 32 bits, revisa bien el código y el manual de CCS, no recuerdo si la variable Long es de 32 bits, capaz que si, pero si no lo es, estarias perdiendo datos continuamente.
Se puede armar un tipo de variable de 24 bits, pero mejor si lo evitas. :D :D

Saludos

primero que todo gracias por responderme
y respecto a lo que me respondes.

quieres decir que por medio de i2c puedo hacer la comunicación y no falla? 

Count=Count^0x800000; eso es una or Exclusiva no? no entiendo bien su funcion ahi

la variable long la cambie por una int32 jajaj  :D :D eso yo pense que lo habia hecho


este es el esquema


este es el montaje de la celda


y este es el valor en el lcd con o sin carga






jjjajajajaj un problema facil

o simplemente que otro conversor me recomiendas que se comunique por i2c o spi que tenga una buena resolucion de bits
algo mayor a 10 o 16 bits
« Última modificación: 29 de Septiembre de 2018, 16:54:05 por kenier15 »

Desconectado Nichita

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 85
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #3 en: 29 de Septiembre de 2018, 23:03:36 »
Hola, se ve interesante este ADC simple el modo de operarlo y concreto para la aplicación que está diseñado.

Sobre lo que indicas que los valores van subiendo sin necesidad de ponerle peso, descartando la celda, me parece que no estás considerando el signo en el valor leído y así lo mandas directamente al LCD.

Creo que sería mejor si haces tu propia rutina de lectura, utilizando tu lógica una vez entiendas la hoja de datos.

Saludos


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7863
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #4 en: 30 de Septiembre de 2018, 12:40:33 »
Citar
Por lo que veo de su hoja de datos, bastante mala por cierto, es que el protocolo de salida de datos es parecido a I2C (pero no lo es)

Por el codigo que dan en la hoja de datos es mas un SPI que un I2C

Código: C
  1. unsigned long ReadCount(void){
  2.   unsigned long Count;
  3.   unsigned char i;
  4.   ADDO=1;
  5.   ADSK=0;
  6.   Count=0;
  7.   while(ADDO);
  8.   for (i=0;i<24;i++){
  9.     ADSK=1;
  10.     Count=Count<<1;
  11.     ADSK=0;
  12.     if(ADDO) Count++;
  13.   }
  14.   ADSK=1;
  15.   Count=Count^0x800000;
  16.   ADSK=0;
  17.   return(Count);
  18. }

Podria usar el los GPIO para detectar cuando se encuentra en 0.
Activar el SPI, tomar 3 bytes.
Desactivar el SPI, enviar los pulsos de reloj para indicarle la proxima ganancia.

Citar
Count=Count^0x800000; eso es una or Exclusiva no? no entiendo bien su funcion ahi

Si, es una forma de pasarlo a un numero "sin signo", va a depender si te interesa usarlo o no. Obviamente.

Observa que la salida esta en complemento a 2. Y tenes que:
Minimo = 0x800000
Maximo = 0x7FFFFF

Ahora si le hacemos la XOR nos quedaria:
Minimo = 0x000000
Maximo = 0xFFFFFF

Lo feo es que si queremos mostrar sin signo nos encontramos que 0x800000 es ahora nuestro "0". Si vos queres guardarle en una variable de 24bits CON signo entonces no tendrias problemas. Pero si es de 32 bits con signo como nombras, vas a tener que hacer un par de pasos mas para que realmente represente lo que queres.

PD: Long es 16 bits, Long long es 32 bits, o mejor usar int32 int16 que es mas sencillo.
PD2: Esta bien conectada la celda? Porque cada fabricante le pone el color que desea a los cables
« Última modificación: 30 de Septiembre de 2018, 12:45:31 por KILLERJC »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7867
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #5 en: 01 de Octubre de 2018, 09:02:52 »
Lamento desilusionarte Killejc, el SPI son 4 señales, y la version mas facil es 3 señales, no dos, pero como este equipo usa la lectura y la escritura tendria que usar tres señales como minimo.

https://es.wikipedia.org/wiki/Serial_Peripheral_Interface

En cambio el I2C si usa dos señales, llamadas Serial Data y Serial Clock (SDA y SDC), por eso digo que se parece, porque si realmente lo implementara, la hoja de datos deberia indicarlo asi, pero no lo hace.

https://es.wikipedia.org/wiki/I%C2%B2C

Respecto a usar el ADC sin la parte negativa, estarás tirando a la basura la mitad de la resolución numérica, esto es decir que pesaras con la mitad de la precisión, si podías pesar de a 1 gramo pasaras a pesar en saltos de a diez gramos.  No creo que sea muy inteligente, si estoy de acuerdo en que lo lleves dentro del PIC en formato entero y luego lo pases a flotante, volviendo a recuperar el valor negativo.

Respecto a la colocación de la celda, hay varios items que estan mal, si es que quieres sacarle el jugo a la aplicación.

El centro de una celda de este tipo (celda de plataforma) es donde se encuentra el punto de apoyo o  la mitad del 8 (o hueso), depende del fabricante, esto porque la celda de plataforma tiene una determinada superficie en la cual no se produce el efecto de esquina, si ese centro esta desplazado (como es tu caso) deberías usar una celda de plataforma mas grande, pero pasarias de 10 a 100 Kg para agrandar esa superficie, evitando el efecto de esquina, pero perderias casi el 80 % de la precisión.
En la imagen la plataforma coincide su centro de carga con el hueso de medicion.


O sea, te conviene centrar la celda de carga siempre.

por otro lado, si lo que veo es lo que creo, estas haciendo una balanza dinámica, vas a utilizar la plataforma para pasar por encima una banda donde pesaras un determinado producto  en forma dinámica. Si es asi, esa aplicación produce trepidación por el rozamiento, siendo el acrilico o policarbonato un producto que a medida que calienta aumenta su greep esto te va a quitar tambien precisión por la vibración, como la celda esta a 90º respecto al avance de la banda, ese efecto va a lograr una rotura prematura en el tiempo, cosa que evitarías si ubicas la celda en el mismo sentido de avance de la cinta, con el extremo de salida de cables del lado donde entra la cinta sobre la placa de pesaje.

Esa aplicación precisa de la lectura de un encoder, para saber siempre la velocidad de la banda, de otro modo tu error va a ser muy alto.

Deberías utilizar todo el rango numérico del conversor, y la mayor cantidad de conversiones posible (en tu caso 80), ya que deberás implementar filtros que limpien las vibraciones, seguramente un 30 % de tu rango numérico se lo llevaran los filtros, es una aplicación de poca tara, pero si refuerzas la celda (seria bueno hacerlo ya que parte de la vibración seria absorbida por el medio mecánico) vuelves a perder rango numérico.

En la nota de aplicación, muestra muchos de estos aspectos, ni hablar que es una aplicación muchisimo mas sencilla que la que estas encarando.

https://www.researchgate.net/publication/326508615_Diseno_del_interfaz_de_una_balanza_electronica_basada_en_una_celda_de_carga

Saludos
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7863
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #6 en: 01 de Octubre de 2018, 13:48:31 »
Citar
Lamento desilusionarte Killejc, el SPI son 4 señales, y la version mas facil es 3 señales, no dos, pero como este equipo usa la lectura y la escritura tendria que usar tres señales como minimo.

https://es.wikipedia.org/wiki/Serial_Peripheral_Interface

El tema es a que es mas parecido ( la forma de señal, la comunicacion) , no la cantidad de señales a enviar. Y es ahí donde difiero.
Si, SPI son 4 las señales que vos decis ( CLK, MISO, MOSI, CS ), la version que le sigue serian únicamente 3 ( CLK, MISO, MOSI ), pero podes omitir una mas,en este caso vos nunca vas a enviar ningún dato al ADC, siempre vas a recibir, por lo tanto podes "omitir" el MOSI, quedandote MISO y CLK que es lo que necesitas, y sigo poder usandolo como SPI. Pero esto no es lo que afecta.

El problema viene en como obtener los datos, y acá es donde realmente considero que es mas parecido al SPI que el I2C.
Los datos son 24 pulsos de reloj en los cuales en cada pulso hay un dato, distinto de un I2C que tenes START, STOP, ACK, NACK luego de 8 bits estos 2 ultimos, y direcciones.
Si suponemos que el pulso en bajo es el START, el STOP jamas llegaria y los ACK/NACK estarian entre medios de los datos. Otro tema es que el que envia el START es el maestro, pero en tu ADC si lo consideras maestro (SDA ponerlo en bajo y mantener SCL en alto)  el deberia ser quien da los pulsos de CLK, lo cual no es asi.

https://cdn.sparkfun.com/assets/6/4/7/1/e/51ae0000ce395f645d000000.png

Si yo envio un pulso de CLK, y tomo un bit de alli, y asi 24 veces, termina pareciendose mas a un SPI que un I2C, las variaciones estan que:
Y aca la propuesta de usar los 2 metodos:

SPI:
- Necesito detectar cuando el ADC termino de convertir ( que se pone a 0 la linea de datos ) para saber cuando leer.
- Uso el modulo SPI para leer 3 bytes (si una señal o un pin lo desperdicio )
- Necesito enviar de 1 a 3 ciclos mas para definir la ganancia de la proxima conversion. Luego de leer los datos obviamente.

I2C:
Imposible de usarlo. El que el esclavo te mantenga a 0 la linea de datos a 0 implica que hay algun problema. Suponiendo que esto no afecte. Y comienze la transferencia:
- El primer dato tengo que tomar y son 9 ciclos de reloj, tomar el dato y el valor del ACK
- El segundo dato lo tomo y el ACK/NACK, otros 9 ciclos de reloj.
- ¿Como haces para enviar unicamente entre 6 (para los 24 ) a 9 (para los 27) ciclos? Podria hacer los 6 siguientes por software. Y enviar los demas tambien por software.

Se observa que es mucho mas complejo de lo que seria usando el modulo como SPI.

PD: No hay tampoco definicion clara si la salida es open-drain o no. Pero lo que parece segun el esquema que faciilita, es una salida push-pull, el cual I2C es open-drain.

Por estas razones considere usar el SPI, obviamente se puede hacer por software como lo hizo. Y el problema que tiene es que esta leyendo cualquier cosa :P y no esto jeje.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #7 en: 01 de Octubre de 2018, 23:41:44 »
Perdón mi bocadillo  8)

Lo que no alcanzo a ver es el amplificador para acondicionar la señal de la celda, en una oportunidad trabajé con una celda de carga como estas y usé un INA122P, en ese momento averigüe y es uno que generalmente se usa para este tipo de aplicaciones.
Te dejo el esquema que hice.

Por el lado del ADC no tengo mucho para decir ya que nunca trabajé con uno.

Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #8 en: 01 de Octubre de 2018, 23:50:00 »
Ahí veo que el hx711 es para conectar derecho al puente de la celda, no me hagas caso con el tema del INA122  :oops:
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado santiagoooo

  • PIC10
  • *
  • Mensajes: 1
Re:celda de carga 1k y hx711-24bits con pic 16f877a [CCS C Compiler]
« Respuesta #9 en: 10 de Septiembre de 2020, 22:15:34 »
PUDISTE HACERLO AMIGO ? ME QUEDE  IGUAL QUE TU   COMO EN LA LCD AZUL  AVER SI PUEDES AYUDARME


 

anything