Filtrera ett 10-bitars värde

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Lite tokigt med att det här blev två trådar men då jag ändå tänkte filtrera resultatet, och har fått förslag på hur, så behåller jag nog det så här.

Ungarna hade framme smältpickan för lite pyssel så jag passade på att limma fast en hylsa över sensorn. Eventuellt ska jag korta ner röret en aning. Modden med före och efter-bild syns nedan. Oj vilken skillnad det blev på resultatet!
Har också bifogat 10 samples utan och 10 samples med röd pärla. Nu tycker jag det ser bättre ut.

Kod: Markera allt

UTAN:
R= 11357  G= 13550  B= 10778  
R= 11363  G= 13554  B= 10760  
R= 11355  G= 13570  B= 10756  
R= 11333  G= 13549  B= 10778  
R= 11344  G= 13528  B= 10812  
R= 11380  G= 13529  B= 10807  
R= 11373  G= 13556  B= 10792  
R= 11361  G= 13559  B= 10764  
R= 11342  G= 13570  B= 10768  
R= 11344  G= 13566  B= 10778


RÖD:
R= 10920  G= 13630  B= 10863  
R= 10906  G= 13599  B= 10891  
R= 10938  G= 13643  B= 10882  
R= 10919  G= 13605  B= 10904  
R= 10913  G= 13621  B= 10913  
R= 10933  G= 13646  B= 10886  
R= 10946  G= 13638  B= 10889  
R= 10917  G= 13624  B= 10911  
R= 10930  G= 13651  B= 10903  
R= 10952  G= 13647  B= 10890
20180609_124925.jpg
20180609_124944.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
guckrum
Inlägg: 1669
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Filtrera ett 10-bitars värde

Inlägg av guckrum »

Japp, det blev mycket bättre separation, men någonting är fortfarande knas med korrelerade sampel. Titta på grafen över dina sampel nedan. De tjocka linjerna är din referens, och de tunna linjerna är när sensorn tittar på en röd pärla.
take2.png
Den röda kurvan är den som ändrats mest mellan testen, och det är ju rimligt och bra. Frågan är om det vi ser är bra nog när du skall separera många färger. För att utröna det behövs mera data, och det kan vi återkomma till.

Notera att alla kurvorna verkar bete sig periodisk. Svårt att säga med så få sampel, men det ser ut så. Hade samplena varit oberoende hade det sett mera stokastiskt ut, slumpmässigt upp eller ner längs kurvan. Det hade varit bra att röka ut detta problemet. Ignorerar du det kommer det antagligen att bita dig senare :vissla:

Undrar också hur du kan få ut så stora heltal ur en 10-bitars omvandlare? Kan du ta nya "referens-sampel" med enfärgade ytor så kan man plotta in de värdena också i grafen?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Nerre
Inlägg: 26655
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Filtrera ett 10-bitars värde

Inlägg av Nerre »

Nu vet jag inte hur det är byggt mekaniskt, men en tanke är ju att det är ljus från omgivningen som påverkar? Det ljuset är ju antagligen "modulerat" med 50 eller 100 Hz och kan ju då ge periodiska störningar?

Men är mätningarna gjorda så att pärlan bara utsätts för ljuset från de fyra lysdioderna på modulen så är det ju knappast det felet.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Nej det är nog något att bita i det här...Efter modden så är sensorn extremt känslig för placeringen av pärlan (givetvis). Så en bättre rigg krävs!
Det får bli en 3D-printing så det går att få ärlig repeterbarhet vid pärlbyte.
Tror inte heller att något yttre ljus kommer in då jag direkt ser i mörkret om min mätare inte tätar riktigt mot boken.

Gör gärna fler mätningar gruckrum men det är nog något knas ändå. Det finns väl ingen anledning som helst att värdena ändå varierar så här mycket när jag belyser en helt svart yta?
Rullade tom från skrivbordet och det finns verkligen inget fysiskt som kunde påverka mätningen.

Kod: Markera allt

