Skip to content

Commit

Permalink
Documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
ArminJo committed Jan 21, 2023
1 parent ea1c76c commit 5b26af3
Show file tree
Hide file tree
Showing 16 changed files with 357 additions and 438 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/TestCompile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
uses: actions/checkout@master

# - name: Checkout custom library
# uses: actions/checkout@v2
# uses: actions/checkout@v3
# with:
# repository: ArminJo/Arduino-BlueDisplay
# ref: master
Expand All @@ -26,6 +26,6 @@ jobs:
- name: Compile all examples
uses: ArminJo/arduino-test-compile@master
with:
sketch-names: SimpleTouchScreenDSO.cpp
sketch-names: SimpleDSO.cpp
build-properties: '{ "All": "-DUSE_SIMPLE_SERIAL" }'
required-libraries: BlueDisplay
2 changes: 0 additions & 2 deletions FrequencyGeneratorPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
* Email: [email protected]
* License: GPL v3 (http://www.gnu.org/licenses/gpl.html)
*/

#ifndef _FREQUENCY_GENERATOR_PAGE_H
#define _FREQUENCY_GENERATOR_PAGE_H

Expand All @@ -29,4 +28,3 @@ void stopFrequencyGeneratorPage(void);
extern const char StringStop[] PROGMEM; // "Stop"

#endif // _FREQUENCY_GENERATOR_PAGE_H
#pragma once
77 changes: 39 additions & 38 deletions FrequencyGeneratorPage.cpp → FrequencyGeneratorPage.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* FrequencyGeneratorPage.cpp
* FrequencyGeneratorPage.hpp
*
* Frequency output from 119 mHz (8.388 second) to 8 MHz square wave on Arduino using timer1.
* Sine waveform output from 7,421 mHz to 7812.5 Hz
Expand All @@ -11,12 +11,12 @@
* Waveform frequency is not stable and decreased, since not all TIMER1 OVERFLOW interrupts are handled.
*
* PWM RC-Filter suggestions
* Simple: 2k2 Ohm and 100 nF
* 2nd order (good for sine and triangle): 1 kOhm and 100 nF -> 4k7 Ohm and 22 nF
* 2nd order (better for sawtooth): 1 kOhm and 22 nF -> 4k7 Ohm and 4.7 nF
* Simple: 2.2 kOhm and 100 nF
* 2nd order (good for sine and triangle): 1 kOhm and 100 nF -> 4.7 kOhm and 22 nF
* 2nd order (better for sawtooth): 1 kOhm and 22 nF -> 4.7 kOhm and 4.7 nF
*
*
* Copyright (C) 2015 Armin Joachimsmeyer
* Copyright (C) 2015-2022 Armin Joachimsmeyer
* Email: [email protected]
*
* This file is part of Arduino-Simple-DSO https://github.com/ArminJo/Arduino-Simple-DSO.
Expand All @@ -35,12 +35,12 @@
* along with this program. If not, see <http://www.gnu.org/licenses/gpl.html>.
*
*/
#ifndef _FREQUENCY_GENERATOR_PAGE_HPP
#define _FREQUENCY_GENERATOR_PAGE_HPP

#if defined(AVR)
#include "FrequencyGeneratorPage.h"
#define SUPPRESS_HPP_WARNING
#include "BlueDisplay.h"
#include "SimpleTouchScreenDSO.h"
//#include "SimpleTouchScreenDSO.h"

#include <stdlib.h> // for dtostrf

Expand Down Expand Up @@ -92,15 +92,14 @@ const char StringMHz[] PROGMEM = "MHz";
const char* RangeButtonStrings[5] = {StringmHz, StringHz, String10Hz, StringkHz, StringMHz};
#else
const uint16_t FixedFrequencyButtonCaptions[NUMBER_OF_FIXED_FREQUENCY_BUTTONS] = { 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000 };
const char* const RangeButtonStrings[5] = { "mHz", "Hz", "10Hz", "kHz", "MHz" };
const char *const RangeButtonStrings[5] = { "mHz", "Hz", "10Hz", "kHz", "MHz" };
const char FrequencyFactorChars[4] = { 'm', ' ', 'k', 'M' };
struct FrequencyInfoStruct sFrequencyInfo;

#endif
#define INDEX_OF_10HZ 2
static bool is10HzRange = true;


static const int BUTTON_INDEX_SELECTED_INITIAL = 2; // select 10Hz Button

/*
Expand All @@ -124,7 +123,7 @@ BDButton TouchButton100;
BDButton TouchButton200;
BDButton TouchButton500;
BDButton TouchButton1k;
BDButton * const TouchButtonFixedFrequency[] = { &TouchButton1, &TouchButton2, &TouchButton5, &TouchButton10, &TouchButton20,
BDButton *const TouchButtonFixedFrequency[] = { &TouchButton1, &TouchButton2, &TouchButton5, &TouchButton10, &TouchButton20,
&TouchButton50, &TouchButton100, &TouchButton200, &TouchButton500, &TouchButton1k };
#else
BDButton TouchButtonFirstFixedFrequency;
Expand All @@ -136,19 +135,18 @@ void initFrequencyGeneratorPageGui(void);

void doFrequencySlider(BDSlider *aTheTouchedSlider, uint16_t aValue);

void doWaveformMode(BDButton * aTheTouchedButton, int16_t aValue);
void doSetFixedFrequency(BDButton * aTheTouchedButton, int16_t aValue);
void doSetFrequencyRange(BDButton * aTheTouchedButton, int16_t aValue);
void doFrequencyGeneratorStartStop(BDButton * aTheTouchedButton, int16_t aValue);
void doGetFrequency(BDButton * aTheTouchedButton, int16_t aValue);
void doWaveformMode(BDButton *aTheTouchedButton, int16_t aValue);
void doSetFixedFrequency(BDButton *aTheTouchedButton, int16_t aValue);
void doSetFrequencyRange(BDButton *aTheTouchedButton, int16_t aValue);
void doFrequencyGeneratorStartStop(BDButton *aTheTouchedButton, int16_t aValue);
void doGetFrequency(BDButton *aTheTouchedButton, int16_t aValue);

bool setWaveformFrequencyAndPrintValues();

void printFrequencyAndPeriod();
#if defined(AVR)
void setWaveformButtonCaption(void);
void initTimer1ForCTC(void);
#else
#endif

/***********************
Expand Down Expand Up @@ -206,7 +204,7 @@ void loopFrequencyGeneratorPage(void) {
}

void stopFrequencyGeneratorPage(void) {
#if defined(LOCAL_DISPLAY_EXISTS)
#if defined(BD_DRAW_TO_LOCAL_DISPLAY_TOO)
// free buttons
for (unsigned int i = 0; i < NUMBER_OF_FIXED_FREQUENCY_BUTTONS; ++i) {
TouchButtonFixedFrequency[i]->deinit();
Expand All @@ -218,7 +216,9 @@ void stopFrequencyGeneratorPage(void) {
TouchButtonFrequencyStartStop.deinit();
TouchButtonGetFrequency.deinit();
TouchSliderFrequency.deinit();
# if defined(AVR)
TouchButtonWaveform.deinit();
# endif
#endif
/*
* restore previous state
Expand Down Expand Up @@ -249,12 +249,10 @@ void initFrequencyGeneratorPageGui() {
#endif

#if defined(LOCAL_DISPLAY_EXISTS)
TouchButtonFixedFrequency[i]->init(tXPos,
REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4 - BUTTON_HEIGHT_5 - BUTTON_HEIGHT_6 - 2 * BUTTON_DEFAULT_SPACING,
BUTTON_WIDTH_10, BUTTON_HEIGHT_6, COLOR16_BLUE, sStringBuffer, TEXT_SIZE_11, 0, tFrequency, &doSetFixedFrequency);
TouchButtonFixedFrequency[i]->init(tXPos, 96, BUTTON_WIDTH_10, BUTTON_HEIGHT_6, COLOR16_BLUE, sStringBuffer, TEXT_SIZE_11,
0, tFrequency, &doSetFixedFrequency);
#else
TouchButtonFirstFixedFrequency.init(tXPos,
REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4 - BUTTON_HEIGHT_5 - BUTTON_HEIGHT_6 - 2 * BUTTON_DEFAULT_SPACING,
TouchButtonFirstFixedFrequency.init(tXPos, 92,
BUTTON_WIDTH_10, BUTTON_HEIGHT_6, COLOR16_BLUE, sStringBuffer, TEXT_SIZE_11, 0, tFrequency, &doSetFixedFrequency);
#endif

Expand All @@ -276,16 +274,17 @@ void initFrequencyGeneratorPageGui() {
tButtonColor = BUTTON_AUTO_RED_GREEN_TRUE_COLOR;
}
TouchButtonFrequencyRanges[i].init(tXPos, tYPos, BUTTON_WIDTH_5 + BUTTON_DEFAULT_SPACING_HALF,
BUTTON_HEIGHT_5, tButtonColor, reinterpret_cast<const __FlashStringHelper *>(RangeButtonStrings[i]), TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, i, &doSetFrequencyRange);
BUTTON_HEIGHT_5, tButtonColor, reinterpret_cast<const __FlashStringHelper*>(RangeButtonStrings[i]), TEXT_SIZE_22,
FLAG_BUTTON_DO_BEEP_ON_TOUCH, i, &doSetFrequencyRange);

tXPos += BUTTON_WIDTH_5 + BUTTON_DEFAULT_SPACING - 2;
}

ActiveTouchButtonFrequencyRange = TouchButtonFrequencyRanges[BUTTON_INDEX_SELECTED_INITIAL];

TouchButtonFrequencyStartStop.init(0, REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, 0,
F("Start"), TEXT_SIZE_26, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN,
sFrequencyInfo.isOutputEnabled, &doFrequencyGeneratorStartStop);
TouchButtonFrequencyStartStop.init(0, REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, 0, F("Start"),
TEXT_SIZE_26, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, sFrequencyInfo.isOutputEnabled,
&doFrequencyGeneratorStartStop);
TouchButtonFrequencyStartStop.setCaptionForValueTrue(F("Stop"));

TouchButtonGetFrequency.init(BUTTON_WIDTH_3_POS_2, REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3,
Expand All @@ -309,9 +308,8 @@ void drawFrequencyGeneratorPage(void) {
#endif
TouchSliderFrequency.drawSlider();


BlueDisplay1.drawText(TEXT_SIZE_11_WIDTH, FREQ_SLIDER_Y + 3 * FREQ_SLIDER_SIZE + TEXT_SIZE_11_HEIGHT, F("1"),
TEXT_SIZE_11, COLOR16_BLUE, COLOR_BACKGROUND_FREQ);
TEXT_SIZE_11, COLOR16_BLUE, COLOR_BACKGROUND_FREQ);
#if defined(AVR)
BlueDisplay1.drawText(REMOTE_DISPLAY_WIDTH - 5 * TEXT_SIZE_11_WIDTH,
FREQ_SLIDER_Y + 3 * FREQ_SLIDER_SIZE + TEXT_SIZE_11_HEIGHT, F("1000"), TEXT_SIZE_11, COLOR16_BLUE,
Expand Down Expand Up @@ -350,7 +348,9 @@ void drawFrequencyGeneratorPage(void) {

TouchButtonFrequencyStartStop.drawButton();
TouchButtonGetFrequency.drawButton();
#if defined(AVR)
TouchButtonWaveform.drawButton();
#endif

// show values
printFrequencyAndPeriod();
Expand Down Expand Up @@ -395,7 +395,7 @@ void setWaveformButtonCaption(void) {
}
#endif

void doWaveformMode(BDButton * aTheTouchedButton, int16_t aValue) {
void doWaveformMode(BDButton *aTheTouchedButton, int16_t aValue) {
#if defined(AVR)
cycleWaveformMode();
setWaveformButtonCaption();
Expand All @@ -405,7 +405,7 @@ void doWaveformMode(BDButton * aTheTouchedButton, int16_t aValue) {
/**
* Set frequency to fixed value 1,2,5,10...,1000
*/
void doSetFixedFrequency(BDButton * aTheTouchedButton, int16_t aValue) {
void doSetFixedFrequency(BDButton *aTheTouchedButton, int16_t aValue) {
setFrequencyNormalizedForGUI(aValue);
bool tErrorOrClippingHappend = setWaveformFrequencyAndPrintValues();
#if defined(LOCAL_DISPLAY_EXISTS)
Expand All @@ -419,7 +419,7 @@ void doSetFixedFrequency(BDButton * aTheTouchedButton, int16_t aValue) {
* sets the unit (mHz - MHz)
* set color for old and new button
*/
void doSetFrequencyRange(BDButton * aTheTouchedButton, int16_t aValue) {
void doSetFrequencyRange(BDButton *aTheTouchedButton, int16_t aValue) {

if (ActiveTouchButtonFrequencyRange != *aTheTouchedButton) {
// Handling of 10 Hz button
Expand Down Expand Up @@ -451,7 +451,7 @@ void doSetFrequencyRange(BDButton * aTheTouchedButton, int16_t aValue) {
* @param aTheTouchedButton
* @param aValue
*/
void doGetFrequency(BDButton * aTheTouchedButton, int16_t aValue) {
void doGetFrequency(BDButton *aTheTouchedButton, int16_t aValue) {
TouchSliderFrequency.deactivate();
float tNumber = getNumberFromNumberPad(NUMBERPAD_DEFAULT_X, 0, COLOR16_BLUE);
// check for cancel
Expand Down Expand Up @@ -479,7 +479,7 @@ void doGetFrequency(BDButton * aTheTouchedButton, int16_t aValue) {
}
#endif

void doFrequencyGeneratorStartStop(BDButton * aTheTouchedButton, int16_t aValue) {
void doFrequencyGeneratorStartStop(BDButton *aTheTouchedButton, int16_t aValue) {
sFrequencyInfo.isOutputEnabled = aValue;
if (aValue) {
// Start timer
Expand Down Expand Up @@ -622,17 +622,17 @@ bool setWaveformFrequency(float aValue) {
tDividerInt = 2;
}

#if defined(STM)32F30X
# if defined(STM32F30X)
Synth_Timer32_SetReloadValue(tDividerInt);
#else
# else
uint32_t tPrescalerValue = (tDividerInt >> 16) + 1; // +1 since at least divider by 1
if (tPrescalerValue > 1) {
//we have prescaler > 1 -> adjust reload value to be less than 0x10001
tDividerInt /= tPrescalerValue;
}
Synth_Timer16_SetReloadValue(tDividerInt, tPrescalerValue);
tDividerInt *= tPrescalerValue;
#endif
# endif
sFrequencyInfo.ControlValue.DividerInt = tDividerInt;
// recompute frequency
sFrequencyInfo.Frequency = 36000000 / tDividerInt;
Expand All @@ -651,5 +651,6 @@ bool setWaveformFrequency() {
float getPeriodMicros() {
return sFrequencyInfo.ControlValue.DividerInt / 36.0f;
}
#endif
#endif // !defined(AVR)

#endif // _FREQUENCY_GENERATOR_PAGE_HPP
42 changes: 20 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ You can load the library with *Tools -> Manage Libraries...* or *Ctrl+Shift+I*.
- no attenuator (pin 8+9 left open).
- passive attenuator with /1, /10, /100 attenuation (pin 8 connected to ground).
- active attenuator (pin 9 connected to ground) - still experimental.
- Using 1.1 volt internal reference. 5 volt (VCC) is also selectable and is useful if no attenuator is attached.
- Using 1.1 volt internal reference. 5 V (VCC) is also selectable and is useful if no attenuator is attached.

- Integrated frequency generator using 16 bit Timer1. Frequency from 119 mHz (8.388 second) to 8 MHz
- Integrated PWM Waveform generator for sinus, triangle and sawtooth using 16 bit Timer1. Frequency from 1.9 mHz to 7.8 kHz
Expand All @@ -41,11 +41,11 @@ You can load the library with *Tools -> Manage Libraries...* or *Ctrl+Shift+I*.
1. Arduino Nano
2. Breadboard 400 points
3. Resistors
- Resistors for the simple (0-5 volt) version: 1x 10 kOhm, 2x 100 k, 1x 4 M or more.
- Resistors for the 3 range (0-110 volt) version: 1x 2.2 kOhm, 2x 10 k, 3x 100 k, 2x 220 k, 2x 1 M, 1x 4 M or greater
- Resistors for the simple (0-5 V) version: 1x 10 k&ohm;, 2x 100 k, 1x 4 M or more.
- Resistors for the 3 range (0-110 V) version: 1x 2.2 k&ohm;, 2x 10 k, 3x 100 k, 2x 220 k, 2x 1 M, 1x 4 M or greater
4. Capacitors
- Capacitors for the simple version: 1x 100 nF / 10 volt (or more)
- Capacitors for the 3 range (0-110 volt) version: 4x 100 nF / 100 volt (or more), 6.8 uF
- Capacitors for the simple version: 1x 100 nF / 10 V (or more)
- Capacitors for the 3 range (0-110 V) version: 4x 100 nF / 100 V (or more), 6.8 &micro;F
5. Jumper wires

Optional for Bluetooth connection
Expand Down Expand Up @@ -111,7 +111,7 @@ The stack size is required for testing different buffer size values during devel
- **History** -> **red** history off, **green** history on, i.e. old chart data is not deleted, it stays as a light green trace. This button is also available (invisible) at the chart page.
- Slope - **Slope A** -> trigger on ascending slope, **Slope D** -> trigger on descending slope.
- **Back** -> Back to chart page.
- **Trigger delay** -> Trigger delay can be numerical specified from 4 µs to 64.000.000 µs (64 seconds, if you really want). Microseconds resolution is used for values below 64.000.
- **Trigger delay** -> Trigger delay can be numerical specified from 4 &micro;s to 64.000.000 &micro;s (64 seconds, if you really want). Microseconds resolution is used for values below 64.000.
- Trigger - the trigger value can be set on the chart page by touching the light violet vertical bar in the 4. left grid.
- **Trigger auto** -> let the DSO compute the trigger value using the average of the last measurement.
- **Trigger man timeout** -> use manual trigger value, but with timeout, i.e. if trigger condition not met, new data is shown after timeout.
Expand All @@ -121,7 +121,7 @@ The stack size is required for testing different buffer size values during devel
-**Trigger ext** uses pin 2 as external trigger source.

- Input selector
- **%1** -> Pin A0 with no attenuator, only a 10k Ohm protection resistor.
- **%1** -> Pin A0 with no attenuator, only a 10 k&ohm; protection resistor.
- **%10** -> Pin A1 with an 1 to 10 attenuator.
- **%100** -> Pin A2 with an 1 to 100 attenuator.
- **CH 3** -> sequences through the channels **CH 4**, **Temp** (internal temperature sensor), **VRef** (internal reference).
Expand All @@ -147,36 +147,34 @@ Short touch switches info output, long touch shows active GUI elements.

|Maximum values | Minimum values|
| :--- | :--- |
|SINE: clip to minimum 8 samples per period => 128 µs / 7812.5 Hz |7,421 mHz|
|SAWTOOTH: clip to minimum 16 samples per period => 256 µs / 3906.25 Hz |3.725 mHz|
|TRIANGLE: clip to minimum 32 samples per period => 512 µs / 1953.125 Hz|1.866 mHz|
|SINE: clip to minimum 8 samples per period => 128 &micro;s / 7812.5 Hz |7,421 mHz|
|SAWTOOTH: clip to minimum 16 samples per period => 256 &micro;s / 3906.25 Hz |3.725 mHz|
|TRIANGLE: clip to minimum 32 samples per period => 512 &micro;s / 1953.125 Hz|1.866 mHz|

### RC-Filter suggestions
- Simple: 2k2 Ohm and 100 nF
- 2nd order (good for sine and triangle): 1 kOhm and 100 nF -> 4k7 Ohm and 22 nF
- 2nd order (better for sawtooth): 1 kOhm and 22 nF -> 4k7 Ohm and 4.7 nF
- Simple: 2.2 k&ohm; and 100 nF
- 2nd order (good for sine and triangle): 1 k&ohm; and 100 nF -> 4.7 k&ohm; and 22 nF
- 2nd order (better for sawtooth): 1 k&ohm; and 22 nF -> 4.7 k&ohm; and 4.7 nF

**Do not run DSO acquisition and non square wave waveform generation at the same time.**
Because of the interrupts at 62 kHz rate, DSO is almost not usable during non square wave waveform generation
and waveform frequency is not stable and decreased, since not all TIMER1 OVERFLOW interrupts are handled.

# SCREENSHOTS
DSO start screen
![DSO start screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Welcome.jpg)

| DSO Chart screen | DSO Chart screen with long info |
| DSO start screen | DSO at work |
| :-: | :-: |
| ![DSO start screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Welcome.jpg) | ![DSO at work](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/DSO+Tablet.jpg) |
| DSO chart screen | DSO chart screen with long info |
| ![DSO chart screen](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Chart.jpg) | ![DSO chart screen with long info](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Chart_Long_Info.jpg) |
| ![DSO at work](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/DSO+Tablet.jpg) | |

## Linearity of the ATmega328P(B) ADC converter
The captured signal was generated with a STM32F303 DAC and the DSO input range was chosen to see the LSB of the 10 bit ADC conversion.

| All ranges including the 1 ms range (up to 30 kSamples per second / 26 µs conversion time) have almost perfect linearity. | In the 50 µs to 10 µs ranges with 300 kSamples per second (3 µs conversion time) the linearity is only acceptable. |
| All ranges including the 1 ms range (up to 30 kSamples per second / 26 &micro;s conversion time) have almost perfect linearity. | In the 50 &micro;s to 10 &micro;s ranges with 300 kSamples per second (3 &micro;s conversion time) the linearity is only acceptable. |
| :-: | :-: |
| ![26 µs conversion](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Linearity_26us_conversion_time.jpg) | ![3 µs conversion](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Linearity_3us_conversion_time.jpg) |
| First small linearity issues can be seen in the 496 µs range with 60 kSamples per second (13 µs conversion time). | And in the 101 µs range with 150 kSamples per second (6.5 µs conversion time). |
| ![13 µs conversion](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Linearity_13us_conversion_time.jpg) | ![6.5 µs conversion](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Linearity_6us5_conversion_time.jpg) |
| ![26 &micro;s conversion](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Linearity_26us_conversion_time.jpg) | ![3 &micro;s conversion](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Linearity_3us_conversion_time.jpg) |
| First small linearity issues can be seen in the 496 &micro;s range with 60 kSamples per second (13 &micro;s conversion time). | And in the 101 &micro;s range with 150 kSamples per second (6.5 &micro;s conversion time). |
| ![13 &micro;s conversion](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Linearity_13us_conversion_time.jpg) | ![6.5 &micro;s conversion](https://github.com/ArminJo/Arduino-Simple-DSO/blob/master/pictures/Linearity_6us5_conversion_time.jpg) |

# SCHEMATICS
| SIMPLE 1 RANGE VERSION | 3 RANGE VERSION |
Expand Down
Loading

0 comments on commit 5b26af3

Please sign in to comment.