|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Čet Mar 01, 2018 10:48 am Naslov sporočila: Meritev temperature hladilnika. |
|
|
Pozdravljeni,
kateri senzor priporočate za meritev temperature hladilnega telesa. Zaželjeno je, da je v TO-220 ohišju za enostavno montažo. Območje senzorja 20 - 100°C, raje več. Natančnost senzorja ni tako kritična, saj gre zgolj za kontrolo temperature hladilnega telesa. Menim, da bi zadostovala končna točnost +-2°C.
Zanime me še ali je bolj pametno uporabiti senzor, ki izmerjeno temperaturo posreduje v obliki analogne vrednosti ali preko digitalne komunikacije. Ali je pri "digitalnih" senzorjih potrebna tudi kalibracija?
Pri analognem senzorju me skrbi, da se bo potrebno "preveč" u ukvarjati s samo kalibracijo, pri digitalnem pa me skrbi izvedba komunikacije, ker nimam veliko izkušenj.
Najlepša hvala za odgovor. |
|
Nazaj na vrh |
|
|
mosqito Član
Pridružen-a: Čet 07 Apr 2016 23:22 Prispevkov: 3223 Aktiv.: 33.20
|
Objavljeno: Čet Mar 01, 2018 11:33 am Naslov sporočila: |
|
|
Nisi napisal, kam bi to rad priklopil, zato je težko karkoli svetovat. Ti boš sam najbolje vedel, kaj ti bolj ustreza. Lahko pa opišeš še malo celoten sistem.
Digitalni je lahko TMP75, ki je majhen in enostaven za uporabo (I2C). Naspajkaš ga na malo tiskanino, na katero daš še priključni kabelček in to spelješ do glavne enote. V TO220 boš težko našel kaj primernega. Predvsem je problem tako velikega ohišja njegova velika toplotna "vztrajnost", kar ti dodaja zakasnitve v odzivu. Tega pa ne želiš. Priporočam, da uporabiš čim manjše ohišje. Če uporabljaš analogni senzor pa uporabi termistor (lahko NTC), ki ga pritrdiš preko malega kovinskega nosilca, ki ga tišči ob hladilnik. _________________ Always going the extra mile. |
|
Nazaj na vrh |
|
|
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Čet Mar 01, 2018 11:51 am Naslov sporočila: |
|
|
Aha, to sem res storil neumno napako z izbiro ohišja. Veliko senzorjev je v TO-92 ohišju. Na kakšen način se senzor v tem primeru pričvrsti na hladilno telo. Obstajajo mogoče lepila z visoko toplotno prevodnostjo?
Senzor bo odčitvala en od STM32 krmilnikov (ni še točno določeno), bo pa krmilnik zagotovo deloval na 3.3V. V primeru, da bi uporabil analogni senzor, bi za ovrednotenje izhoda senzorja uporabil interni ADC. Seveda bi med senzorski izhod in ADC dodal prilgoditveno vezje / filter.
Na hladilnem telesu bodo 3 mosfeti na katere morem paziti, da se ne preveč segrejejo. Nisem se še poglabljal v postavitev mosfetov na hladilnem telesu, če bodo mosfeti zelo narazen bi za vsakega uporabil svoj temperaturni senzor. Celotno vezje bo predvidoma na istem PCB-ju. Mosfeti so v TO-220 ohišju, zato bi mi bilo najbolj praktično, da je tudi senzor v podobnem ohišju, ker bo izvedba in postavitev tako najlažja.
Hladilno telo bo večjih dimenzij z lastnim ventilatorjem, saj je pričakovana moč na tranzistorjih zelo velika, zato bo potrebno odvajati veliko količino toplote. |
|
Nazaj na vrh |
|
|
mosqito Član
Pridružen-a: Čet 07 Apr 2016 23:22 Prispevkov: 3223 Aktiv.: 33.20
|
Objavljeno: Čet Mar 01, 2018 12:28 pm Naslov sporočila: |
|
|
Aha, odlično.
Paste dobiš s kar lepo prevodnostjo. Jaz sem si jo naredil kar sam. Vzel sem keramiko (Al2O3) in jo zdrobil v prah (stolčeš s kladivom in preseješ skozi cedilo). Ta prah sem vmešal v dvokomponentni epoxy in potem s tem prilepil senzor na hladilnik. Drži in prevaja toploto. Dobiš pa seveda tudi toplotno prevoden epoxy ali pa pasto, ki se ne posuši (keramični prah v vazelinu).
Za STM32 sem pred kratkim napisal tole:
Koda: |
/***
* ____ ____ _ ____ ____ ___ __ __
* / ___| / ___|(_)| _ \ | _ \ / _ \ | \/ |
* \___ \ | | | || | | || |_) || | | || |\/| |
* ___) || |___ | || |_| || _ < | |_| || | | |
* |____/ \____||_||____/ |_| \_\ \___/ |_| |_|
* (C)2018 Scidrom
Description: TMP75 driver
License: GNU General Public License
Maintainer: S54MTB
*/
/******************************************************************************
* @file TMP75.c
* @author S54MTB
* @version V1.0.0
* @date 14-January-2018
* @brief TMP75 driver
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2018 Scidrom
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
******************************************************************************
*/
/**
* The TMP75 and TMP175 devices are digital temperature sensors ideal for NTC
* and PTC thermistor replacement. The devices offer a typical accuracy of ±1°C
* without requiring calibration or external component signal conditioning. IC
* temperature sensors are highly linear and do not require complex
* calculations or look-up tables to derive the temperature. The on-chip 12-bit
* ADC offers resolutions down to 0.0625°C. The devices are available in the
* industry standard LM75 SOIC-8 and MSOP-8 footprint.
*/
#include "tmp75.h"
/*!
* \brief Convert address line state to slave address
*
* \retval slave address or 0xff if address line state combination is invalid
*/
uint8_t Tmp75_SlaveAddress(Tmp75_AddressLine_t a2, Tmp75_AddressLine_t a1,
Tmp75_AddressLine_t a0)
{
typedef struct
{
Tmp75_AddressLine_t a2;
Tmp75_AddressLine_t a1;
Tmp75_AddressLine_t a0;
uint8_t SlaveAddress;
} Lm75_addrconv_t;
const Lm75_addrconv_t Lm75_addrconv[] =
{
{Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x48},
{Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_One, 0x49},
{Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_Zero, 0x4A},
{Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_One, 0x4B},
{Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x4C},
{Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_One, 0x4D},
{Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_Zero, 0x4E},
{Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_One, 0x4F},
{Tmp75Addr_Float, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x70},
{Tmp75Addr_Float, Tmp75Addr_Zero, Tmp75Addr_Float, 0x71},
{Tmp75Addr_Float, Tmp75Addr_Zero, Tmp75Addr_One, 0x72},
{Tmp75Addr_Float, Tmp75Addr_One, Tmp75Addr_Zero, 0x73},
{Tmp75Addr_Float, Tmp75Addr_One, Tmp75Addr_Float, 0x74},
{Tmp75Addr_Float, Tmp75Addr_One, Tmp75Addr_One, 0x75},
{Tmp75Addr_Float, Tmp75Addr_Float, Tmp75Addr_Zero, 0x76},
{Tmp75Addr_Float, Tmp75Addr_Float, Tmp75Addr_One, 0x77},
{Tmp75Addr_Zero, Tmp75Addr_Float, Tmp75Addr_Zero, 0x28},
{Tmp75Addr_Zero, Tmp75Addr_Float, Tmp75Addr_One, 0x29},
{Tmp75Addr_One, Tmp75Addr_Float, Tmp75Addr_Zero, 0x2A},
{Tmp75Addr_One, Tmp75Addr_Float, Tmp75Addr_One, 0x2B},
{Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_Float, 0x2C},
{Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_Float, 0x2D},
{Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_Float, 0x2E},
{Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_Float, 0x2F},
{Tmp75Addr_Zero, Tmp75Addr_Float, Tmp75Addr_Float, 0x35},
{Tmp75Addr_One, Tmp75Addr_Float, Tmp75Addr_Float, 0x36},
{Tmp75Addr_Float, Tmp75Addr_Float, Tmp75Addr_Float, 0x37},
{Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x48},
{Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_One, 0x49},
{Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_Zero, 0x4A},
{Tmp75Addr_Zero, Tmp75Addr_One, Tmp75Addr_One, 0x4B},
{Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_Zero, 0x4C},
{Tmp75Addr_One, Tmp75Addr_Zero, Tmp75Addr_One, 0x4D},
{Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_Zero, 0x4E},
{Tmp75Addr_One, Tmp75Addr_One, Tmp75Addr_One, 0x4F}
};
int i;
for (i = 0; i<(sizeof(Lm75_addrconv) / sizeof(Lm75_addrconv[0])); i++)
{
if ( (Lm75_addrconv[i].a0 == a0) &
(Lm75_addrconv[i].a1 == a1) &
(Lm75_addrconv[i].a2 == a2) ) return Lm75_addrconv[i].SlaveAddress;
}
return 0xff;
}
HAL_StatusTypeDef Tmp75_Init(I2C_HandleTypeDef *hi2c, uint8_t adr,
Tmp75_regconf_t cfg) {
uint16_t regval = cfg.r << 8;
return Tmp75_Write_Register(hi2c, adr, TMP75_RCONF, regval);
}
HAL_StatusTypeDef Tmp75_Write_Register(I2C_HandleTypeDef *hi2c, uint8_t adr,
uint8_t register_pointer, uint16_t register_value) {
uint8_t data[3];
data[0] = register_pointer; // Register address
data[1] = register_value >> 8; // MSB byte of 16bit data
data[2] = register_value; // LSB byte of 16bit data
return HAL_I2C_Master_Transmit(hi2c, adr<<1, data, 3, 100);
}
HAL_StatusTypeDef Tmp75_Read_Register(I2C_HandleTypeDef *hi2c, uint8_t adr,
uint8_t register_pointer, uint8_t* receive_buffer) {
HAL_StatusTypeDef status;
// first set the register pointer to the register wanted to be read
status = HAL_I2C_Master_Transmit(hi2c, adr<<1, ®ister_pointer, 1, 100);
// receive the 2 x 8bit data into the receive buffer
status |= HAL_I2C_Master_Receive(hi2c, adr<<1 | 0x01, receive_buffer, 2, 100);
return status;
}
HAL_StatusTypeDef Tmp75_Read_Teperature(I2C_HandleTypeDef *hi2c, uint8_t adr,
float* temperature) {
HAL_StatusTypeDef status;
uint8_t T_buffer[2];
uint16_t temp;
status = Tmp75_Read_Register(hi2c, adr, TMP75_RTEMP, T_buffer);
if (status == HAL_OK)
{
temp = ((T_buffer[0]<<8) | T_buffer[1]) >> 4;
*temperature = (float)temp * 0.0625f;
}
return status;
}
|
rabiš še tegale:
Koda: |
/***
* ____ ____ _ ____ ____ ___ __ __
* / ___| / ___|(_)| _ \ | _ \ / _ \ | \/ |
* \___ \ | | | || | | || |_) || | | || |\/| |
* ___) || |___ | || |_| || _ < | |_| || | | |
* |____/ \____||_||____/ |_| \_\ \___/ |_| |_|
* (C)2018 Scidrom
Description: TMP75 driver
License: GNU General Public License
Maintainer: S54MTB
*/
/******************************************************************************
* @file TMP75.h
* @author S54MTB
* @version V1.0.0
* @date 15-January-2018
* @brief TMP75 header file
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2018 Scidrom
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
******************************************************************************
*/
#ifndef __TMP75_H__
#define __TMP75_H__
#include "stm32l0xx_hal.h"
/** Register addresses */
#define TMP75_RTEMP 0x00 /// Temperature register
#define TMP75_RCONF 0x01 /// Configuration register
#define TMP75_RTEMPL 0x02 /// TLOW register
#define TMP75_RTEMPH 0x03 /// THIGH register
#define TMP75_RESOLUTION_9BITS 0
#define TMP75_RESOLUTION_10BITS 1
#define TMP75_RESOLUTION_11BITS 2
#define TMP75_RESOLUTION_12BITS 3
/** \brief Structure of Configuration register in TMP75
*/
typedef union
{
struct
{
uint8_t SD :1; /*!< bit: 0 Shutdown Mode */
uint8_t TM :1; /*!< bit: 1 Thermostat Mode */
uint8_t POL :1; /*!< bit: 2 Polarity */
uint8_t F :2; /*!< bit: 3...4 Fault Queue */
uint8_t R :2; /*!< bit: 5...6 Converter Resolution */
uint8_t OS :1; /*!< bit: 7 One-Shot */
} b;
uint8_t r;
} Tmp75_regconf_t;
typedef enum
{
Tmp75Addr_Zero,
Tmp75Addr_One,
Tmp75Addr_Float
} Tmp75_AddressLine_t;
/*!
* \brief Convert address line state to slave address
*
* \retval slave address or 0xff if address line state combination is invalid
*/
uint8_t Tmp75_SlaveAddress(Tmp75_AddressLine_t a2, Tmp75_AddressLine_t a1,
Tmp75_AddressLine_t a0);
HAL_StatusTypeDef Tmp75_Init(I2C_HandleTypeDef *hi2c, uint8_t adr,
Tmp75_regconf_t cfg);
HAL_StatusTypeDef Tmp75_Write_Register(I2C_HandleTypeDef *hi2c, uint8_t adr,
uint8_t register_pointer, uint16_t register_value);
HAL_StatusTypeDef Tmp75_Read_Register(I2C_HandleTypeDef *hi2c, uint8_t adr,
uint8_t register_pointer, uint8_t* receive_buffer);
HAL_StatusTypeDef Tmp75_Read_TempCelsius(I2C_HandleTypeDef *hi2c, uint8_t adr,
float* receive_buffer);
HAL_StatusTypeDef Tmp75_Read_TempEeprom(I2C_HandleTypeDef *hi2c, uint8_t adr,
uint16_t* receive_buffer);
HAL_StatusTypeDef Tmp75_One_ShotTemp(I2C_HandleTypeDef *hi2c, uint8_t adr);
HAL_StatusTypeDef Tmp75_Read_Teperature(I2C_HandleTypeDef *hi2c, uint8_t adr,
float* temperature);
#endif
|
Kličeš pa takole (po inicializaciji I2C):
Koda: |
Tmp75_regconf_t TMP75_cfg;
uint8_t tmp75addr;
HAL_StatusTypeDef status = HAL_ERROR;
int32_t mctemp;
TMP75_cfg.b.R = TMP75_RESOLUTION_12BITS;
TMP75_cfg.b.OS = 1;
TMP75_cfg.b.F = 0;
TMP75_cfg.b.POL = 0;
TMP75_cfg.b.TM = 0;
TMP75_cfg.b.SD = 0;
tmp75addr = Tmp75_SlaveAddress(Tmp75Addr_Zero, Tmp75Addr_Zero, Tmp75Addr_Zero);
status = Tmp75_Init(&I2Chandle, tmp75addr, TMP75_cfg);
if (status == HAL_OK) status = Tmp75_Read_Teperature(&I2Chandle, tmp75addr, T);
|
TMP75 ima zanimiv način nastavljanja I2C naslova. Imaš 3 pine, ki so lahko 1, 0 ali nikamor vezan. S tem dobiš veliko kombinacij. Tako imaš lahko na enem I2C vodilu res veliko senzorjev.
Gornji primer je namenjen uporabi s HAL hnjižnicami. Sam I2C skonfiguriraš v CubeMX.
Upam, da ti pride prav.
LP,
M. _________________ Always going the extra mile. |
|
Nazaj na vrh |
|
|
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Čet Mar 01, 2018 12:41 pm Naslov sporočila: |
|
|
Bom še malo pretuhtal, kaj se mi najbolj splača.
Zelo verjetno se bom odločil za digitalni senzor, saj bi si z analognim nakopal kup težav pri povezovanju mas - razdalja med senzorjem in ostalim vezjem nebo tako kratka in zato bi lahko imel probleme, da bi mi tokovi na masi pokvarili meritve. Seveda bi jih poskušal omejiti ampak zakaj bi koplicirali.
Najlepša hvala za odgovor in trud. |
|
Nazaj na vrh |
|
|
Eisenhorn Član
Pridružen-a: Tor 08 Dec 2009 11:50 Prispevkov: 200 Aktiv.: 1.15 Kraj: LJ
|
Objavljeno: Čet Mar 01, 2018 4:18 pm Naslov sporočila: |
|
|
Jaz sem uporabljal DS18B20 vstavljene v luknjo v hladilniku.
Lp |
|
Nazaj na vrh |
|
|
polkic Član
Pridružen-a: Pon 04 Dec 2017 20:27 Prispevkov: 68 Aktiv.: 0.88
|
Objavljeno: Čet Mar 01, 2018 6:22 pm Naslov sporočila: |
|
|
Pozdravljen,
če potrebuješ dejansko vrednost temperature in boš s pomočjo te reguliral hlajenje, potem bo ena od zgoraj omenjenih rešitev idealna.
V primeru, da pa bi rad samo varoval pred pregretjem, lahko uporabiš en termistor in primerjalnik (mogoče celo dual comperator za 2 meritve- ena opozorilo, druga pa izklop) in mu nastaviš vrednosti glede na krivuljo termistorja. V tem primeru potrebuješ samo en digitalni vhod (dual verzija 2 ) in se lahko izmakneš uporabi analogije in komunikacije. Ena taka opcija je LM393
Lep pozdrav. |
|
Nazaj na vrh |
|
|
zaz Član
Pridružen-a: Pon 06 Apr 2015 14:23 Prispevkov: 89 Aktiv.: 0.81 Kraj: Ljubljana
|
Objavljeno: Pet Mar 02, 2018 12:25 pm Naslov sporočila: |
|
|
Eisenhorn je napisal/a: |
Jaz sem uporabljal DS18B20 vstavljene v luknjo v hladilniku.
Lp |
Na kakšen način so bili vstavljeni? So bili zaliti s kakšno termoprepustno pasto? |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 49 dni
Powered by phpBB © 2001, 2005 phpBB Group
|