R= 6675  G= 7233  B= 5572  
R= 6666  G= 7234  B= 5572  
R= 6666  G= 7231  B= 5561  
R= 6666  G= 7236  B= 5566  
R= 6670  G= 7233  B= 5570  
R= 6670  G= 7231  B= 5563  
R= 6673  G= 7232  B= 5567  
R= 6672  G= 7231  B= 5567  
R= 6671  G= 7233  B= 5567  
R= 6676  G= 7235  B= 5569  
R= 6677  G= 7237  B= 5572  
R= 6674  G= 7235  B= 5573  
R= 6671  G= 7231  B= 5565  
R= 6679  G= 7237  B= 5570  
R= 6670  G= 7236  B= 5572  
R= 6673  G= 7232  B= 5567  
R= 6677  G= 7231  B= 5560  
R= 6680  G= 7230  B= 5563  
R= 6678  G= 7230  B= 5564  
R= 6672  G= 7226  B= 5565  
R= 6680  G= 7226  B= 5571  
R= 6680  G= 7229  B= 5569  
R= 6673  G= 7229  B= 5573  
R= 6674  G= 7227  B= 5570  
R= 6677  G= 7221  B= 5571  
R= 6679  G= 7229  B= 5574  
R= 6681  G= 7223  B= 5569  
R= 6676  G= 7225  B= 5571  
R= 6681  G= 7224  B= 5571  
R= 6684  G= 7227  B= 5571  
R= 6686  G= 7228  B= 5573  
R= 6684  G= 7224  B= 5578  
R= 6691  G= 7229  B= 5578  
R= 6676  G= 7226  B= 5573  
R= 6673  G= 7225  B= 5574  
R= 6674  G= 7225  B= 5565  
R= 6685  G= 7235  B= 5569  
R= 6684  G= 7232  B= 5566  
R= 6683  G= 7226  B= 5574  
R= 6675  G= 7237  B= 5572  
R= 6677  G= 7235  B= 5573  
R= 6672  G= 7235  B= 5568  
R= 6678  G= 7235  B= 5560  
R= 6684  G= 7227  B= 5566  
R= 6682  G= 7231  B= 5570  
R= 6671  G= 7238  B= 5568  
R= 6675  G= 7236  B= 5562  
R= 6680  G= 7233  B= 5566  
R= 6670  G= 7231  B= 5561  
R= 6673  G= 7231  B= 5565  
R= 6678  G= 7226  B= 5560  
R= 6671  G= 7222  B= 5570  
R= 6672  G= 7228  B= 5567  
R= 6679  G= 7229  B= 5562  
R= 6681  G= 7222  B= 5570  
R= 6674  G= 7223  B= 5573  
R= 6686  G= 7224  B= 5565  
R= 6687  G= 7226  B= 5573  
R= 6679  G= 7227  B= 5576  
R= 6688  G= 7226  B= 5568  
R= 6683  G= 7219  B= 5575  
R= 6679  G= 7224  B= 5568  
R= 6683  G= 7226  B= 5568  
R= 6679  G= 7231  B= 5575  
R= 6680  G= 7226  B= 5575  
R= 6679  G= 7238  B= 5566  
R= 6684  G= 7240  B= 5565  
R= 6678  G= 7241  B= 5564  
R= 6680  G= 7234  B= 5572  
R= 6678  G= 7234  B= 5567  
R= 6675  G= 7232  B= 5570  
R= 6678  G= 7232  B= 5562  
R= 6674  G= 7234  B= 5568  
R= 6672  G= 7230  B= 5562  
R= 6680  G= 7229  B= 5566  
R= 6673  G= 7231  B= 5567  
R= 6678  G= 7219  B= 5564  
R= 6676  G= 7227  B= 5570  
R= 6683  G= 7227  B= 5564  
R= 6681  G= 7223  B= 5570  
R= 6684  G= 7221  B= 5564  
R= 6683  G= 7227  B= 5576  
R= 6681  G= 7225  B= 5563  
R= 6677  G= 7225  B= 5571  
R= 6682  G= 7225  B= 5567  
R= 6677  G= 7228  B= 5568  
R= 6684  G= 7228  B= 5566  
R= 6675  G= 7231  B= 5563  
R= 6680  G= 7227  B= 5566  
R= 6676  G= 7232  B= 5557  
R= 6673  G= 7231  B= 5568  
R= 6676  G= 7235  B= 5560  
R= 6676  G= 7229  B= 5558  
R= 6669  G= 7229  B= 5566  
R= 6673  G= 7221  B= 5563  
R= 6671  G= 7228  B= 5560  
R= 6672  G= 7224  B= 5565  
R= 6677  G= 7222  B= 5568  
R= 6689  G= 7238  B= 5565
guckrum
Inlägg: 1669
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Filtrera ett 10-bitars värde

Inlägg av guckrum »

Den senaste rundan ser mycket bättre ut! Kanske är det bara för att det är fler sampel än tidigare. Två frågor:
1. Hur ofta samplar du? (Och vilka frekvenser är det som skall mätas?)
2. Hur kan du få heltalsvärden som vida överstiger 10 bitar?
Kanske skall jag läsa på de referenser du skickat, jag har inte alls kollat hur det du byggt egentligen fungerar.

Att det brusar är helt normalt, det viktiga är att bestämma hur mycket (och gärna varför, samt ta reda på om det är i samma nivå som man förväntar sig teoretiskt. Annars kan man ju göra bättre.) Du får gärna mäta på några pärlor i olika färger, minst 100 sampel per pärla.

Ligger pärlan fixerad på ett exakt vis, eller kan det vara så att en pärla kan hamna i olika orienteringar i sensorn och därmed ge olika värden ut, tro?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Filtrera ett 10-bitars värde

Inlägg av lillahuset »

Jag tycker nog dina givare brusar ganska lite. I kalkylarket står det "fel" men bör vara avvikelse från medelvärde eller brus. I procent.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Hmm, nja, onekligen intressant!

@guckrum:
Sensormodulen fungerar så här:
Genom att ställa 2 ingångar på modulen som hög/låg (dvs 4 kombinationer) så bestämmer jag vad jag vill få levererat på ut-pinnen. Antingen R, G, B eller Ofiltrerad.
Modulen innehåller en ström-till-frekvens-omvandlare och det är denna frekvens jag mäter på utgången.
Pulsen är alltid 50% i pulsbredd så man kan nog likaväl mäta pulsbredd som frekvens för att få ett relativt värde.

Det finns även 2 andra ingångar där jag kan ställa skalningen på utsignalen. 2%, 20%, eller 100%. Minns inte vad jag hade nu senast med har oftast använt 20%.

I originalkoden så satte man "RGB+O"-pinnarna till en färg, läste direkt ut frekvensen/pulsbredden och presenterade dessa. Sen direkt över till nästa färg.
I det senaste resultatet så la jag in en 100ms väntan mellan omställning av registret (MUX:en?) och avläsning av frekvens. Tänkte att det kanske behövdes för att stabilisera signalen.
Som svar på fråga 1 så samplar jag i nuläget alltså i ca 3Hz. Tyvärr är lekbordet undanplockat så kan inte koppla upp skopet igen men beroende på skalningen så blev självklart utsignalen olika. Dock inga hejdundrans hastigheter. Gott och väl < 1kHz vill jag minnas. I något läge var signalen kring 60 Hz bara.

På fråga 2 så får jag skämmas. Det är jag som lurat in er på 10 bitar.
När jag mätte första gången så hamnade samtliga värden alltid under 1024 så jag tänkte att det räcker med 10 bitar att filtrera och labba med. Det har således inget med ADC-upplösning eller annat att göra.
Dock efter modden så blev saker och ting helt annorlunda och frekvensen är betydligt lägre (längre puls) så det utlästa talet blir således mycket större.
Vet inte riktigt vad pulseIn() ger tillbaka för nummer... ms? Nej jag vet inte.
Det hela handlar nog om att få till en pålitlig testrigg och därefter kalibrera efter dom nya förhållandena.

Pärlan hamnar tyvärr inte exakt på samma ställe och värdena varierar helt oroligt mycket bara av att jag sensorn en millimeter åt ena eller andra hållet. Här måste det alltså till lite precision. Det blir också väldigt stor skillnad i mätvärdena om jag lägger resp ställer pärlan upp. Den ska helt klart ligga ner.

Om du orkar så kan jag presentera 200 värden för 10 olika pärlor imorgon, så kanske det går att se med hjälp av dina grafer om det verkar genomförbart?
Ska lura på en anordning som fixerar både pärla och sensor i exakt position till imorgon i så fall.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: Filtrera ett 10-bitars värde

Inlägg av mrfrenzy »

Funderar på olika orsaker till bruset

Hur stabil och avkopplad är spänningsförsörjningen? Vid förändring av spänningen så ändras frekvensen med 0.5%/V

Hur har du ställt in ingången på din mikrokontroller för att få bästa möjliga skala på frekvensmätningen relativt områdena som modulen ger ut?
10-12kHz
100-120kHz
500-600kHz (detta verkar ge bäst noggrannhet då dom andra alternativen passerar signalen genom frekvensdelare)

På vilket sätt mäter du frekvensen?
Maximum resolution and accuracy may be obtained using frequency-measurement, pulse-accumulation, or
integration techniques. Frequency measurements provide the added benefit of averaging out random- or
high-frequency variations (jitter)


Hur stabil är kristallen/oscillatorn på din mikrokontroller?

Hur styr du ingången OE?
A low-impedance electrical connection between the device OE pin and the device GND pin is required for
improved noise immunity.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Nu är du något på spåret, det hade jag missat i databladet!
OE har jag lämnat ej ansluten då jag läste någonstans att "det gick bra" :doh:

Jag spänningsmatar just nu direkt från datorn till Nanon. Vet inte hur den matningen ser ut men borde inte vara jättedålig i alla fall.
Dom andra frågorna har jag inte en aning om. Kristallen som sitter monterad är en liten ytmonterad sak så jag fick googla fram att det är en 16Mhz-kristall. Hur stabil den är vet jag tyvärr inte.
Vilket sätt jag mäter frekvensen är jag lite osäker på. Jag använder som sagt en funktion som heter pulseIn(). Vet inte hur den fungerar, dock så har jag testat lite olika interrupt-baserade andra bibliotek men det blir så mycket kod att ändra så jag börjar må illa. Som du kanske vet så är jag inte speciellt bra på det här...

Ska dra ner OE mot jord imorgon också och se hur utvärdena ser ut, bara av att göra det. :tumupp:
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: Filtrera ett 10-bitars värde

Inlägg av mrfrenzy »

Ansluta OE är nog en bra början.

pulseIn är det absolut sämsta sättet att mäta frekvens med en arduino. Det orsakar väldigt mycket jitter av exakt den typen som visas i dina tester.

Om du absolut inte kan klara att mäta på något annat sätt måste du göra minst 1024 mätningar med pulseIn och ta ett medelvärde.

Annars blir det mycket bättre om du kan använda ett bibliotek som FreqCounter.

Det är inte krångligt och du behöver inte fundera på hur interrupten fungerar:

Kod: Markera allt

#include <FreqCounter.h>

void setup() {
  Serial.begin(57600);                    // connect to the serial port
  Serial.println("Frequency Counter");
}

long int frq;
Void loop() {

 FreqCounter::f_comp= 8;             // Set compensation to 12
 FreqCounter::start(100);            // Start counting with gatetime of 100ms
 while (FreqCounter::f_ready == 0)         // wait until counter ready
 
 frq=FreqCounter::f_freq;            // read result
 Serial.println(frq);                // print result
 delay(20);
}
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Tänk att jag jag läste precis den kodsnutten idag, samt laddade ner det biblioteket, men jag förstod aldrig hur jag skulle använda det.
Vet inte vart jag ska trycka in pin-numret den ska mäta frekvensen på.

Oavsett så verkar du fast vid din sak så jag får fortsätta och googla på det. Ju mindre jag behöver programmera desto roligare blir det.
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: Filtrera ett 10-bitars värde

Inlägg av mrfrenzy »

Den mäter alltid på pin 5.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Drog ner OE men det gjorde tyvärr ingen större skillnad.

Nu testade jag det biblioteket men onekligen är det något tok. Så här ser koden ut:

Kod: Markera allt

#include <FreqCounter.h>

#define S0 4
#define S1 8
#define S2 6
#define S3 7
#define sensorOut 5

void setup() {
  Serial.begin(57600);                    // connect to the serial port
  Serial.println("Frequency Counter");

  digitalWrite(S0,HIGH);                  // S0 high & S1 low = scaling 20%
  digitalWrite(S1,LOW);
}

long int frq;
void loop() {

 digitalWrite(S2,LOW);               // Set S2 & S3 to get RED frequency on output
 digitalWrite(S3,LOW);
 FreqCounter::f_comp= 8;             // Set compensation to 12
 FreqCounter::start(100);            // Start counting with gatetime of 100ms
 while (FreqCounter::f_ready == 0)         // wait until counter ready
 
 frq=FreqCounter::f_freq;            // read result
 Serial.println(frq);                // print result
 delay(500);
}
Och så här ser utläst frekvens ut för enbart röd färg:

Kod: Markera allt

128
300
241
225
233
298
225
282
233
231
261
211
212
267
251
227
353
560
544
361
336
469
438
512
560
314
534
436
568
618
320
345
645
558
265
280
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Filtrera ett 10-bitars värde

Inlägg av Icecap »

En gate-time på 100ms är inte mycket om man vill mäta frekvens.

Vilka frekvenser rör det sin om?
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Det hjälpte om man ställde om pinnarna till I eller O :doh:

Kollade med skopet samtidigt som mätningen nedan och den ligger kring 350-360Hz just vid den här mätningen. Den högsta frekvensen jag uppnått än så länge är 2,5kHz och det var med vitt papper under.

Kod: Markera allt

#include <FreqCounter.h>

#define S0 4
#define S1 8
#define S2 6
#define S3 7
#define sensorOut 5

void setup() {

  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);
  
  Serial.begin(57600);                    // connect to the serial port
  Serial.println("Frequency Counter");

  digitalWrite(S0,HIGH);                  // S0 high & S1 low = scaling 20%
  digitalWrite(S1,HIGH);
  digitalWrite(S2,LOW);               // Set S2 & S3 to get RED frequency on output
  digitalWrite(S3,LOW);
}

long int frq;
void loop() {

 
 FreqCounter::f_comp= 8;             // Set compensation to 12
 FreqCounter::start(100);            // Start counting with gatetime of 100ms
 while (FreqCounter::f_ready == 0)         // wait until counter ready
 
 frq=FreqCounter::f_freq;            // read result
 Serial.println(frq);                // print result
 delay(500);
}

Kod: Markera allt

36
36
35
36
36
36
36
36
36
36
36
36
36
35
35
35
36
36
36
36
36
36
36
36
36
36
36
36
35
35
35
36
36
36
36
36
36
36
36
36
35
36
36
Skriv svar