Compatible with:
DOS Maximite CMM MM150 MM170 MM+ MMX Picromite ArmiteL4 Armite F4 ArmiteH7 CMM2

ADC OPEN frequency, channel1-pin [,channel2-pin] [,channel3-pin] [, interrupt]
ADC TRIGGER channel, level
ADC START channel1array!() [,channel2array!()] [,channel3array!()]

The ADC functionality can capture up to 3 channels of analog data in the background at up to 500KHz per channel (480KHz for 400MHz processors) with user selectable triggering

ADC OPEN frequency, channel1-pin [,channel2-pin] [,channel3-pin] [, interrupt]
Open the ADC channels. "frequency" is the sampling frequency in Hz. 
Above 160KHz the conversion is 8-bits per channel 
From 40KHz to 160KHz the conversion is 10-bits per channel 
From 20KHz to 40KHz the conversion is 12-bits per channel 
From 10KHz to 20KHz the conversion is 14-bits per channel 
Below 10KHz conversion is 16-bits per channel 
This is automatically applied in the firmware. 

'channel1-pin' can be one of 7,10,16,22,24,37 
'channel2-pin' can be one of 8,12,26,29 
'channel3-pin' can be one of 13,15 
'interrupt' is a normal MMBasic subroutine that will be called when the conversion completes.

Allows the ADC frequency to be adjusted after the ADC START command. 
This command is only valid if the number of bits calculated in the table above does not change.

ADC TRIGGER channel, level
Sets up triggering of the ADC. This should be specified before the ADC START command. 
The 'channel' can be a number between one and three depending on the number of pins specified in the ADC OPEN command. 
The 'level' can be between -VCC and VCC. 
A positive number indicates that the trigger will be on a positive going transition through the specified voltage. 
A negative number indicates a negative going transition through the specified voltage.

ADC START channel1array!() [,channel2array!()] [,channel3array!()]
Starts ADC conversion. The floating point arrays must be the same size and their size will determine the number of samples. 
Once the start command is issued the ADC(s) will start converting the input signals into the arrays at the frequency specified. 
If the OPEN command includes an interrupt then the command will be nonblocking. If an interrupt is not specified the command will be blocking. 
The samples are returned as floating point values between 0 and VCC.

Closes the ADC and returns the pins to normal use

 ' pins 7 and 8 are used as analogue inputs.
 ' a finger on either pin will give a mains frequency trace
 ' 512 samples at 10kHz = 51.2mS for one complete capture
 ' change SAMPLESPERSEC to suit
 DIM INTEGER i, j, toggle
 DIM INTEGER x1(255),x2(255),y1(255),y2(255),y3(255), y4(255)
 FOR i=0 TO 255 ' prepare the arrays used in LINE command
   x1(i)= i*2+194
   x2(i)= i*2+195
 PAGE WRITE 1 ' we write to a hiddden page and only display it when the scan is finished
 ADC OPEN SAMPLESPERSEC, 7, 8,, adc_done
 ADC START a(), b()
 TEXT 10,40,"Channel 1",,3
 TEXT 10,320,"Channel 2",,3
   LOOP WHILE j=0  'wait until the background ADC has finished
   ' restart background ADC using the 'other' arrays
   ' we toggle between the two pairs of arrays
   IF toggle THEN
     ADC START a1(),b1()
     ADC START a(),b()
   BOX 194,0,MM.HRES-287,MM.VRES,1,&HFFFFFF,0 ' erase the old trace
   ' plot the samples
   FOR i=1 TO 255 ' scale the y values using the array that is NOT being used by ADC
     IF toggle THEN
       y1(i)=130 - a1(i-1)*40
       y2(i)=130 - a1(i)*40
       y3(i)=410 - b1(i-1)*50
       y4(i)=410 - b1(i)*50
       y1(i)=130 - a(i-1)*40
       y2(i)=130 - a(i)*40
       y3(i)=410 - b(i-1)*50
       y4(i)=410 - b(i)*50
   NEXT i
   LINE x1(),y1(),x2(),y2(),1,RGB(MAGENTA) ' plotting a series of values is much faster
   LINE x1(),y3(),x2(),y4(),1,RGB(GREEN)   'if they are in arrays instead of looping through
   PAGE COPY 1 TO 0 ' show the page we have finished drawing
 LOOP UNTIL inkey$ <> "" ' go back and wait till the background ADC has finished the next page.
SUB adc_done
 j=1             ' set a flag so the main loop knows when the ADC capture has finished

Last edited: 29 September, 2020