Sida 1 av 1

Termoelement DS2762 Arduino

Postat: 10 jan 2016, 04:38
av Cokeman
Hej,

Jag har köpt en sån här: https://www.m.nu/termoelementinterface- ... p-457.html samt en spetsgivare typ-K: https://www.m.nu/termoelement-spetsgiva ... p-127.html

Tanken är att använda den i mitt 1-wire nät för att mäta rökgastemperatur på pannan (endast utanpåliggande givare på rökröret).

Jag har kopplat mitt 1-wire nät till en Arduino Ethernet som har en LCD webserver/klient för att putta in sakerna i en databas.

För att interfacea med chipet använder jag detta lib https://github.com/nigelb/Arduino-DS2762

Jag kan läsa ut temperaturen från den interna temperaturmätaren utan problem för "cold junction"-biten. Jag kan även läsa värdet ur "Voltage measurement"-registret getADC() i ovan nämnda lib. Problemet är dock att spänningen aldrig ändras, den står bara still på 202 vad jag än gör. 202*4.88mV = 985.76mV dvs.

I databladet står det dock detta om "Voltage"-registret:
The DS2762 continually measures the voltage between pins VIN and VSS over a 0 to 4.75V range. The voltage
Men jag kan tydligt se på kretskortet att termoelement-kopplingen är kopplad på de tre SNS-pinarna. Men jag har ingen aning vilket register det är tänkt man ska läsa från för att få ut diffen mellan Vss och SNS? Hittar inget i databladet, och det följer ju med 0 instruktioner med produkten eller på produktsidan. Det enda som dessutom bekräftar det är att produktsidan nämner OWFS, och på den sidan hittade jag denna krets: http://owfs.org/index.php?page=thermocouples där det är tydligt att det är mellan SNS och Vss man ska mäta.

Är det bara jag som är blind eller finns det fler register än vad det står om här:
https://datasheets.maximintegrated.com/en/ds/DS2762.pdf

Hur mäter jag spänningen mellan SNS och Vss? Vilket register i DS2762 ska jag läsa från?

Re: Termoelement DS2762 Arduino

Postat: 10 jan 2016, 17:22
av Cokeman
Hittade den här guiden för DS2760, som verkar vara ett liknande men tidigare version av samma chip?

http://media.digikey.com/pdf/Data%20She ... /28022.pdf

Där läser de i alla fall ut "CURRENT MEASUREMENT"-registret, som har address 0x0E ($0E i kodexemplet nedan).

Kod: Markera allt

Read_TC_Volts:
  OWOUT OW, %0001, [SkipNet, RdReg, $0E]      ' read current register
  OWIN OW, %0010, [tCuV.BYTE1, tCuV.BYTE0]
  sign = tCuV.BIT15                                           ' save sign bit
  tCuV = tCuV >> 3                                            ' correct alignment
  IF sign THEN
    tCuV = tCuV | $F000 ' pad 2's-compliment bits
  ENDIF
  tCuV = ABS tCuV */ 4000                                 ' x 15.625 uV
  RETURN
Kan inte språket ovan (verkar vara Parallax Basic). Och ska man skratta eller gråta när en language guide https://www.parallax.com/product/27218 kostar $25??!?! ... Var intresserad vad */4000 betyder, och hur det möjligen kan översättas till x15.625uV

Men hur som helst, om jag läser ut de 2 bytes som finns på address **0x0E** och shiftar 3 bitar (12 bitar data, 1 sign bit) precis som de gör, och som databladet säger även för DS2762, [s]så får jag inget värde som skiftar med temperaturen[/s]. Enligt databladet så innehåller detta register med en "external resistor":
For the external sense resistor configuration, the DS2762 writes the measured VIS voltage to the current register,
with a 15.625microV resolution and a full-scale 64mV range.
Då känns det mer logiskt när man får ut microVolt istället för Ampere... Att det just heter "current measurement register" är ju lite vilseledande.

Verkar funka nu när jag inte sitter mitt i natten och håller på :) Får en temperatur just nu runt 95-100C när jag eldar i pannan med spetsgivaren på rökröret. Eftersom jag har en till givare som är kopplad till styrningen för laddomaten verkar detta stämma, då jag vrider dens inställning till under 100C så slår den på laddomaten.

Re: Termoelement DS2762 Arduino

Postat: 10 jan 2016, 19:00
av Cokeman
Ok så en sammanfattning om hur man kan använda DS2762 med ett Typ-K termoelement på en Arduino:

För att kommunicera på 1-wire-nätet använder jag följande lib:
https://github.com/nigelb/Arduino-DS2762

Dock hade det inga funktioner för att mäta "Current measurement"-registret där Seebeck-spänningen återfinns, så jag la till det samt fixade en del andra saker (har skapat en Pull Request så kan hända att det finns i originalet när du läser detta):
https://github.com/JoakimSoderberg/Ardu ... e/raw_temp

Jag hittade även det här libet för att översätta millivolts + cold junction temperaturen till en temperatur som använder sig av interpolering för att kunna ha ett litet lookup table:
https://github.com/Miceuz/k-thermocouple-lib

Blogpost om hur han tagit fram detta:
https://wemakethings.net/2014/04/24/k-thermocouple-lib/

Jag var dock tvungen att även modifiera detta lib eftersom det kräver ~500 byte RAM ledigt om man bara deklarerar tabellen som en vanlig variabel. Så jag gjorde om så att man kan välja att lägga det i flashminnet istället (https://www.arduino.cc/en/Reference/PROGMEM). Samt att jag la till binärsökning istället för den linjära som redan fanns. Dessa ändringar finns nu i original-libet.

Eftersom jag har en massa DS18B20 i resten av mitt 1-wire nät, och bara en givare för rökgastemperatur så ville jag fortsätta kunna använda detta lib för att enkelt läsa ut temperaturerna:
https://github.com/milesburton/Arduino- ... ol-Library

Dock var det skrivet så att den antar att alla 1-wire sensorer den hittar är DS18B20, och försöker därmed skicka convert-anrop till alla på en gång. Jag la därför till en ny funktion **validFamily** som man kan använda för att filtrera vilka sensorer som är DS18B20. Denna ändring är redan mergad i original-repot.

Så för att sammanfatta hur koden jag använder ser ut på ett ungefär (det här är bara ett grovt exempel):

Kod: Markera allt

#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS2762.h>
#include <thermocouple.h>

#define MAX_NAME_LEN
#define MAX_TEMP_SENSORS 16
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

typedef enum sensor_type_e
{
    SENSOR_DS18B20,
    SENSOR_DS2762
} sensor_type_t;

typedef struct TempSensor
{
    DeviceAddress addr;
    char name[MAX_NAME_LEN];
    float temp;
    sensor_type_t type;
} TempSensor;

TempSensor temps[MAX_TEMP_SENSORS];
int temp_count;

...

void get_name(TempSensor *s)
{
    // Read names from eeprom.
    ...
}


void setup()
{
    ...

    // Find all sensors on onewire bus.
    sensors.begin();
    temp_count = sensors.getDeviceCount();

    for (int i = 0; i < temp_count; i++)
    {
        // Save addresses.
        sensors.getAddress(temps[i].addr, i);

        // Only use the dallas API towards D18B20 sensors.
        if (sensors.validFamily())
        {
            temps[i].type = SENSOR_DS18B20;
        }
        else
        {
            temps[i].type = SENSOR_DS2762;
        }

        get_name(&temps[i]);
    }
}

void loop()
{
    ...
    for (int i = 0; i < temp_count; i++)
    {
        // Just for convenience...
        TempSensor *s = &temps[i];

        if (s->type == )
        {
            sensors.requestTemperaturesByAddress(s->addr);
            s->temp = sensors.getTempC(s->addr);
        }
        else
        {
            DS2762 ds(&oneWire, s->addr);

            // Each raw value count equals 15.625 microVolt, we want it in milivolts.
            unsigned long current = (unsigned long)ds.readCurrentRaw() * 15.625;

            // Each raw value count equals 0.125C, 
            // The thermocouple lib wants it x1000.
            // So 0.125*1000 = 125.
            unsigned long ambient_temp = ds.readTempRaw() * 125ul;
            long raw_temp = thermocoupleConvertWithCJCompensation(current, ambient_temp);

            s->temp = (double)raw_temp / 1000;
        }
    }
}

Re: Termoelement DS2762 Arduino

Postat: 11 jan 2016, 08:44
av supportM
Grymt bra jobbat! :D
Jag länkar in denna tråd till produktsidan för DS2762 och spetsgivaren, så andra kan hitta den lättare :)

//Jonas, m.nu

Re: Termoelement DS2762 Arduino

Postat: 13 jan 2016, 02:52
av Cokeman
Såg att du länkat från spetsgivarens sidan. Men det här har ju mer att göra med DS2762, så kanske skulle vara bra att lägga till på den sidan också? https://www.m.nu/termoelementinterface- ... p-457.html