Loop estranho.

Boa tarde, pessoal! Será que podem me ajudar num probleminha?
Possuo um projeto que usa a placa de DAC MCP4725 para gerar um sinal de voltagem para um circuito e a placa de ADC ADS1115 para retornar leituras de voltagem e corrente do circuito. Escrevi um script de teste, que apresento abaixo:

#include <Wire.h>
#include <Adafruit_MCP4725.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x4A);// Leitor Analogico para Digital (AD) e seu endereco
Adafruit_MCP4725 dac; // Digital para Analogico (DA)
void setup(void) {
  Serial.begin(9600); // Seta velocidade serial
  dac.begin(0x62); // Inicia o DA em seu endereco
  ads.begin(); // Inicia o AD
}

void loop(void) {
  
    uint32_t valor_dac = 0;
    while (valor_dac < 4096) // Seta a variavel em seus limites
							 // 10 bits = 4096 valores de voltagem
    {
      dac.setVoltage(valor_dac, false); // Comando para o DAC gerar a voltagem
      delay(25); // Da um tempinho pra ele pensar
      
      int16_t adc0;  // Seta as variaveis adc como um inteiro de 16 bits
      int16_t adc1;
      int16_t adc2;
      adc0 = ads.readADC_SingleEnded(0); // Le os pinos do AD
      adc1 = ads.readADC_SingleEnded(1);
      adc2 = ads.readADC_SingleEnded(2);
        
      Serial.print("\tVolesp: "); // Valor DAC da voltagem esperada
      Serial.print(valor_dac,4);
      
      Serial.print("\tVoltADC0: "); // Valor ADC da voltagem da celula
      Serial.print(adc0);
       
      Serial.print("\tCorrADC1: "); // Valor ADC da corrente da celula
      Serial.print(adc1);
       
      Serial.print("\tVoltADC2: "); // Valor DAC da voltagem gerada no circuito
      Serial.println(adc2);
      valor_dac = valor_dac + 100; // Incrementa a variavel valor_dac
      delay(5000); // Espera eu anotar o valor medido no multimetro
      
    }    
}

Agora vejam os resultados de leituras:

Volesp:	0	VoltADC0:	-494	CorrADC1:	12957	VoltADC2:	-1
Volesp:	1210	VoltADC0:	0	CorrADC1:	12973	VoltADC2:	681
Volesp:	3020	VoltADC0:	665	CorrADC1:	12979	VoltADC2:	1340
Volesp:	10230	VoltADC0:	1304	CorrADC1:	12986	VoltADC2:	1989
Volesp:	12100	VoltADC0:	1957	CorrADC1:	12991	VoltADC2:	2637
Volesp:	13310	VoltADC0:	2646	CorrADC1:	13007	VoltADC2:	3306
Volesp:	21120	VoltADC0:	3311	CorrADC1:	13008	VoltADC2:	3971
Volesp:	22330	VoltADC0:	3973	CorrADC1:	13015	VoltADC2:	4622
Volesp:	30200	VoltADC0:	4650	CorrADC1:	13021	VoltADC2:	5291
Volesp:	32010	VoltADC0:	5319	CorrADC1:	13028	VoltADC2:	5949
Volesp:	33220	VoltADC0:	5981	CorrADC1:	13036	VoltADC2:	6602
Volesp:	101030	VoltADC0:	6651	CorrADC1:	13041	VoltADC2:	7260
Volesp:	102300	VoltADC0:	7311	CorrADC1:	13047	VoltADC2:	7908
Volesp:	110110	VoltADC0:	7966	CorrADC1:	13052	VoltADC2:	8556
Volesp:	111320	VoltADC0:	8638	CorrADC1:	13063	VoltADC2:	9217
Volesp:	113130	VoltADC0:	9309	CorrADC1:	13069	VoltADC2:	9878
Volesp:	121000	VoltADC0:	10005	CorrADC1:	13109	VoltADC2:	10547
Volesp:	122210	VoltADC0:	10645	CorrADC1:	13081	VoltADC2:	11197
Volesp:	130020	VoltADC0:	11305	CorrADC1:	13087	VoltADC2:	11843
Volesp:	131230	VoltADC0:	11956	CorrADC1:	13093	VoltADC2:	12484
Volesp:	133100	VoltADC0:	12617	CorrADC1:	13102	VoltADC2:	13135
Volesp:	200310	VoltADC0:	13280	CorrADC1:	13106	VoltADC2:	13789
Volesp:	202120	VoltADC0:	13940	CorrADC1:	13110	VoltADC2:	14452
Volesp:	203330	VoltADC0:	14625	CorrADC1:	13121	VoltADC2:	15116
Volesp:	211200	VoltADC0:	15297	CorrADC1:	13127	VoltADC2:	15777
Volesp:	213010	VoltADC0:	15955	CorrADC1:	13139	VoltADC2:	16420
Volesp:	220220	VoltADC0:	16648	CorrADC1:	13140	VoltADC2:	17098
Volesp:	222030	VoltADC0:	17307	CorrADC1:	13144	VoltADC2:	17756
Volesp:	223300	VoltADC0:	17965	CorrADC1:	13156	VoltADC2:	18406
Volesp:	231110	VoltADC0:	18613	CorrADC1:	13158	VoltADC2:	19044
Volesp:	232320	VoltADC0:	19277	CorrADC1:	13166	VoltADC2:	19696
Volesp:	300130	VoltADC0:	19959	CorrADC1:	13173	VoltADC2:	20370
Volesp:	302000	VoltADC0:	20631	CorrADC1:	13181	VoltADC2:	21030
Volesp:	303210	VoltADC0:	21290	CorrADC1:	13189	VoltADC2:	21680
Volesp:	311020	VoltADC0:	21943	CorrADC1:	13193	VoltADC2:	22323
Volesp:	312230	VoltADC0:	22600	CorrADC1:	13202	VoltADC2:	22971
Volesp:	320100	VoltADC0:	23282	CorrADC1:	13207	VoltADC2:	23644
Volesp:	321310	VoltADC0:	23955	CorrADC1:	13214	VoltADC2:	24306
Volesp:	323120	VoltADC0:	24608	CorrADC1:	13224	VoltADC2:	24959
Volesp:	330330	VoltADC0:	25279	CorrADC1:	13203	VoltADC2:	25603
Volesp:	332200	VoltADC0:	25907	CorrADC1:	13233	VoltADC2:	26227

