Digital Termometer I den här uppgiften skall vi mäta temperaturen på ditt kaffe. Vi använder en termistor som temperaturkänslig givare och timerkretsen 555 som A/D omvandlare. Temperaturen presenterar vi sedan dels på en LCD display, men skickar den även till en PC och visar den på datorskärmen. Eftersom termistorn har ett olinjärt samband mellan temperatur och resistans måste vi göra en polynomanpassning av resistansen mot temperaturen. Termistorn har en negativ temperaturkoefficient (NTC), dvs dess resistans sjunker (mycket olinjärt) med stigande temperatur. Ändringen är verkligen stor, resistansen ändrar sig med en tiopotens för en ändring av några tiotal grader. Det gör att vi kan använda termistorn som en enkel och billig temperaturgivare. För att konvertera temperaturen till ett tal som enchipsdatorns program sedan kan behandla vidare låter vi först resistansen hos termistorn styra tiden hos en monostabil vippa.denärbyggdmedtimerkretsen555.tidenhosvippanmätervisedan genomatt räkna datorns klockpulser(k) i enchipsdatorns timer-del under den tid vippan är omställd. to PC +5V 1 VCC 2 RST G ND DS18 13 3 RS23 2 Com mun ication VDD 0.1u 28 RST +5V 0.1u 14 Vc c 8 4 Out OSC1 OSC 5 OSC2 1 IRQ 3 VSS MC6 8HC9 08JL3 A0 A1 A2 A3 A4 A5 B0 B1 B2 B3 B4 B5 B6 B D0 D1 D2 D3 D4 D5 D6 D J9 J10 B4 A4 B1 A4 B4 A1 B1 A1 B3 B3 A3 +5V +5V A3 A2 +5V +5V A2 +5V +5v +5v +5V B16 A16 UREG UREG B1 6 AC AC A1 6 2 A6 A6 6 A PA 0 PA0 A 8 A8 PA 1 PA1 A8 9 A9 PA 2 PA2 A9 PA 3 PA3 23 A15 A1 5 PA 4 PA4 2 A5 A5 PA 5 PA5 21 20 18 1 15 12 11 10 16 19 24 22 26 25 14 13 A10 A11 A12 B15 A14 B14 A13 B13 B12 B11 B10 B9 B8 B B6 B5 B2 PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD INT PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD INT A1 0 A11 A1 2 B1 5 A1 4 B1 4 A1 3 B1 3 B1 2 B11 B1 0 B9 B8 B B6 B5 B2 0.1uF 4 5 RS 6 R/W E 8 D0 9 D1 10 D2 11 D3 12 D4 13 D5 14 D6 D 3 C 2 5 TRIG 5V 4 R Q 3 555 DI S CV THR 6 330 nf 5V TERMISTOR 32PINJL3 32PINJL3 LCD Teori Termometern använder timern 555 och ett NTC-motstånd. Tiden ( t ) som vippan är omställd i sitt instabila läge ges av formeln: t =1.1RC där R är termistorns resistans och C är 0.33 mikrofarad. Vid rumstemperatur, c:a 25 grader, är termistorns resistans 10 kohm. Vi får då att vippan står i sitt instabila läge 2003-09-01 Termometern- 1 PN
under c:a 3,6 ms. Timern i enchipsdatorn har en klockfrekvens på 2,456 MHz eftersom vi använder 9,8304 MHz oscillator. Vi kommer alltså att räkna c:a 9000 klockpulser under denna tid, om vi sätter prescalern till ett. Antalet räknade klockpulser (K) är alltså proportionellt mot tiden (t). K=245600*t eller K=0,892*R dvs R=1,12*K Vidare vet vi att temperaturen(t) är någon okänd funktion(f) av termistorns resistans (R). T=f(R) Kombinerar vi dessa uttryck får vi att temperaturen (T) är någon (matematiskt okänd) funktion av antalet klockpulser (K). T=f(K) Nu skall vi konvertera de räknade klockpulserna (K) till temperatur (T). Tyvärr råder det ju inte ett enkelt linjärt samband mellan termistorns resistans och temperaturen, utan det är något krokigt logaritmartat okänt samband. Har man ett olinjärt samband kan man alltid antaga att det gäller ett polynomsamband i ett delintervall. Går man till extremvärden spricker det, men det skall vi passa oss för. Vi antar alltså helt frankt att vi kan ange temperaturen T som ett polynom av de räknade klockpulserna K (dvs indirekt tiden t), dvs att: T=A 0 +A 1 *K 1 +A 2 *K 2 +A 3 *K 3... där A 0,A 1,A 2 osv är polynomets koefficienter som ger sambandet mellan klockpulser och temperatur. Då gäller det att på något sätt bestämma koefficienterna i polynomet så att vi, när vi sedan känner antalet klockpulser, bara kan sätta in dem i polynomet och helt enkelt beräkna temperaturen. För att bestämma koefficienterna i polynomet använder vi oss av ett separat polynomanpassningsprogram kallat SENSOR. Det programmet vill som indata ha en tabell med temperaturen given för olika antal klockpulser. Du måste alltså mäta upp givarens egenskaper genom att mäta antalet klockpulser vid några olika temperaturer. Du går sedan in i programmet SENSOR och talar om namnet på den datafil där du kommer att lagra dina mätvärden. Där startar du editorn och skriver in dina mätvärden som en tvåkolumners tabell, med klockpulserna i den första kolumnen och temperaturen i den andra. Lämna editorn och spara dina mätvärden i en fil. Du kan nu prova att göra polynomanpassningen för några olika gradtal. Sannoligt blir det bra med tredje gradens polynom. När du är nöjd med anpassningen sparar du koefficienterna som en ny fil i datorn. Koefficienterna kommer då att sparas på en form som enchipsdatorns assemblator och biblioteksprogram direkt kan hantera. 2003-09-01 Termometern- 2 PN
När du nu känner koefficienterna i polynomet är det enkelt för enchipsdatorn att utifrån ett uppmätt antal klockpulser beräkna temperaturen. Du använder subrutinen POLYNOM som ligger i biblioteksmodulen POLYNOM.LIB, som du helt enkelt kopierar in i ditt eget program. Nu gäller det att få ut den beräknade temperaturen på LCD-displayen. Du måste då först omvandla talformatet för temperaturen från flyttalsformat (dvs med taldel och exponent) till ett vanligt binärt heltal. Det finns det en biblioteks-rutin föri biblioteksmodulen MATH.LIB. Därefter skall talet omvandlas från binärt tal (talbasen två) till decimalt tal (talbasen tio). Det gör du med biblioteksrutinen BINBCD.LIB. Och slutligen skall BCD-talen göras om till ASCII tecken med BCDASCII.LIB och matas ut på displayen. Kommunikation med PC. Flash-systemets moderkort är bestyckat med kretsar som möjliggör kommunikation med en PC via ett s.k. seriellt gränssnitt, kallat RS-232. Kommunikationen sker mellan en av PC s.k. COM-portar och moderkortet. Den vanligaste användningen av denna kommunikation är vid programmeringen av enchipsdatorns Flash-minne, men vi kan också använda den för att låta PC och enchipsdatorn överföra kommandon och mätdata. Enchipsdatorn använder bit 4 i A-porten för denna kommunikation, och PC använder någon av sina COM-portar. Överföringen sker i 9600 Baud, dvs 9600 bitar per sekund. Eftersom varje tecken kräver totalt 11 bitar (inklusive en startbit och två stoppbitar) kan man överföra c:a 80 tecken per sekund. För att underlätta programmeringen av enchipsdatorn finns en biblioteksfil, kallad RS232.LIB, som innehåller rutiner för sändning och mottagning av tecken, och för sändning av en textsträng till PC. Eftersom enchipsdatorn använder bit fyra i A-porten både för sändning och mottagning, kan man naturligtvis inte både sända och mottaga samtidigt. Om man är duktig på att programmera en PC kan man skriva egna program för PC som sänder kommandon och tar emot och visar mätdata från enchipsdatorn. Annars följer det med ett litet program som man kan köra i sin PC. Det är bara att kopiera in EXE-filen på lämpligt ställe i datorn och dubbelklicka på programnamnet så går programmet igång. Det finns inget som man behöver installera. Nu är det dags att börja skriva programmet. Till din hjälp finns ett flödesdiagram som du kan utnyttja för att få en snygg struktur på ditt program. I kopplingsschemat över kretsen ser du att det finns två förbindelser mellan enchipsdatorn och 555-kretsen. Den första går från bit 3 i A-porten till 555-kretsens trig-ingång. Den signalen används för att trigga 555 och därmed göra en mätning av tiden. 555 triggas av en negativt gående signal (en negativ flank). Omedelbart efter triggningen måste denna signal tas tillbaka till hög nivå för att inte 555 skall tvingas kvar i sitt instabila läge, utan tillåtas gå tillbaka till sitt stabila läge sedan RC-tiden förflutit.denna signal skall alltså normalt ligga på hög nivå. 2003-09-01 Termometern- 3 PN
Den andra signalen går från 555-kretsens Q-utgång till Interrupt (IRQ) och bit 5 i A-porten på enchipsdatorn. Genom att signalen går till Interruptingången kan du avgöra när 555-kretsen tippar tillbaka till sitt stabila läge. 1. Börja med att skriva ett program som gör en mätning med timerkretsen men bara skriver ut antalet klockpulser på displayen. Det programmet skall du ha för kalibreringen. Tänk på att innan du triggar 555 måste du ha stoppat timern, nollställt den och valt prescaler till ett. Därefter triggar du 555-an och startar timern. Sedan är det bara att vänta på att interruptpinnen, och därmed 555 Q-utgång, skall bli låg för att markera att 555 tippat tillbaka till sitt stabila läge. Då läser man av tidens 16 bitar i timerns räknarregister och lagrar talet i variablerna R1M och R1L. Detta binära tal omvandlar du först till ett decimalt tal med hjälp av biblioteksrutinen BINBCD.LIB. Du får då talet på BCD-format. Slutligen omvandlar du de decimala BCD-talen till ASCII-tecken med biblioteksrutinen BCDASCII.LIB, för att därefter skriva ut ASCII-strängen på LCD-displayen med biblioteksrutinen LCDSTR. 2. Mät upp antalet klockpulser för minst10 olika temperaturer i intervallet 60-20 grader. Tappa upp lite varmvatten och låt det svalna. Termisk jämvikt inträder så småningom, så det gäller att ta det lite lungt. Använd en vanlig sprittermometer. Skriv in mätvärdena i en fil på datorn med hjälp av SENSOR-programmets editor. Tänk på om det är temperaturen eller antalet klockpulser som skall stå i första kolumnen. 3. Gör sedan själva polynomanpassningen. Prova med olika gradtal. Kontrollera att ingen datapunkt avviker alltför kraftigt så att man kan befara en felmätning i den punkten. Spara de framräknade koefficienterna som en fil i datorn. 4. Utöka nu ditt program så att det tar antalet klockpulser och sätter in det i polynomet och räknar fram temperaturen. Så låter du programmet skriva ut temperaturen i stället för antalet klockpulser på displayen. Observera att samma variabler kan uppträda i flera biblioteksrutiner. Det finns alltså en risk för dubbeldeklaration. Tänk även på att vissa variabler måste stå i den ordning som de är deklarerade i MATH.LIB modulen. Det beror på att man använder indexerad adressering, och därför förväntar sig variablerna i den deklarerade ordningen. Detta gäller exempelvis variablerna i matterutinerna. Titta efter i texten som inleder biblioteksmodulerna vad som gäller. 5. Utöka programmet med lite snygg text i displayen, t.ex. TEMP=. 6. Efter temperaturen skall du skriva ett gradtecken och C på displayen. Gradtecknet har ASCII-värdet $DF på LCD-displayen.. När programmet snurrar och visar temperaturen på LCD-displayen är det dags att bygga ut programmets mät-loop så att det först inväntar att det tar emot ett T från PC innan det gör en mätning. När programmet har gjort en mätning och skrivit ut temperaturen på LCD-displayen, skall det även skicka mätvärdet (bara siffrorna) som en textsträng till PC och avsluta överföringen med tecknet Return som har ASCII-värdet $0D. 2003-09-01 Termometern- 4 PN
8.Omduhinnerkanduutökaantaletsiffrortillattomfattaävenendecimal.Dåskalldu multiplicera temperaturen med 10 innan du omvandlar till binärt heltal, och sedan stoppa in decimalpunkten på rätt ställe när du skriver ut talet. Observera dock att det är lättattfåframenmassasiffrormedendator,medattdeskallhanånsignifikansockså! PC-programmet. Programmet är utvecklat i Delphi-5 från Borland och är på c:a 100 rader Pascal-kod. När programmet startas måste du ange vilken COM-port som Flash-systemet sitter anslutet till. Därefter öppnar du kommunikationen med enchipsdatorn. Du kan sedan skicka ut enstaka T -tecken genom att klicka på knappen Sänd ett T, eller skicka ett T i sekunden genom att klicka på Kör Kontinuerligt. PC-programmet läser av inkomna tecken 100 gånger i sekunden och när den får ett Return skriver den ut alla inkomna tecknen i fönstret. Innan du får avsluta programmet måste du stänga kommunikationen med COM-porten. Därefter kan du avsluta programmet genom att klicka i krysset längst upp till höger. 2003-09-01 Termometern- 5 PN
Flödesdiagram för termometern. INITIERINGAR Bit 3 i port A riktas utåt och sätts till 1 Hela port D riktas utåt (LCD) Bitarna,6,5 i port B utåt (LCD) Initiera LCD-displayen Invänta att 555 är klar att triggas Invänta ett "T" från PC Stoppa och nollställ Timern Välj prescaler Starta timern och trigga 555 Invänta att 555 tippar tillbaka Stoppa timern Hämta timerns värde UTÖKNING FRÅN KALIBRERING TILL MÄTNING Nollställ exponenten R1E Ladda IX med adressen till polynomet Beräkna temperaturen ur polynomet Gör om temperaturen från flyttal till heltal Gör om från binärt heltal till decimalt tal (BCD) Gör om BCD-talen till ASCII-tecken Flytta cursorn till början av raden på displayen Skriv ut texten "Temp=" på displayen Skriv ut temperaturens ASCII-tecken Skicka mätvärdet till PC Skicka ett "Return" till PC 2003-09-01 Termometern- 6 PN