Skip to content

Commit 192189e

Browse files
committed
dynamic buffer 1ch=400pt, 2ch=200pt, 3ch=130pt, 4ch=100pt
1 parent ee670b5 commit 192189e

File tree

3 files changed

+361
-71
lines changed

3 files changed

+361
-71
lines changed

arduino/oscilloscope_arduino/oscilloscope_arduino.ino

Lines changed: 165 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
// 28/05/2017 => bug v1.5 => qdo aumenta 1 canal dá erro na serial (disabling serial)
2+
// 22/05/2017 => versão 1.5 => dynamic buffer - 1ch=400pt/ch, 2chs=200pt/ch, 3chs=130pt/ch, 4chs=100pt/ch
13
// 21/01/2017 => versão 1.4 => melhorar o trigger: informar valor e sentido (subindo/descendo)
24
// 13/03/2016 => versão 1.3 => alterar o clock do ADC para ler maiores frequencias
35
// 14/09/2015 => implementei TimerOne.h pin9(pwm) e pino10(2*periodo) output
46
// 03/08/2016 => versão 1.2 => ler resistor em A5
57
// 26/07/2015 => versão 1.1 => ler em microsegundos
68
//String versao="1.2"; // versão do programa -
7-
#define versao "1.4"
9+
#define versao "1.5"
810

911
/* trabalhando com TimerOne
1012
Timer1.initializa(us); // inicializa o timer1 (chamar primeiro)
@@ -40,16 +42,34 @@ boolean pwmOn=true;
4042
unsigned long pwmP=100000; //Periodo 100000u=100m=0.1s => 10Hz
4143
byte pwmPon=25; // % do pwmP em HIGH
4244

43-
byte q=100; // quantidade de leituras
45+
/* -- 07/May/2017 --
4446
int v0[100];
4547
int v1[100];
4648
int v2[100]; // guarda os valores das leituras
4749
int v3[100]; // acrescentei mais um canal em 15/10/2015
48-
int vtrigger=0; // tenssao de trigger
49-
//byte v0[100];
50-
//byte v1[100];
51-
//byte v2[100]; // guarda os valores das leituras
52-
//byte v3[100]; // acrescentei mais um canal em 15/10/2015
50+
*/
51+
/* ------------------------------------------------
52+
/* I changed the 4 buffers (v0[100],v1[],v2[],v3[]) above
53+
* by 1 buffer bellow (vb[408])
54+
* The chq indicates how many channels will use and the buffer
55+
* will be divided by then:
56+
* 4 ch (q=102) => 0-101, 102-203, 204-305, 306-407
57+
* 3 ch (q=136) => 0-135, 136-271, 272-407
58+
* 2 ch (q=204) => 0-203, 204-407
59+
* 1 ch (q=408) => 0-407
60+
* chi[n] indicates the initial position of the buffer
61+
* q indicates the size of channel buffer
62+
------------------------------------------------
63+
*/
64+
int vb[400]; // (100*4=400) buffer stores the measure values of all channels
65+
// (old) int chi[]={0,102,204,306}; // channel init position on buffer vb[]
66+
int chi[]={0,100,200,300}; // channel init position on buffer vb[]
67+
int chq=4; // how many channels are ON
68+
int q=100; // quantidade de leituras
69+
int qmax=100; // qtd maxima permitida para q
70+
// (new) chq-qmax; 4-100; 3-130; 2-200; 1-400
71+
// (old) chq-qmax; 4-102; 3-136; 2-204; 1-408
72+
int vtrigger=0; // tensao de trigger
5373
boolean Ch[]={true,true,true,true}; // ativa/desativa canais
5474
unsigned int dt=4; // 100us a 1000us(1ms) a 3000ms(3s)
5575
char unidade='m'; // unidade: m=milisegundo, u=microsegundo
@@ -103,6 +123,10 @@ void setup() {
103123
//Timer1.stop();
104124

105125
//inicializar A0, A1, A2, A3 com pull_up
126+
// não ficou bom pois qdo não tem nada conectado na porta, ela fica
127+
// com 5v. O melhor é colocar um pull_down com resistor
128+
// A0___|R=20k|___GND
129+
// |__ Vinput
106130
/*
107131
* pinMode(A0,INPUT_PULLUP);
108132
* pinMode(A1,INPUT_PULLUP);
@@ -114,7 +138,7 @@ void setup() {
114138
Serial.begin(115200);
115139
//Serial.begin(250000);
116140
printHelp();
117-
printConfig();
141+
printConfig();
118142

119143
//ler Resistor e Capacitor
120144
//pinMode(pinCarga,OUTPUT);
@@ -180,12 +204,13 @@ void lerSerial(){
180204
case 'q': // alterar valor do q.(ponto no final) (quantidade de leituras)
181205
k=Serial.parseInt(); // inteiro de 0 a 32767
182206
c=Serial.read(); // para ir mais rápido colocar um . no final ex: q150.
183-
if (k>=1 && k<=100) {
207+
if (k>=1 && k<=qmax) {
184208
q=k;
185209
}
210+
calcBuffer();
186211
// Serial.print("=> q="); Serial.println(q);
187212
break;
188-
case 'c': //(1)ativa/(0)desativa canal n exemplo: c01, c10
213+
case 'c': //cnm : n=0-3, m=(o)ativa/(x)desativa canal n exemplo: c0x, c2o
189214
delay(100);
190215
c=Serial.read();
191216
delay(100);
@@ -196,6 +221,11 @@ void lerSerial(){
196221
}else if (c2=='x'){
197222
Ch[c-'0']=false;
198223
}
224+
// recalcular o buffer para cada canal e colocar o indice
225+
// inicial para cada canal
226+
//Serial.println("entrar calcBuffer");
227+
calcBuffer();
228+
//Serial.println("saiu calcBuffer");
199229
/* Serial.print("=> Canais: ");
200230
for (k=0; k<3;k++){
201231
Serial.print("Ch"); Serial.print(k); Serial.print("="); Serial.print(Ch[k]);
@@ -223,7 +253,7 @@ void lerSerial(){
223253
// Serial.print("=> canalTrigger="); Serial.println(canalTrigger);
224254
break;
225255
case '?':
226-
printConfig();
256+
printConfig();
227257
break;
228258
case '1': // enviar Uma Amostra (q leituras)
229259
if (!uma) uma=true;
@@ -330,9 +360,60 @@ void lerSerial(){
330360
}
331361
}
332362

363+
void calcBuffer(){
364+
//Serial.println("entrou calcBuffer");
365+
chq=0;
366+
// conta a quantidade de canais ativos
367+
for (int k=0;k<4;k++){
368+
if (Ch[k]) {chq+=1;}
369+
}
370+
// calc size of each channel
371+
switch (chq){
372+
case 0:
373+
qmax=0;
374+
break;
375+
case 1:
376+
qmax=400;
377+
break;
378+
case 2:
379+
qmax=200;
380+
break;
381+
case 3:
382+
qmax=130;
383+
break;
384+
case 4:
385+
qmax=100;
386+
break;
387+
}
388+
/*
389+
if (chq<=0) {
390+
qmax=0;
391+
} else {
392+
qmax=408/chq; // chq-qmax; 4-102; 3-136; 2-204; 1-408
393+
}
394+
*/
395+
if (q>qmax) {
396+
q=qmax;
397+
}
398+
//Serial.print("q=408/chq=");Serial.print("408/");Serial.print(chq);Serial.print("=");Serial.println(q);
399+
int chInit=0;
400+
for (int k=0; k<4; k++){
401+
if (Ch[k]) {
402+
chi[k]=chInit;
403+
chInit+=q;
404+
}
405+
}
406+
407+
Serial.print("chq="); Serial.print(chq); Serial.print(" q="); Serial.print(q); Serial.print(" qmax="); Serial.println(qmax);
408+
for (int k=0; k<4; k++){
409+
Serial.print("k=");Serial.print(k); Serial.print(" chi[k]="); Serial.println(chi[k]);
410+
}
411+
412+
}
413+
333414
void printHelp(){
334415
Serial.println("-----------------------");
335-
Serial.print("! GaraginOscopio v"); Serial.print(versao); Serial.println(" - RB !");
416+
Serial.print("! BegOscopio v"); Serial.print(versao); Serial.println(" - rogerio.bego@hotmail.com !");
336417
Serial.println("-----------------------");
337418
/*
338419
Serial.println("----------- help ---------------------");
@@ -359,15 +440,23 @@ void printHelp(){
359440
*/
360441
}
361442

443+
444+
362445
void printConfig(){
363446
Serial.println("------ configuracoes -------");
364447
Serial.print(">? q="); Serial.println(q);
448+
Serial.print(">? qmax="); Serial.println(qmax);
365449
Serial.print(">? dt="); Serial.print(dt); Serial.print(unidade); Serial.println("s");
366450
float t=(float)q * (float)dt;
367451
Serial.print(" -> T=(q*dt)= "); Serial.print(t); Serial.print(unidade); Serial.println("s ");
368452
Serial.print(">? Canais: ");
369453
for (int k=0; k<4; k++){
370-
Serial.print(" Ch"); Serial.print(k); Serial.print("="); Serial.print(Ch[k]);
454+
Serial.print(" Ch"); Serial.print(k); Serial.print("=");
455+
if (Ch[k]) {
456+
Serial.print("o");
457+
} else {
458+
Serial.print("x");
459+
}
371460
}
372461
Serial.println();
373462
Serial.print(">? canalTrigger="); Serial.println(canalTrigger);
@@ -380,6 +469,7 @@ void printConfig(){
380469
Serial.print(">? pwmPon="); Serial.print(pwmPon); Serial.println("%");
381470
}
382471

472+
383473
unsigned long microsOuMillis(){
384474
if (unidade=='u'){
385475
return micros();
@@ -425,25 +515,56 @@ boolean trigger(){ // a variavel canalTrigger indica qual canal fará o trigger:
425515

426516

427517
void lerEnviar(){
518+
519+
/*
520+
// enviar quais canais serao enviados. ex: >ch=1<\t>3<\t>
521+
Serial.print(">chq="); Serial.print(chq); Serial.print("\t");
522+
for (int k=0; k<4; k++){
523+
if (Ch[k]){Serial.print(k); Serial.print("\t");}
524+
}
525+
Serial.println("");
526+
527+
//enviar os valores dos canais
528+
for (int k=0; k<q; k++){
529+
Serial.print(">v="); Serial.print(k); Serial.print("\t");
530+
if (Ch[0]) {Serial.print(chi[0]+k); Serial.print("\t");}
531+
if (Ch[1]) {Serial.print(chi[1]+k); Serial.print("\t");}
532+
if (Ch[2]) {Serial.print(chi[2]+k); Serial.print("\t");}
533+
if (Ch[3]) {Serial.print(chi[3]+k); Serial.print("\t");}
534+
Serial.println("");
535+
}
536+
537+
538+
return;
539+
540+
*/
541+
542+
428543
unsigned long tFim; // contador do tempo Final
429544
unsigned long tTotalReal; // tempo Total da leitura dos valores.
430545
if (canalTrigger>='0' && canalTrigger<='3'){
431546
//Serial.print("canalTrigger=");Serial.println(canalTrigger);
432547
Serial.print("trigger="); Serial.println(trigger());
433548
}
434549
tTotalReal=microsOuMillis();
550+
435551
for (int k=0; k<q; k++){
436552
tFim=microsOuMillis()+dt;
553+
/*
437554
if (Ch[0]) {v0[k]=analogRead(A0);}
438555
if (Ch[1]) {v1[k]=analogRead(A1);}
439556
if (Ch[2]) {v2[k]=analogRead(A2);}
440557
if (Ch[3]) {v3[k]=analogRead(A3);}
441-
// if (Ch[0]) {v0[k]=analogRead(A0)/4;}
442-
// if (Ch[1]) {v1[k]=analogRead(A1)/4;}
443-
// if (Ch[2]) {v2[k]=analogRead(A2)/4;}
444-
// if (Ch[3]) {v3[k]=analogRead(A3)/4;}
558+
*/
559+
560+
if (Ch[0]) {vb[chi[0]+k]=analogRead(A0);}
561+
if (Ch[1]) {vb[chi[1]+k]=analogRead(A1);}
562+
if (Ch[2]) {vb[chi[2]+k]=analogRead(A2);}
563+
if (Ch[3]) {vb[chi[3]+k]=analogRead(A3);}
445564
while (microsOuMillis()<tFim){}
446565
}
566+
567+
447568
tTotalReal=microsOuMillis()-tTotalReal; // total de tempo para ler todas as amostras
448569
dtReal=tTotalReal/q; // calcular o tempo médio de cada leitura
449570
Serial.println();
@@ -455,14 +576,40 @@ void lerEnviar(){
455576
}else if (unidade=='u'){
456577
Serial.println("e-6");
457578
}
579+
580+
// enviar quais canais serao enviados. ex: >ch=1<\t>3<\t>
581+
Serial.print(">chq="); Serial.print(chq); Serial.print("\t");
582+
for (int k=0; k<4; k++){
583+
if (Ch[k]){Serial.print(k); Serial.print("\t");}
584+
}
585+
Serial.println("");
586+
587+
//enviar os valores dos canais
588+
for (int k=0; k<q; k++){
589+
Serial.print(">v="); Serial.print(k); Serial.print("\t");
590+
if (Ch[0]) {Serial.print(vb[chi[0]+k]); Serial.print("\t");}
591+
if (Ch[1]) {Serial.print(vb[chi[1]+k]); Serial.print("\t");}
592+
if (Ch[2]) {Serial.print(vb[chi[2]+k]); Serial.print("\t");}
593+
if (Ch[3]) {Serial.print(vb[chi[3]+k]); Serial.print("\t");}
594+
Serial.println("");
595+
596+
if (Ch[0]) {Serial.print(chi[0]+k); Serial.print("\t");}
597+
if (Ch[1]) {Serial.print(chi[1]+k); Serial.print("\t");}
598+
if (Ch[2]) {Serial.print(chi[2]+k); Serial.print("\t");}
599+
if (Ch[3]) {Serial.print(chi[3]+k); Serial.print("\t");}
600+
Serial.println("");
601+
602+
}
603+
/* -- eliminado em 07/May/2017 - criei buffer dinamico vb[408] --
458604
for (int k=0; k<q; k++){
459605
Serial.print(">v=");
460606
Serial.print(k); Serial.print("\t");
461607
Serial.print(v0[k]); Serial.print("\t");
462608
Serial.print(v1[k]); Serial.print("\t");
463609
Serial.print(v2[k]); Serial.print("\t");
464610
Serial.println(v3[k]);
465-
}
611+
}
612+
*/
466613
Serial.print(">tTotalReal="); Serial.print(tTotalReal); //Serial.print(unidade); Serial.println("s");
467614
if (unidade=='m'){
468615
Serial.println("e-3");

0 commit comments

Comments
 (0)