Sida 3 av 4
Krånglar med decimaler.
Postat: 23 januari 2007, 05:24:58
av SvenPon
Nyfiken vilken processorhastighet har Ni på BS2
Med tanke på hur stor Forloopen man måste göra, optimalt 0.5 sek
Det måste väl gå att göra så här i BS2
Kör en For loop 100 000 ggr
Kolla hur många Thigh du fick. Tlow är ointressant.
Kör denna formel
(Thigh / 100 000 - 0.32) / 0.0047
Voila klart med decimaler och allt. svar i C
Postat: 23 januari 2007, 11:04:42
av John
"Nyfiken vilken processorhastighet har Ni på BS2 "
"Med tanke på hur stor Forloopen man måste göra, optimalt 0.5 sek "
Processorn i BS2 (pic16C57) tuggar på i 20MHz. Men eftersom BS2an inte kör maskinkod utan har en inbyggd Basic-tolk så är det svårt att avgöra hur lång tid varje instruktion tar. Varje Basic-instruktion hämtas från ett externt EEPROM så programkörningen blir långsam.
Visst kan man på något sätt kalibrera hur lång for-loop som behövs, men då tycker jag det verkar lättare att använda pulskvoten.
SvenPon, vad är det som gör 0.5 s till optimalt tidsfönster att sampla i? Är bara nyfiken, såg inget om detta i databladet.
"(Thigh / 100 000 - 0.32) / 0.0047 "
"Voila klart med decimaler och allt. svar i C "
BS2 kan bara räkna med heltal därför är koden för att ta fram temperaturen så lång.
/John
BS2 Ahaaaa.
Postat: 23 januari 2007, 14:51:43
av SvenPon
Oki då förstår jag varför. Nästa fråga, hur visar Ni svaret ?
SvenPon, vad är det som gör 0.5 s till optimalt tidsfönster att sampla i?
Har läst det någonstans och håller med.Du får alldeles för "fladdriga" värde
mellan två mätningar om du inte tar många samplingar.
Rekommenderar dig att köra med 100 000 loopar i ditt projekt.
Blir det > 0.5 sek så dra ner till tex 50 000.
Kör själv på dator parallellport i 0.5 sek det blir väldigt stabilt,just nu -4.3 ute.
Postat: 23 januari 2007, 23:53:16
av danei
Gör man som det står i databladet så blir det nog bra.
Han är för klok den där danei
Postat: 24 januari 2007, 00:07:30
av SvenPon
På tal om goddag yxskaft
Det är nog en klok pojk fastän han inte tillför något till tråden.
Fö. gäller det jag skrivit ovan.

Postat: 24 januari 2007, 15:19:34
av danei
Enligt databladet ligger bruset under 0,005°C Så att du f¨r så mycket brus att duåste medelvädesbilda beror på ditt interface. Absolutonogranheten ligger undet 0,7°C vid dina temeraturer. Så att du behöver kompensera tyder också på att du gör något fel. Du kan ju hoppas att du gör ett absolut fel så att kompenseringen blir rätt ialla fall.
Postat: 24 januari 2007, 20:34:32
av FormerMazda
John! Tack för koden!
Drog in den rätt o slätt som den var. Och det ser ju ut att funka kalas!
Dock har jag ett "intressant fladder."
Den fladdrar mellan 21,30 och 23,43, och den har gjort det länge nu. Inga regelbundna tider på fladdret, ibland tar det 0,5s, ibland 1s eller så. Uppskattat.
Värmer/kyler jag den så ändras värdena ganska stabilt ändå. Men just mätning orörd så är det fladder. Vad tror vi det beror på?
Den får +5v från en 7805 som även matar BS2an. Gjort ett eget labbkort..

Postat: 24 januari 2007, 22:52:42
av John
Är det bara mellan dessa värden som den fladdrar?
kan vara nåt fel på programkoden.
Kan du inte försöka fånga de värden som BS2an mäter upp på Thigh och Tlow när den fladdrar, så kan man köra dessa manuellt genom programmet och se om felet ligger där.
Bara infoga:
debug dec Thigh, CR, dec Tlow
efter
PULSIN 0,0,Tlow
Postat: 25 januari 2007, 09:34:16
av Spinky Spendrup
Kastar in lite kod för att läsa SMT160 med AVR capture 3 på mega2560 i det här fallet... Säkert nån som har nytta av.
Skräpigt, klippt & klistrat och onödiga variabler? U bet!
Kod: Markera allt
#include <avr/io.h>
#include <avr/interrupt.h>
static volatile unsigned int periodStart;
static volatile unsigned int periodTime;
static volatile unsigned int pulseStop;
static volatile unsigned int totalTime;
static volatile float delta;
ISR(TIMER3_CAPT_vect)
{
static unsigned int icr;
icr=ICR3; //Store Current time stamp
if (TCCR3B & (1<<ICES3)) //If searching for positive flank
{
TCCR3B &= ~(1 << ICES3); //Configure for negative flank search
periodTime=icr-periodStart; //Period time = pos flank time - Previous pos flank time
delta=(float)(pulseStop-periodStart)/periodTime; //Duty = positive time / period time
periodStart=icr; //Store pos flank time
}
else //Else searching for negative flank
{
pulseStop=icr; //Store neg flank time
TCCR3B |= (1 << ICES3); //Configure for positive flank search
}
}
int main(void)
{
float temperature;
TCCR3A=0; //Don't care
TCCR3B = 1<<ICES3 | 1<< CS30; //Rising edge, prescaler=1
TIMSK3 = 1<<ICIE3; //Enable capture interrupt
sei(); //Enable all interrupts
while(1)
{
temperature=delta;
temperature-=0.32;
temperature/=0.0047;
//Do something with temperature
}
}
Postat: 25 januari 2007, 20:52:45
av FormerMazda
John:
Japp, mellan de värdena är det. Exakt dom.
Här är värdena det handlar om:
Thigh = 69 Tlow = 93
Ger : 21,30
Thigh = 70 Tlow = 93
Ger : 23,43
Ibland rör sig Tlow mellan 92 och 93, men det påverkar inte tempen.
Alla ni andra med kod till andra språk. Tackar för bidragen! Det finns ju fler än mig som försöker mäta temp med SMT160, och alla har ju inte en BS2.
Postat: 25 januari 2007, 21:38:21
av FormerMazda
Eller... Nu ser den stabil ut trots skiftande Thigh.
Måste kolla nogrannare om inte Tlow's skift mellan 92 o 93 har betydelse..
Edit:
Dåså, "manuella" värden inmatade.
Gör en lista här:
Thigh;Tlow = Temp;Temp_Decimal
70;93 = 21;30
69;93 = 21;30
69;92 = 21;30
70;92 = 23;43
Är för trött för att tänka. 12timmars arbetspass satte sina spår visst..
Postat: 26 januari 2007, 17:10:53
av John
Räknade lite och det verkar inte som Basicstampen klarar att ge dig bättre upplösning än ca 1,5 grad.
Se bild
[img=http://img159.imageshack.us/img159/7726/smt160rp0.th.png]
Den räta linjen visar den pulskvot som SMT160 skickar ut och den kantiga visar den pulskvot som Basicstampen mäter upp. Antingen behöver du nåt som är snabbare än basicstamp eller så får du dela ner frekvensen från SMTn.
Alltså !
Postat: 27 januari 2007, 12:38:50
av SvenPon
Gör som pappa säger
Sampla ~ 100 000 ggr under ~ 0.5 sek.
Bra John
Postat: 13 februari 2007, 16:35:41
av Limen
Rotar fram den här tråden igen. Hur ska man gå tillväga för att mäta av värdet på en SMT160 med ASM (AVR)?
SMT160+PIC16F84A
Postat: 9 mars 2007, 15:11:54
av Jakob O
Lånar tråden lite...
Jag håller på med ett litet projekt som i korthet går ut på att en motor ska starta när vatten kokar i en kastrull.
Använder en SMT160 och en PIC16F84A (hittade ingen annan PIC hemma...).
MEN jag får problem med att de matematiska operationerna är för komplexa.
Kompilatorn (CC5X) föreslår att jag ska ta med något bibliotek eller förenkla.
Kan inte en PIC16F84A räkna med float?
Ha en trevlig helg!
JakobO
Här är koden (Sorry att det blev lite långt...):
Kod: Markera allt
#include "16f84.h"
#pragma config WDTE=off, FOSC=RC
#pragma config |= 0x10
void main (void)
{
TRISA = 0b11111; /* PortA0-A4 blir ingångar */
TRISB = 0b00000000; /* PortB0-B7 blir utgångar */
uns16 nTime = 65535;
float fCounterh = 0; //Räknare för tiden då timern är hög
float fCounterl = 0; //Räknare för tiden då timern är låg
float fTemp = 0; //Temperaturen
float fT = 0; //Temporär post
uns16 nRelease = 0; //Ska motorn snurra?
while (1==1) // Evighetsloop
{
while ( PORTA.2 == 0) // Vänta på startsignal (knapptryckning)
{
; // Ingenting görs!
}
while (nRelease == 0)
{
while (PORTA.0 == 0) //Är SMT160 låg?
{
fCounterl=fCounterl+1; //Denna uträkning var för komplex
}
while (PORTA.0 == 1) //Är SMT160 hög?
{
fCounterh=fCounterh+1;//Denna uträkning var för komplex
}
fT=fCounterh/fCounterl;//Denna uträkning var för komplex
fTemp=fT-0.32;//Denna uträkning var för komplex
fTemp=fTemp/0.0047;//Denna uträkning var för komplex
if (fTemp < 90) //Vattnet kokar inte
{
PORTB=0b00000001;//Tänd lite lampor
}
else if (fTemp >= 90) //Vattnet kokar
{
PORTB=0b11111111;//Tänd några andra lampor
nRelease=1;//Signal för att motorn ska starta
}
fCounterh = 0;//Reset räknarna
fCounterl = 0;
}
while (nTime > 1)//Håll i gång motorn i ca 2 sekunder
{
PORTB=0b00000011;//Starta motorn
nTime=nTime-1;
}
} // Hopp tillbaka och vänta på att knappen trycks ner igen
}