Firmware
Depois de algumas experiencias falhadas... Depois de queimar muitas sobrancelhas e arrancar alguns cabelos... Resolvi-me por tentar uma coisa minimalista com o menor numero de instruções possivel... Só que... Entusiasmei-me um bocado.
Para aumentar a velocidade de leitura analógica tive de tomar algumas medidas. As entradas analógicas do ATMega gastam 13 ciclos de relógio para fazerem uma medição, (25 ciclos na primera, ainda por cima o relógio usado é obtido do 16 Mhz usando um divisor por 128, isto por defeito. Ora se fizermos as contas temos 16Mhz/128 para o relógio, o que dá 125Khz o que dividido por 13 é 9615Hz. Respeitando o Teorema da amostragem, a máxima frequencia mensuravel será de apenas metade ou seja 4807hz.
Fiquei zangado... irritado... desolado. Consultei a datasheet do ATMega e... Yes... Posso aumentar a frequencia do relogio de amostragem sim senhor. Fui diminuindo sucessivamente o factor de divisão, desde os 128 até aos 8 e... Chatice... se dividir os 16Mhz por 8 a coisa não funciona... Mas por 16 já dá... Ora assim ficamos com uma amostragem de: 16Mhz/16 »» 1Mhz, 1Mhz/13 »» 76,9 Khz, o que dá para medir frequencias até 38Khz. Yes... Pelo menos já dá para frequencias de audio e um pouco mais.
#define FASTADC 1
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
Com estas linhas antes da declaração das variaveis, e as seguintes dentro do Setup,
#if FASTADC
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif
a coisa compôs-se. Tinha agora uma leitura bem mais rápida das entradas analógicas. Agora dava jeito era uma taxa de transmissão, (BAUD Rate), mais elevada. Na minha ingenuidade eu pensava que só podia usar os valores standard, 9600, 14400... até 115200. Mentira! Afinal fui testando e pelo processo de tentativa e erro, consegui os melhores resultados com uma taxa de 800000. Funciona nos meus dois PCs, um Dual Core a 2,2 Ghz e no meu Single Core de 1,7 Ghz. Não testei em mais nenhum. Já agora ambos tem instalados o Win 7.
Serial.begin(800000); // Inicia porta Série.
Tirando isto. O resto do Sketch até é bastante normal....
Está comentado o que pode ajudar a entender o código. Os vários IFs são os varios modos de funcionamento:
Analizador Digital modo de tempo real.
Osciloscópio canal 1 tempo real.
Osciloscópio canal 2 tempo real.
Osciloscópio duplo canal tempo real.
Analizador Digital modo de Amostragem.
Osciloscópio canal 1 Amostragem.
Osciloscópio canal 2 Amostragem.
Osciloscópio duplo canal Amostragem.
Bom, feito o Firmware, agora só falta o Software para ver o resultado no PC...