Pages: [1]   Go Down
Author Topic: problema: smartec uti, pt100 o arduino?  (Read 1053 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao a tutti.

ho un problema che è da due giorni che cerco di risolvere ma non he cavato fuori nulla:

ho tre pt100 da cui voglio leggere i loro valori di resistenza. ho comprato questo integrato http://www.smartec.nl/pdf/DSUTI.pdf che sembra proprio fare al caso mio: è progettato appositamente per la lettura di pt100 più altro ancora.

come circuitino e codice ho presto spunto da questo topic http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1269857588 utilizzando il codice di quell'utente (quello verso il fondo della pagina).

riporto anche qui il codice:
Code:
#include <stdio.h>
#include "pins_arduino.h"

#define UTI_PIN 5
#define UTI_RESISTANCE_REF 1000

void setup()
{
  Serial.begin(9600);
  pinMode(UTI_PIN, INPUT);
}

void loop()
{
  double res1,res2,res3;

   if(ReadUTI(UTI_PIN,&res1,&res2,&res3,UTI_RESISTANCE_REF)) {
Serial.print("Resistance 1: ");
Serial.print(res1);
Serial.print("\t");
Serial.print("Resistance 2: ");
Serial.print(res2);
Serial.print("\t");
Serial.print("Resistance 3: ");
Serial.print(res3);
Serial.print("\t");
    }
    else {
Serial.print("Not Found");
    }
    Serial.print("\n");
   delay(2000);
}

int ReadUTI(uint8_t pin, double * res1,double * res2,double * res3,int refRes)
{
    int state = HIGH;
    int i,startindex=-1;
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    uint8_t stateMask = (state ? bit : 0);
    unsigned long width[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    double nOff=0,nAB=0,nCD=0,nBC=0,nDF=0;

    while ( (*portInputRegister(port) & bit) != stateMask)
 ;

    for(i=0;i<12;i++) {
while ( (*portInputRegister(port) & bit) == stateMask)
   width[i]++;
while ( (*portInputRegister(port) & bit) != stateMask)
   width[i]++;
    }
    for(i=1;i<12;i++) {
if(i<7) {
 if(width[i]<width[i+2]&&width[i]<width[i+3]&&width[i]<width[i+4]&&width[i]<width[i+5]&&width[i+1]<width[i+2]&&width[i+1]<width[i+3]&&width[i+1]<width[i+4]&&width[i+1]<width[i+5]) {
   startindex=i;
   i=12;
 }
}
    }
    if(startindex!=-1) {
nOff=width[startindex]+width[startindex+1];
nAB=width[startindex+2];
nCD=width[startindex+3];
nBC=width[startindex+4];
nDF=width[startindex+5];

*res1=((nBC-nOff)/(nAB-nOff))*refRes;
*res2=((nCD-nOff)/(nAB-nOff))*refRes;
*res3=((nDF-nOff)/(nAB-nOff))*refRes;

return 1;
    }
    else {
return 0;
    }
}


premetto che fino a un mese fa ha sempre funzionato egregiamente. ieri ritiro fuori il tutto, collego le pt100 al circuito, attacco arduino e non mi legge più niente.


facenco un po di debug software, ho notato che mi si blocca all'interno di questo ciclo while (sulla seriale mi viene stampato solamente '2' ma non '3').
Code:
   Serial.println("2");
    for(i=0;i<12;i++) {
while ( (*portInputRegister(port) & bit) == stateMask)
   width[i]++;
    Serial.println("3");

io avevo preso questo codice già fatto che funzionava egregiamente: in realtà non conosco bene il significato delle istruzioni all'interno della funzione int ReadUTI (moltre istruzioni sono prese dalla libreria pins_arduino.h), quindi non capisco bene perchè si blocca. ripeto: ha sempre funzionato bene, quantomento mi ha sempre stampato a video il valore delle resistenze (anche se sballate). non riesco a capire se sono partite le pt100 (ma non credo), se è partito l'integrato (possibile?) o arduino(dubito, perchè con altri programmi che ho funziona bene).

qualcuno mi può dare una mano?


EDIT: ho fatto una prova con un multimetro a misurare le resistenze delle pt100 (con tutto il circuito collegato allo smartec uti e alimentato): tutte e le tre sonde mi danno un valore di circa 106.5ohm, che corrisponde a circa  16.7 gradi celsius (compatibile con la temperatura attuale in camera mia).

quindi sembra che l'integrato funzioni. a questo punto c'è qualcosa di sbagliato nel codice: ora che ci penso un mesetto fa avevo ancora una versione vecchia dell'ide di arduino: ho provato a installare quelle vecchie ma ho sempre lo stesso problema. devo trovare un codice alternativo da far girare, ma non ho idea di come modificarlo.
« Last Edit: March 07, 2011, 08:15:05 am by sollazzo » Logged

Palermo
Offline Offline
God Member
*****
Karma: 2
Posts: 745
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Code:
   Serial.println("2");
    for(i=0;i<12;i++) {
while ( (*portInputRegister(port) & bit) == stateMask)
   width[i]++;
    Serial.println("3");



Uhm, dove si chiude il ciclo? inizi con una graffa ma non si vede quella di chiusura...
Logged

Gianfranco

0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

questo è il codice:

Code:

Serial.println("2");
for(i=0;i<12;i++) {
while ( (*portInputRegister(port) & bit) == stateMask)
    width[i]++;
Serial.println("3");
while ( (*portInputRegister(port) & bit) != stateMask)
    width[i]++;
Serial.println("4");
    }
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10115
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

prima di tutto prova a ricopiare di nuovo il codice da dove l'hai preso, magari inavvertitamente hai modificato qualcosa.

*portInputRegister(port) è una chiamata a funzione che non conosco()credo che legga a basso livello il valore di un pin), se ancora non funziona prova a fare:
Code:
for(i=0;i<12;i++) {
while ( (*portInputRegister(port) & bit) == stateMask){
            Serial.print("i: ");
            Serial.print(i);
            Serial.print(" pir: ");
            Serial.print( *portInputRegister(port), BIN );
            Serial.print(" bit: ");
            Serial.print(bit, BIN);
            Serial.print(" mask: ");
            Serial.println(stateMask, BIN);
    width[i]++;
        }
Serial.println("3");
while ( (*portInputRegister(port) & bit) != stateMask)
    width[i]++;
Serial.println("4");
    }

e posta il risultato, che vediamo di indagare un pò
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dunque: il codice è quello originale (e sicuro al 100% che funzionava quando lo provai la prima volta). il circuito ho ricontrollato tutto ed è pari a pari come nello schema del topic che ho postato (con la differenza che ho pt100 invece che pt1000 e che le resistenze del circuito cambiano, secondo il datasheet dell'uti smartec).

ho fatto come mi hai detto (ho aggiunto anche la stampata al video dell'istruzione
Code:
uint8_t port = digitalPinToPort(pin);

si blocca subito alla prima iterazione. ti posto la stampa su seriale (continua cosi, non va avanti):
Code:
port:100
i: 0 pir: 100001 bit: 100000 mask: 100000
i: 0 pir: 100001 bit: 100000 mask: 100000
i: 0 pir: 100001 bit: 100000 mask: 100000
i: 0 pir: 100001 bit: 100000 mask: 100000
i: 0 pir: 100001 bit: 100000 mask: 100000
...
...
...

ho provato anche a stampare su seriale in continuazione il valore del pin digitale 5, e con il circuito alimentato è sempre impostato a 1.

sul datasheet dell'uti, spiega come calcolare il valore in uscita da quel pin, ma non so come tramutarlo in codice classico (spiega solo la teoria):

dice:
Quote
The output of the UTI is a period modulated signal. As an example, Figure 2 shows two complete cycles of
the output signal from the UTI, each consisting of three phases

link immagine: http://img641.imageshack.us/i/uti.png/

per la lettura di 3 pt100 (con il circuito del topic postato sopra), mette questa tabella per calcolare i valori i voltaggi:

link tabella: http://img855.imageshack.us/i/uti1.png/

questa tabella, nel mio codice credo si riferisca a queste istruzioni:
Code:
nOff=width[startindex]+width[startindex+1];
nAB=width[startindex+2];
nCD=width[startindex+3];
nBC=width[startindex+4];
nDF=width[startindex+5];

*res1=((nBC-nOff)/(nAB-nOff))*refRes;
*res2=((nCD-nOff)/(nAB-nOff))*refRes;
*res3=((nDF-nOff)/(nAB-nOff))*refRes;


purtroppo di questa cose tecniche ci capisco pressochè zero smiley-sad


« Last Edit: March 07, 2011, 03:04:30 pm by sollazzo » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dopo un altro giorno di tentativi, sono giunto alla conclusione che o qualcosa  dell'integrato è partito, o qualcosa di arduino è partito. ho ordinato un nuovo uti che dovrebbe arrivarmi sett prossima: se con lo stesso codice funzionerà, problema risolto. altrimenti...boh smiley-grin
Logged

Palermo
Offline Offline
God Member
*****
Karma: 2
Posts: 745
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

posso chiederti dove ordini l'uti? io pure vorrei utilizzare delle PT100 su arduini!! Grazie mille!!
Logged

Gianfranco

0
Offline Offline
Newbie
*
Karma: 0
Posts: 44
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ti ho scritto in privato che non so se si possono dire nomi di siti per forum
Logged

Pages: [1]   Go Up
Jump to: