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 :lol:

Det är nog en klok pojk fastän han inte tillför något till tråden.

Fö. gäller det jag skrivit ovan. 8)

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.. :wink:

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! :lol:

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
}