First half of the Sketch :
/// Adc_1Msps_Graph_FAdj_FmHz_LA_ADue.ino ///
/// - from AdcScope_ADue.ino ///
// 1MSamp/Sec
/*
* +++ Try Printing out to LED Matrix - by Freqs +++ *
*/
/*
5000-6000 5000 Whistle
5000-7000 3300,5000,6000,7500,10000 S
500-7500 500,1000,1800,3700,5000,6000,7500 F
3700-10000 3500,6000,7500,1000 Z
2000-10000 2000,3300,4300,5000,6000,7500,10000 J
2000-5000 800,1000,1400,1800,2200 )a
2000-4000 1100,1300,2500,3700,5000 /E
1500-3000 1000,2000,5000,7500 )e
1000-2500 1000,1300,2500 )o
1700-3700 1800,2000,2500,3700 R
800-2000 1000,2300,3700,4300 /O
500-2500 500,900,2300,3700 /U
*/
/// DIV to reduce Freq : ///
/// - this adjusts sampling frquency.
/// this can be adjusted faster (up to 1Msps) but also reduces the Period Size in Time.
//#define F_DIV 1 // 1MHz
//#define F_DIV 10 // 100KHz
#define F_DIV 33 // 33KHz
//#define F_DIV 50 // 20KHz
//#define F_DIV 100 // 10KHz
unsigned long start_time;
unsigned long stop_time;
/// Sample Size : ///
/// - this specifies the Size of the Period (more RAM used) but also slow printing back to Serial.
#define A_MAX 1000
//#define A_MAX 2000
//#define A_MAX 4000
//#define A_MAX 10000
////#define A_MAX 20000
unsigned int values[A_MAX];
//char Md = 'a';
char Md = 'f';
/// Display of Freq Distribution Bars :
#define A_L_MAX 100
int A_L[A_L_MAX];
#define A_L_MIN 1
#define A_L_MAX 19
String SPC_ = " ";
char s[20];
/// Limits to Clip out NOISE : ///
//#define VAL_MIN 3000
#define VAL_MIN 2900
//#define VAL_MAX 3150
#define VAL_MAX 3200
//
void setup()
{
Serial.begin(9600);
ADC->ADC_MR |= 0x80; //set free running mode on ADC
ADC->ADC_CHER = 0x80; //enable ADC on pin A0
}
//
void loop()
{
char ch ;
unsigned int i , j ;
long n;
char p = 0;
int c = 0, cl = 0 ; // - count and last count
int f1=0, f2=0, f3=0, f4=0, f6=0, f8=0 ; // - Frequencies of each Amplitudes
int f1i=0, f2i=0, f3i=0, f4i=0, f6i=0, f8i=0 ; // - Freq If First Init Flag yet
int f1c=0, f2c=0, f3c=0, f4c=0, f6c=0, f8c=0 ; // - Frequency Counters (counts of Freq Cycle)
int f1t=0, f2t=0, f3t=0, f4t=0, f6t=0, f8t=0 ; // - Time of current Freq
int f_t = 0; // - Freq Total Time
float f_tp = 0.0; // - Freq current position within Full Freq Cycle
int v;
/// get Samples group of ADC : ///
start_time = micros();
for(i=0; i<A_MAX; i++)
{
/// get Average (of ADC at 1MHz) Counted/Div down to Sampled Freq : ///
n = 0;
for(j=0; j<F_DIV; j++)
{
while( (ADC->ADC_ISR & 0x80) == 0 ) ; // wait for conversion
// values[i] = ADC->ADC_CDR[7] ; //get values
n += ADC->ADC_CDR[7] ; //get values
}
/// Samples group Counted/Div down to desired samples Freq : ///
values[i] = ( n / F_DIV );
}
stop_time = micros();
//
/// Serial Menu: [ A/0:all, V:values, F:freqsgraph, G:bargraph ] : ///
if( Serial.available() > 0 )
{
ch = Serial.read();
if(ch == 'f')
Md = 'f';
if(ch == 'g')
Md = 'g';
if(ch == 'v')
Md = 'v';
if(ch == 'a' || ch == '0')
Md = 'a';
}
//
Serial.println("\n======================================================\n");
Serial.print("Total time us: ");
Serial.println(stop_time-start_time);
Serial.print("Average time per conversion: ");
Serial.println((float)(stop_time-start_time)/1000);
Serial.println("Values: \n");
FClr() ; // - Clr L_A[]
for(i=0; i<A_MAX; i++)
{
// Serial.println(values[i]);
/// ignore first 200 bytes - because of Noise : ///
if( i > 200 )
{
cl = c ;
c ++ ;
if(i > 0 && p != '-' && values[i-1] > values[i])
{
p = '-' ;
/// Only need POS->NEG Inflection - for Full Freq : ///
// if( values[i] < 2950 || values[i] > 3150 )
if( values[i] < VAL_MIN || values[i] > VAL_MAX )
c = 0; /// - reset c if Inflection
if(Md == 'a' || Md == 'v')
Serial.println("");
}
else
if(i > 0 && p != '+' && values[i-1] > values[i])
{
p = '+' ;
/// Ignore POS->NEG Inflection - only need NEG->POS : ///
//// if( values[i] < 3000 || values[i] > 3150 )
// if( values[i] < VAL_MIN || values[i] > VAL_MAX )
// c = 0;
if(Md == 'a' || Md == 'v')
Serial.println("");
}
else
// if( values[i] > 2950 && values[i] < 3150 )
if( values[i] < VAL_MIN || values[i] > VAL_MAX )
{
if(Md == 'a' || Md == 'v')
Serial.println("");
}
if(Md == 'a' || Md == 'v')
{
Serial.print(p);
Serial.print(values[i]);
Serial.print(" ");
}
//
/// Inc Freq Counters - for calculating Freq between Inflections : ///
f2c ++ ;
f3c ++ ;
f4c ++ ;
f6c ++ ;
f8c ++ ;
f_t = (i); // - (i) out of A_MAX
f_tp = (i / A_MAX); /// - percent of segment of freq cycle
if( c >= 2 && cl < 2 )
{
f2 = ((f2 + (f2c * 10)) / 2) ;
f2c = 0 ;
{
if(f2i)
{
// FAdd( f2 , f2t , f_t , A_MAX );
FAdd( ( (1000000 / F_DIV) / (f2 / 10) ) , f2t , f_t , A_MAX );
f2t = f_t ;
}
f2i = 1;
}
if(Md == 'f')
{
Serial.print("\t");
Serial.print("f2= ");
Serial.print(f2);
Serial.print(" ");
Serial.print( (1000000 / F_DIV) / (f2 / 10) );
Serial.print(" Hz ");
Serial.println("");
}
}
if( c >= 3 && cl < 3 )
{
f3 = ((f3 + (f3c * 10)) / 2) ;
f3c = 0 ;
if( f3 != f2 )
{
if(f3i)
{
FAdd( f3 , f3t , f_t , A_MAX );
f3t = f_t ;
}
f3i = 1;
}
if(Md == 'f')
{
Serial.print("\t\t");
Serial.print("f3= ");
Serial.print(f3);
Serial.print(" ");
Serial.print( (1000000 / F_DIV) / (f3 / 10) );
Serial.print(" Hz ");
Serial.println("");
}
}
if( c >= 4 && cl < 4 )
{
f4 = ((f4 + (f4c * 10)) / 2) ;
f4c = 0 ;
if( f4 != f3 && f4 != f2 )
{
if(f4i)
{
FAdd( f4 , f4t , f_t , A_MAX );
f2t = f_t ;
}
f4i = 1;
}
if(Md == 'f')
{
Serial.print("\t\t\t");
Serial.print("f4= ");
Serial.print(f4);
Serial.print(" ");
Serial.print( (1000000 / F_DIV) / (f4 / 10) );
Serial.print(" Hz ");
Serial.println("");
}
}
if( c >= 6 && cl < 6 )
{
f6 = ((f6 + (f6c * 10)) / 2) ;
f6c = 0 ;
if( f6 != f4 && f6 != f3 && f6 != f2)
{
if(f6i)
{
FAdd( f6 , f6t , f_t , A_MAX );
f6t = f_t ;
}
f6i = 1;
}
if(Md == 'f')
{
Serial.print("\t\t\t\t");
Serial.print("f6= ");
Serial.print(f6);
Serial.print(" ");
Serial.print( (1000000 / F_DIV) / (f6 / 10) );
Serial.print(" Hz ");
Serial.println("");
}
}
if( c >= 8 && cl < 8 )
{
f8 = ((f8 + (f8c * 10)) / 2) ;
f8c = 0 ;
if( f8 != f6 && f6 != f4 && f6 != f3 && f6 != f2)
{
if(f8i)
{
FAdd( f8 , f8t , f_t , A_MAX );
f8t = f_t ;
}
f8i = 1;
}
if(Md == 'f')
{
Serial.print("\t\t\t\t\t");
Serial.print("f8= ");
Serial.print(f8);
Serial.print(" ");
Serial.print( (1000000 / F_DIV) / (f8 / 10) );
Serial.print(" Hz ");
Serial.println("");
}
}
} // - end if(i).
} // - end for(i=..).
Serial.println("");
//
if(Md == 'g' || Md == 'f' || Md == 'a')
{
Serial.println("\n ");
for(i=A_L_MIN; i<=A_L_MAX; i++)
{
v = ( 1000 * A_L[ i ] / A_MAX );
Serial.print( v );
Serial.print( " " );
}
Serial.println("\n");
}
;
if(Md == 'g' || Md == 'f' || Md == 'a')
{
for(j=1; j<=10; j++)
// for(j=1; j<=20; j++)
{
// Serial.println("\n ");
for(i=A_L_MIN; i<=A_L_MAX; i++)
{
v = ( 1000 * A_L[ i ] / A_MAX );
sprintf(s,"%d",v);
if( (v / 50) >= j )
// if( (v / 100) >= j )
Serial.print( "*" );
else
Serial.print( " " );
// Serial.print( v );
Serial.print( SPC_.substring(0,strlen(s)) );
// Serial.print( " " );
}
Serial.println("\n");
}
}
//
delay(2000);
}
//