O problema que encontrei está no valor de voltagem esperada (Volesp), que não depende do circuito, é simplesmente o valor da variável "valor_dac", que deveria ter um incremento de 100 em 100, mas está dando saltos bem maiores que isso, além de pular, por exemplo, de 33220 para 101030. Porque isso acontece?

porque fazes isto?

Serial.print(valor_dac,4);, mais especificamente o 4 se estás só a imprimir inteiros?

Não achas estranho que o teu loop continua a imprimir além de 4096, apesar de teres dito para não o fazer?

Corre este código para veres o erro:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(19200); 

  
}

uint32_t valor_dac = 0; 

void loop() {
  // put your main code here, to run repeatedly:
  while (valor_dac < 4095) {
    Serial.print(valor_dac, 4); 
    Serial.print("   ");
    Serial.println(valor_dac);
    valor_dac = valor_dac + 100; 
    delay(500);
    }
}

Este deveria ser o resultado:

0 0
1210 100
3020 200
10230 300
12100 400
13310 500
21120 600
22330 700
30200 800
32010 900
33220 1000
101030 1100
102300 1200
110110 1300
111320 1400
113130 1500
121000 1600
122210 1700
130020 1800
131230 1900
133100 2000
200310 2100
202120 2200
203330 2300
211200 2400
213010 2500
220220 2600
222030 2700
223300 2800
231110 2900
232320 3000
300130 3100
302000 3200
303210 3300
311020 3400
312230 3500
320100 3600
321310 3700
323120 3800
330330 3900
332200 4000

Se abrires o ficheiro Print.cpp, na linha 82, tens a definição da função print que é chamada no teu exemplo.

Essa função, por sua vez, chama a mesma função com um unsigned long em vez de int, definida na linha 103.

Aí essa função retorna o resultado da função printNumber que é definida na linha 203.

Essencialmente, a instrução que deste faz com que apareça na porta série os números de valor_dac num sistema numerário de base 4 ou sistema quartenário (aprendi isto hoje).

Infelizmente, e apesar disto ser uma função interessante, não existe documentação nenhuma acerca deste comportamento.

Cara... Muito obrigado pela sua explicação!! Realmente é um sistema quaternário de numeração! O mais interessante é que, no final, a voltagem gerada pelo DAC estava OK.

porque fazes isto?

Code: [Select]

Serial.print(valor_dac,4);

Na verdade, devo ter esquecido essa linha assim e achei que estava certo. Esse script é derivado de um outro que o parelho usa (é um sistema para análise química). E, no script original havia uma variável float ali...

Vou testar suas sugestões aqui e já te falo! Valeu mesmo!!

Deu certinho!
Estranho mesmo porque não tem nada na documentação a respeito desse sistema quaternário...
Obrigado mais uma vez!!

De nada... deu para aprender algo novo. LOL