Go Down

Topic: Smartec UTI (Read 3904 times) previous topic - next topic

PeterT

Hi!

I need help im trying to read the values from Smartec UTI (http://server3.uswdh.com/~myfavou/intl/docs/dsuti.pdf) with 3 PT1000 connected to it.

The signal from the UTI looks like this:




But the values im getting looks like this:

19856      19857      19876      19881      19860      19893

the code im using for now is:

Code: [Select]

#include <stdio.h>

#define UTI_PIN 5
#define UTI_RESISTANCE_REF 1000

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

void loop()
{
 int i=0,x=0;
 long total=0;
 int values[12];
 while(i<12) {
   values[i]=pulseIn(UTI_PIN,HIGH);
   values[i]+=pulseIn(UTI_PIN,LOW);
   i++;
 }
 
 while(x<12){
   Serial.print(values[x]);
   Serial.print("\t");
   total+=values[x];
   x++;
 }
 Serial.print(" = ");
 Serial.print(total);
 Serial.print("\n");
 delay(2000);
}


/PeterT

PeterT

This is the connections i have made:




PeterT

Can somebody help me?

weirdo557

did you connect pin 8 to ground?

PeterT

No isnt pin 8 power supply?

PeterT

Ok Vss is negative power supply = GND i did not know that, but i get exactly the same values!

PeterT

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=268826 this is someone who uses avr tor read the output from UTI

PeterT

The values should look something like this:

Code: [Select]
9933 9938 30212 31151 19881

PeterT

Isnt there anyone who knows what im doing wrong?

PeterT

Finally got it working :)



Code: [Select]

#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;
   }
}


zgon81

Hi PeterT
Can you please comment your code a little bit? I am also interested in using the UTI in my project and I would like to understand your code better...

Why there is a stateMask = (state ? bit : 0)? It is always = bit...


regards

PeterT

I dont really understand that statemask part myself i saw that in another function and just used it in my code.
Code: [Select]
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); //State HIGH
   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) //While state is LOW
       ;

   for(i=0;i<12;i++) { //Count 12 cycles so you are sure you get the whole.
     while ( (*portInputRegister(port) & bit) == stateMask) //Count the HIGH time
         width[i]++;
     while ( (*portInputRegister(port) & bit) != stateMask) //Count the LOW time and add them together
         width[i]++;
   }
   for(i=1;i<12;i++) { //Find the Index for Toff cycle
     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) {
     //Save the cycles (Makes it easier to know what you are calculating
     nOff=width[startindex]+width[startindex+1];
     nAB=width[startindex+2];
     nCD=width[startindex+3];
     nBC=width[startindex+4];
     nDF=width[startindex+5];

     //Do the calculations according to the UTI manual.
     *res1=((nBC-nOff)/(nAB-nOff))*refRes;
     *res2=((nCD-nOff)/(nAB-nOff))*refRes;
     *res3=((nDF-nOff)/(nAB-nOff))*refRes;

     return 1; //Return 1 if the cycles where found
   }
   else {
     return 0;
   }
}


zgon81


Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy