Plotta data från com-porten (seriel) i realtid?

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
jenslager
Inlägg: 7
Blev medlem: 9 december 2007, 15:05:39
Ort: Umeå

Inlägg av jenslager »

Använder Terminal v1.9 b. Vill använda matlab.
jonte_s
Inlägg: 88
Blev medlem: 11 februari 2006, 17:13:48
Ort: Stockholm

Inlägg av jonte_s »

oJsan: Jag får det inte att funka med teminal. Vill du förklara lite närmare hur man gör? Om du vet.

RDX*: Har testat din kod, och den funkar inte så bra för mig (modifierat de två raderna lägre ned lite). Ibland funkar det... men oftast inte. Får en massa felmeddelanden *ibland*. Dessa är dels något felmeddelande om "buffer overrun", vilket gör att hela matlab stängs ned. Sedan får jag även felmeddelanden om att inte den baudrate (38400) kan sättas.

Sedan undrar jag om du kan förklara dessa två rader:

Kod: Markera allt

     
data(i,1)=str2double(fscanf((s1)));     %pos1
data(i,2)=str2double(fscanf((s1)));     %setpoint
Hur skall man skicka ut från uC?

pos1 mellanslag setpoint

funkar inte...

/ Jonas
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Klicka på knappen "Graph", svårare än så är det inte =)
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1651
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

Ok, då börjar jag med att förklara raden "data(i,1)=str2double(fscanf((s1)));"

"S1" är serieportsobjektet, i detta objektet finns tex Baudrate:en mm.
"fscanf((s1)" läser av serie porten i ASCI format. Detta konverteras sedan med "str2double" till siffror. Den bara lägger jag siffrorna i data matrisen.


Mitt program i µC ser väldigt förenklat ut så här:

Kod: Markera allt

$regfile = "m8def.DAT"
$crystal = 8000000
$baud = 57600

Config ADC...

Main:

var0=läs(ADC0)
print var0
var1=läs(ADC1)
print var1

waitms 200


Goto Main


Om jag tittar i en vanlig terminal så ser det ut så här:

var0
var1
var0
var1
...

Det är alltså dessa rader jag läser av med

data(i,1)=str2double(fscanf((s1))); %pos1
data(i,2)=str2double(fscanf((s1))); %setpoint

Det är viktigt att både µC och matlab hinner med att skicka och läsa varje rad. Börja med något enkelt tex att skicka 5 värden per sekund från µC. Med en hastighet på tex 19200 Baud.

Kolla sedan i en vanlig RS-232 terminal att texten ser ut som ovan.
Där efter kan du testa med matlab.

Nu har matlab en timeout också så modifiera matlab så den läser in värdena i tex 5s:
for i= 1 :25 %acquisition of 25 points
data(i,1)=str2double(fscanf((s1))); %var0
data(i,2)=str2double(fscanf((s1))); %var1
end

Om matlab drabbas av en time-out eller låser sig, så är det svårt att radera hela S1 objektet. Även om det inte finns i workspace så håller den linjen öppen och reserverad. Om detta händer är det säkrast att starta om matlab. Alternativt att vara säker på att S1 har raderats och att en ny länk kan öppnas på com-porten.

Om bitrate:en blir för stor så att matlab inte hinner med så kan ett tal missas vilket resulterar i att var1 hamnar i data(i,1) och viceversa. Eller så klarar inte matlab läsa alls så time-out:en aktiveras.

Slutligen var fick du felmedelandet i matlab eller från µC?
jenslager
Inlägg: 7
Blev medlem: 9 december 2007, 15:05:39
Ort: Umeå

Vilken är maxhastigheten ni lyckas överföra era värden v

Inlägg av jenslager »

Med en ATmega 16 skall ju den snabbaste 65 mikrosekunder. Nu får jag inte överföringen att fungera över 34800 baud. Är ju ingen mening att sampla fort om man inte kan överföra det. Just nu skickar jag in signalerna på min STK 500. Jag använder en extern 16MHZ klocka.
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Inlägg av Fagge »

jenslager
Inlägg: 7
Blev medlem: 9 december 2007, 15:05:39
Ort: Umeå

Begränsningar

Inlägg av jenslager »

Stamp plot verkar bara fungera upp till 56000 baud. :(
Fasta annars så hade det nog fungerat :)
Användarvisningsbild
RDX*
EF Sponsor
Inlägg: 1651
Blev medlem: 28 maj 2003, 22:52:04
Ort: Skåne - Lund

Inlägg av RDX* »

Jag kan köra i 57600Baud utan problem med en Mega8 intern klockad. Låter nästan som om du har dålig kvalitet på signalöverföringen från processor till dator. Kan du öka hastigheten om du kör ett enkelt test mot en vanlig terminal?
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Re: Vilken är maxhastigheten ni lyckas överföra era värd

Inlägg av oJsan »

jenslager skrev:Med en ATmega 16 skall ju den snabbaste 65 mikrosekunder.

snabbaste vadå? Känns som att en del av meningen fallit bort. Är det ADC:ns omvandlingstid du menar? Max fs skulle isåfall bli 16384Hz.
jenslager skrev:Nu får jag inte överföringen att fungera över 34800 baud.

Det beror förmodligen på att klockgenereringen avviker för mycket från det tänkta värdet. Vid 57600baud ligger du 2,1% ifrån, vid 115200baud ligger du -3,5% ifrån.
Om du byter till en kristall på 18,4320MHz eller 11,0592MHz så kan du uppnå 0% avvikelse på alla "standard"-baudrates från 2400baud upp till 115200baud. Dessa kristaller finns hos t.ex. Elfa.

Vid 115200baud hinner du skicka 11520 samples/sekund (8-bit), vilket tillåter en maximal conversion-time på ~87us om du vill hålla full fart på UART:en.

Vilka möjligheter finns det till komprimering av data? Måste du ha en viss upplösning? Vid 18,432MHz klockfrekvens och fs=11520Hz blir det 1600 klockcykler per sample som kan användas till databehandling.
Skriv svar