Sida 1 av 1
DS2890 för 0-10 V
Postat: 03 nov 2011, 17:05
av ekdahl
Hej
Först och främst vill jag säga att jag är ny på det här med 1-wire.
Jag har påbörjat ett projekt där jag hoppas kunna styra ställdonet till min radiatorshunt via 1-wire med en 0-10 VDC signal.
Till detta ändamål har jag införskaffat några DS2890 (TO-92). Är det riktigt att det går att åstadkomma en sådan signal med hjälp av denna krets? Hur ska det i sådana fall kopplas?
Jag är lite förvirrad när det gäller det här med pull-up-motstånd. När behövs ett sådant (bara vid parasitisk?) och hur stort bör det vara då kretsen (DS2890) finns alldeles inpå "adaptern"?
Jag kör OWFS på en QNAP TS-109 NAS som kör Debian.
Re: DS2890 för 0-10 V
Postat: 04 nov 2011, 13:51
av ekdahl
Nu är min DS2890 inkopplad och jag har kontakt med den genom owserver.
Genom att ändra WIPER så varieras motståndet mellan benen GND och RH från 0 till 100 kOhm.
Kan jag använda detta varierande motstånd för att få ut någon av följande signaler?
0-10 V, 2-10 V, 0-20 mA eller 4-20 mA (detta är de signaler som ställdonet accepterar)
Det bästa vore om man kan använda 24 VDC som jag ändå tänkt mata ställdonet med.
Re: DS2890 för 0-10 V
Postat: 04 nov 2011, 14:09
av bruka
Nu har jag ingen utbildning på elektronik men en spänningsdelare borde väl lösa problemet, 140 k motstånd tillsammans med ditt 100 k ger 10 volt (10 k = 1,6 volt) om du matar med 24 volt enligt Electrodroid i min mobil.
Men någon annan kanske har ett bättre förslag?
Re: DS2890 för 0-10 V
Postat: 04 nov 2011, 14:48
av ekdahl
bruka skrev:Nu har jag ingen utbildning på elektronik men en spänningsdelare borde väl lösa problemet, 140 k motstånd tillsammans med ditt 100 k ger 10 volt (10 k = 1,6 volt) om du matar med 24 volt enligt Electrodroid i min mobil.
Men någon annan kanske har ett bättre förslag?
Tack!
Ska prova detta.
Re: DS2890 för 0-10 V
Postat: 04 nov 2011, 15:01
av bruka
Här är en sida där du kan räkna ut vilka motstånd du behöver:
http://www.electronics2000.co.uk/calc/p ... ulator.php
R2 är ditt 100k
Re: DS2890 för 0-10 V
Postat: 05 nov 2011, 14:28
av elf98
Sen får man inte glömma att det får ligga max 11V över DS2890.
Re: DS2890 för 0-10 V
Postat: 07 nov 2011, 16:32
av ekdahl
elf98 skrev:Sen får man inte glömma att det får ligga max 11V över DS2890.
Jag har fixat ett motstånd på 150 kOhm, så då bör det väl vara lugnt?
Enligt beräkningen på ovan länkade sidan så blir det som mest 9,6 V.
Re: DS2890 för 0-10 V
Postat: 23 nov 2011, 13:44
av bruka
ekdahl, Hur har det gått för dig, fått det att fungera?
Re: DS2890 för 0-10 V
Postat: 24 nov 2011, 17:02
av ekdahl
bruka skrev:ekdahl, Hur har det gått för dig, fått det att fungera?
Ja, själva utgången funkar fint.
Med ett motstånd på 150 kOhm och 24 VDC får jag följande spänningar:
Wiper = 0 ger 8,64 V
Wiper = 255 ger 0 V
Wiper-positionerna mellan ger relativt linjär spänning.
Problemet med shunt-styrningen är att mitt ESBE-ställdon visade sig vara kortslutning i, så jag får skaffa ett annat. Ska skaffa mig ett Belimo-ställdon istället.
Re: DS2890 för 0-10 V
Postat: 07 dec 2011, 11:36
av ekdahl
Tänkte göra en liten statusuppdatering. Nu har jag kommit ytterligare en bit på vägen i mitt projekt att styra värmen i huset. Det nya ställdonet är på plats och det styrs nu av ett program som körs på en annan server än den som syns på bilden. Tänkte lyfta över programmet till servern på bilden när jag ser att allt fungerar.
Klistrar in programmet i sin helhet här, ifall någon är intresserad.
Kod: Markera allt
<?php
// Debug?
define("DEBUG", true);
// Declare variables
$DeltaTime = 10;
$Continue = true;
$OutdoorTemp = 2;
// Quit nicely when asked to
function SignalHandler($signal)
{
switch ($signal) {
case SIGTERM:
case SIGINT:
$Continue = false;
break;
}
}
// Linear interpolation between two known points
function Interpolate($x0, $y0, $x1, $y1, $x)
{
if ($x == $x0)
return $y0;
if ($x == $x1)
return $y1;
else
return $y0+($x-$x0)*($y1-$y0)/($x1-$x0);
}
// Sets the valve position between 0 and 100 %
function SetValvePosition($position)
{
$Temp = Interpolate(0, 255, 100, 0, $position);
$Output = round(min(max(intval($Temp), 0), 255));
exec("owwrite -s 192.168.1.2 /shunt/wiper $Output");
echo "Wrote $Output to wiper\n";
}
function PIDController($setpoint, $actual_value)
{
$PGain = 1.0;
$IGain = 0.1;
$DGain = 10.0;
global $DeltaTime;
static $PreviousError = 0;
static $IntegralPart = 0;
// Calculate deviation
$Error = $setpoint - $actual_value;
// Proportional part
$Proportional = $PGain * $Error;
// Integral part
$IntegralPart = $IntegralPart + $Error * $DeltaTime;
$Integral = min(max($IGain * $IntegralPart, -100), 100);
// Derivative part
$Derivative = $DGain * ($Error - $PreviousError)/$DeltaTime;
// Combine P, I and D
$Output = $Proportional + $Integral + $Derivative;
// Limit output
$Output = min(max($Output, 0), 100);
if (DEBUG) echo "Regulator output: ".round($Output, 1)." %\n";
if (DEBUG) echo "P: ".round($Proportional, 1);
if (DEBUG) echo " I: ".round($Integral, 1);
if (DEBUG) echo " D: ".round($Derivative, 1)."\n";
// Update error
$PreviousError = $Error;
return $Output;
}
// Setup signal handler
pcntl_signal(SIGTERM, "SignalHandler");
// Main loop
while ($Continue)
{
// Get supply temp
$SupplyTemp = floatval(exec("owread -s 192.168.1.2 /uncached/framledning_rad/temperature"));
if (DEBUG) echo "Supply temperature: $SupplyTemp C\n";
// Get outdoor temp
// implement later
// Calculate setpoint
$Setpoint = Interpolate(-20, 50, 20, 20, $OutdoorTemp);
if (DEBUG) echo "Setpoint: $Setpoint C\n";
// Call PID regulator
$PIDOutput = PIDController($Setpoint, $SupplyTemp);
// Set the valve position
SetValvePosition($PIDOutput);
// Wait a while
sleep($DeltaTime);
}
?>
Edit:
Kan tillägga att jag "tänkt" göra en mer fast installation, får se hur det blir med det.
Här kan ni se framledningstemperaturen i en graf:
http://solhaga.homeip.net/?page_id=101
Sidan är under uppbyggnad, så ha överseende med eventuella konstigheter...
Regleringen har varit stabil med avvikelser < 0,2 °C i nån timma nu, så det ser ut att fungera.
DS2890 för 0-10 V
Postat: 16 dec 2011, 00:06
av MartinF
Jätteintressant! Vad gäller värmen så styr jag själv ännu bara golvvärmeventilerna med ett perl-script. Radiatorshunten styrs via en Danfoss-regulator som dock har en override-funktion som jag använder för nattsänkning och vid frånvaro. På väg hem från Gran Canaria härom veckan så slog jag på värmen när vi var över Danmark.
Har inte ens funderat över en while-loop i php och en NAS. Får du inte time-out efter ett tag? Hur initieras scriptet vid strömavbrott?
Re: DS2890 för 0-10 V
Postat: 16 dec 2011, 07:27
av ekdahl
MartinF skrev:Jätteintressant! Vad gäller värmen så styr jag själv ännu bara golvvärmeventilerna med ett perl-script. Radiatorshunten styrs via en Danfoss-regulator som dock har en override-funktion som jag använder för nattsänkning och vid frånvaro. På väg hem från Gran Canaria härom veckan så slog jag på värmen när vi var över Danmark.
Kul! Man blir mäkta nöjd när man fjärrstyr sina grejer och det fungerar

.
MartinF skrev:Har inte ens funderat över en while-loop i php och en NAS. Får du inte time-out efter ett tag? Hur initieras scriptet vid strömavbrott?
Det har iaf fungerat en vecka nu. Att jag valde php istället för t.ex. C var för att slippa krångla med kompilering och att det är lätt att använda databasen vid behov. Tänkte lägga in reglerparametrarna i databasen senare, så att det ska bli lätt att ändra dessa via webbsidan.
Scriptet startas enligt
http://wiki.temperatur.nu/index.php?tit ... t_vid_boot, fast själva startkommandot är:
nohup /usr/bin/php /media/intern/automation/radiator_regulator.php &
Strömavbrott har vi inte haft än, så det återstår att se hur startscriptet fungerar vid boot. Det går iaf bra att starta det manuellt.