A simple oscilloscope using Adafruit 2.8" TFT with touch. Runs on FRDM-KL25Z, FRDM-K22F, FRDM-K64F, NUCLEO-F411RE. 2 channel analog inputs with 4 trigger modes and time division.

Dependencies:   SPI_STMPE610 UniGraphic mbed vt100

My first attempt of implementing an oscilloscope using FRDM-KL25Z and Adafruit 2.8" TFT with touch.

FRDM-KL25Z と Adafruit 2.8" TFT with touch を使用して作ってみた最初のオシロスコープです。

On 25-Sep-2017, wrong calculation of trigger pos/val fixed.
On 25-Nov-2015, FRDM-K64F and NUCLEO-F411RE platforms were added.
On 26-Nov-2015, FRDM-K22F is added (tested).
Note: Now ch2 is A2 instead of A1!

25-Sep-2017, トリガー値と位置の計算の誤りを修正しました。
25-Nov-2015, FRDM-K64F と NUCLEO-F411RE でも動くようになりました。
26-Nov-2015, FRDM-K22F でも動作確認が出来ました。 ※一身上の都合で、アナログ入力の ch2 は A1 から A2 に変更しましたので、ご注意ください。m(_ _)m

/media/uploads/Rhyme/oscillo_top.jpg

This supports two analog inputs A0 for channel 1 and A2 for channel 2
and four trigger modes (NONE, RISE, FALL, LEVEL),
time division is 30us to 20ms per pixel which will make 300us/div to 200.0ms/div (as 10 pixels per div)

A0と A2 のアナログ2入力にて、
4種類のトリガーモード(NONE: フリーラン RISE: 立ち上がりエッジ、FALL: 立下りエッジ、LEVEL: レベル) 。
サンプリングは30us から 20ms, チャートの1メモリが10ピクセルなので、300us/dev から 200.0ms/div となっています。

The analog signals and gnd was picked at the pins in the picture above.
Note: now you need to pick A0 and A2 instead of A0 and A1.

信号は上記の写真のように、Adafruit のピンからつまみました。
変更により、A0とA2が入力となります。

/media/uploads/Rhyme/freerunmode.jpg

When powered on or reset, the program starts in Trigger Mode = NONE (Free Run Mode)

電源投入、リセット後 プログラムはトリガーモード NONE (フリーランモード) で起動します。

To change trigger mode and/or time division, press run/stop button.

トリガーモードを変えたり、サンプリング時間を変えるのには run/stop ボタンを押してください。

Each time you push Trig button, the trigger mode changes
NONE -> RISE -> FALL -> LEVEL ( -> NONE).

トリガーボタンを押すたびにトリガーモードは
NONE(フリーラン) -> RISE (立ち上がりエッジ) -> FALL (立下りエッジ) -> LEVEL (レベル)
と変化します。

When trigger mode is not NONE,
to specify the trigger position, level and channel, push inside the wave frame.
Then green trigger marks will be shown and value of trigger position and voltage will be printed.

トリガーモードが NONE でないときに、チャネルの枠内をタッチしますと、
その位置がトリガーのポジション、レベル、チャネルになります。 そして、緑色のトリガーマークが表示され、下部にはトリガーの具体的なポジションとボルテージが表示されます。

/media/uploads/Rhyme/usage_screen1.jpg

To change time division push "1/2" to Zoom Out (sampling interval will be bigger) or
"x2" to Zoom In (Sampling interval will be smaller).

サンプリングタイムを変更するのには
"1/2" ズームアウト (サンプリング間隔が長くなります) か
"x2" ズームイン (サンプリング間隔が短くなります。) を押してください。

/media/uploads/Rhyme/helps.jpg

On 7-Mar-2015 updated to UniGraphic library version!

2015年3月7日 UniGraphic ライブラリ使用版にアップデートしました。

/media/uploads/Rhyme/frdm-kl25z-ss.jpg FRDM-KL25Z
/media/uploads/Rhyme/frdm-k64f-ss.jpg FRDM-K64F
/media/uploads/Rhyme/nucleo-f411re-ss.jpg NUCLEO-F411RE

Committer:
Rhyme
Date:
Mon Sep 25 02:09:53 2017 +0000
Revision:
10:bd3d8d71ee73
Parent:
9:657155f03cb8
miss calc of trigger value/pos fixed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:2b9a6c5fcd52 1 /** mbed oscilloscope my implementation of a oscillo scope
Rhyme 0:2b9a6c5fcd52 2 * Copyright (c) 2014, 2015 Motoo Tanaka @ Design Methodology Lab
Rhyme 0:2b9a6c5fcd52 3 *
Rhyme 0:2b9a6c5fcd52 4 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Rhyme 0:2b9a6c5fcd52 5 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Rhyme 0:2b9a6c5fcd52 6 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Rhyme 0:2b9a6c5fcd52 7 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Rhyme 0:2b9a6c5fcd52 8 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Rhyme 0:2b9a6c5fcd52 9 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Rhyme 0:2b9a6c5fcd52 10 * THE SOFTWARE.
Rhyme 0:2b9a6c5fcd52 11 */
Rhyme 0:2b9a6c5fcd52 12 #ifndef _MAIN_H_
Rhyme 6:c93e2f12b789 13 #define _MAIN_H_ included
Rhyme 4:6f3532a1a962 14
Rhyme 6:c93e2f12b789 15 #if defined (TARGET_KL25Z)
Rhyme 6:c93e2f12b789 16 #define PIN_SCLK PTD1
Rhyme 6:c93e2f12b789 17 #define PIN_MISO PTD3
Rhyme 0:2b9a6c5fcd52 18 #define PIN_MOSI PTD2
Rhyme 0:2b9a6c5fcd52 19 #define PIN_CS_TFT PTD0
Rhyme 0:2b9a6c5fcd52 20 #define PIN_DC_TFT PTD5
Rhyme 6:c93e2f12b789 21 #define PIN_CS_TSC PTA13
Rhyme 9:657155f03cb8 22 #define PIN_BL_TFT PTA12
Rhyme 0:2b9a6c5fcd52 23 #define PIN_CS_SD PTA4
Rhyme 6:c93e2f12b789 24 #define PIN_TSC_INTR PTC9 /* place holder */
Rhyme 6:c93e2f12b789 25 #define PIN_RESET_TFT PTB10 /* place holder */
Rhyme 4:6f3532a1a962 26 #define PIN_ADC_CH0 PTB0
Rhyme 6:c93e2f12b789 27 #define PIN_ADC_CH1 PTB2
Rhyme 0:2b9a6c5fcd52 28
Rhyme 2:4b9260139892 29 #elif defined (TARGET_KL46Z)
Rhyme 6:c93e2f12b789 30 #define PIN_SCLK PTD5
Rhyme 2:4b9260139892 31 #define PIN_MISO PTD7
Rhyme 6:c93e2f12b789 32 #define PIN_MOSI PTD6
Rhyme 2:4b9260139892 33 #define PIN_CS_TFT PTD4
Rhyme 2:4b9260139892 34 #define PIN_DC_TFT PTD2
Rhyme 6:c93e2f12b789 35 #define PIN_CS_TSC PTA13
Rhyme 2:4b9260139892 36 #define PIN_BL_TFT PTC9
Rhyme 2:4b9260139892 37 #define PIN_CS_SD PTA4
Rhyme 6:c93e2f12b789 38 #define PIN_TSC_INTR PTC7 /* place holder */
Rhyme 6:c93e2f12b789 39 #define PIN_RESET_TFT PTC6 /* place holder */
Rhyme 4:6f3532a1a962 40 #define PIN_ADC_CH0 PTB0
Rhyme 6:c93e2f12b789 41 #define PIN_ADC_CH1 PTB2
Rhyme 4:6f3532a1a962 42
Rhyme 4:6f3532a1a962 43 #elif defined (TARGET_K64F)
Rhyme 6:c93e2f12b789 44 #define PIN_SCLK PTD1
Rhyme 4:6f3532a1a962 45 #define PIN_MISO PTD3
Rhyme 6:c93e2f12b789 46 #define PIN_MOSI PTD2
Rhyme 4:6f3532a1a962 47 #define PIN_CS_TFT PTD0
Rhyme 4:6f3532a1a962 48 #define PIN_DC_TFT PTC4
Rhyme 6:c93e2f12b789 49 // for board rev E or later
Rhyme 6:c93e2f12b789 50 #define PIN_CS_TSC PTC12
Rhyme 6:c93e2f12b789 51 // for earlier boards use following line
Rhyme 6:c93e2f12b789 52 // #define PIN_CS_TSC PTA0
Rhyme 4:6f3532a1a962 53 #define PIN_BL_TFT PTC3
Rhyme 4:6f3532a1a962 54 #define PIN_CS_SD PTB23
Rhyme 6:c93e2f12b789 55 #define PIN_TSC_INTR PTC0 /* place holder */
Rhyme 6:c93e2f12b789 56 #define PIN_RESET_TFT PTC9 /* place holder */
Rhyme 4:6f3532a1a962 57 #define PIN_ADC_CH0 PTB2
Rhyme 6:c93e2f12b789 58 #define PIN_ADC_CH1 PTB10
Rhyme 6:c93e2f12b789 59
Rhyme 6:c93e2f12b789 60 #elif defined (TARGET_K22F)
Rhyme 6:c93e2f12b789 61 #define PIN_SCLK PTD5
Rhyme 6:c93e2f12b789 62 #define PIN_MISO PTD7
Rhyme 6:c93e2f12b789 63 #define PIN_MOSI PTD6
Rhyme 6:c93e2f12b789 64 #define PIN_CS_TFT PTD4
Rhyme 6:c93e2f12b789 65 #define PIN_DC_TFT PTA1
Rhyme 6:c93e2f12b789 66 #define PIN_CS_TSC PTB19
Rhyme 6:c93e2f12b789 67 #define PIN_BL_TFT PTC6
Rhyme 6:c93e2f12b789 68 #define PIN_CS_SD PTA4
Rhyme 6:c93e2f12b789 69 #define PIN_TSC_INTR PTC7 /* place holder */
Rhyme 6:c93e2f12b789 70 #define PIN_RESET_TFT PTC9 /* place holder */
Rhyme 6:c93e2f12b789 71 #define PIN_ADC_CH0 PTB0
Rhyme 6:c93e2f12b789 72 #define PIN_ADC_CH1 PTC1
Rhyme 6:c93e2f12b789 73
Rhyme 6:c93e2f12b789 74 #elif defined (TARGET_NUCLEO_F411RE)
Rhyme 6:c93e2f12b789 75 #define PIN_SCLK PA_5
Rhyme 6:c93e2f12b789 76 #define PIN_MISO PA_6
Rhyme 6:c93e2f12b789 77 #define PIN_MOSI PA_7
Rhyme 6:c93e2f12b789 78 #define PIN_CS_TFT PB_6
Rhyme 6:c93e2f12b789 79 #define PIN_DC_TFT PC_7
Rhyme 6:c93e2f12b789 80 #define PIN_CS_TSC PA_9
Rhyme 6:c93e2f12b789 81 #define PIN_BL_TFT PA_8
Rhyme 6:c93e2f12b789 82 #define PIN_CS_SD PB_5
Rhyme 6:c93e2f12b789 83 #define PIN_TSC_INTR PA_8 /* place holder */
Rhyme 6:c93e2f12b789 84 #define PIN_RESET_TFT PA_13 /* place holder */
Rhyme 6:c93e2f12b789 85 #define PIN_ADC_CH0 PA_0
Rhyme 6:c93e2f12b789 86 #define PIN_ADC_CH1 PA_4
Rhyme 2:4b9260139892 87
Rhyme 8:62982cc8e5d8 88 #elif defined (TARGET_K20D50M)
Rhyme 8:62982cc8e5d8 89 #define PIN_SCLK PTD1
Rhyme 8:62982cc8e5d8 90 #define PIN_MISO PTD3
Rhyme 8:62982cc8e5d8 91 #define PIN_MOSI PTD2
Rhyme 8:62982cc8e5d8 92 #define PIN_CS_TFT PTC2
Rhyme 8:62982cc8e5d8 93 #define PIN_DC_TFT PTA2
Rhyme 8:62982cc8e5d8 94 #define PIN_CS_TSC PTA12
Rhyme 8:62982cc8e5d8 95 #define PIN_BL_TFT PTC4
Rhyme 8:62982cc8e5d8 96 #define PIN_CS_SD PTC8
Rhyme 8:62982cc8e5d8 97 #define PIN_TSC_INTR PTA4 /* place holder */
Rhyme 8:62982cc8e5d8 98 #define PIN_RESET_TFT PTC7 /* place holder */
Rhyme 8:62982cc8e5d8 99 #define PIN_ADC_CH0 PTC0
Rhyme 8:62982cc8e5d8 100 #define PIN_ADC_CH1 PTD6
Rhyme 8:62982cc8e5d8 101
Rhyme 8:62982cc8e5d8 102 #elif defined (TARGET_RZ_A1H)
Rhyme 8:62982cc8e5d8 103 #define PIN_SCLK P10_12
Rhyme 8:62982cc8e5d8 104 #define PIN_MISO P10_15
Rhyme 8:62982cc8e5d8 105 #define PIN_MOSI P10_14
Rhyme 8:62982cc8e5d8 106 #define PIN_CS_TFT P10_13
Rhyme 8:62982cc8e5d8 107 #define PIN_DC_TFT P8_14
Rhyme 8:62982cc8e5d8 108 #define PIN_CS_TSC P8_15
Rhyme 8:62982cc8e5d8 109 #define PIN_BL_TFT P8_11
Rhyme 8:62982cc8e5d8 110 #define PIN_CS_SD P4_5
Rhyme 8:62982cc8e5d8 111 #define PIN_TSC_INTR P2_9 /* place holder */
Rhyme 8:62982cc8e5d8 112 #define PIN_RESET_TFT P2_10 /* place holder */
Rhyme 8:62982cc8e5d8 113 #define PIN_ADC_CH0 P1_8
Rhyme 8:62982cc8e5d8 114 #define PIN_ADC_CH1 P1_10
Rhyme 8:62982cc8e5d8 115 #elif defined (TARGET_MAX32600MBED)
Rhyme 8:62982cc8e5d8 116 /* I2C */
Rhyme 8:62982cc8e5d8 117 #define PIN_SCL P2_7
Rhyme 8:62982cc8e5d8 118 #define PIN_SDA P2_6
Rhyme 8:62982cc8e5d8 119 /* SPI */
Rhyme 8:62982cc8e5d8 120 #define PIN_SCLK P2_0
Rhyme 8:62982cc8e5d8 121 #define PIN_MISO P2_2
Rhyme 8:62982cc8e5d8 122 #define PIN_MOSI P2_1
Rhyme 8:62982cc8e5d8 123 #define PIN_CS0 P2_3
Rhyme 8:62982cc8e5d8 124 /* Interrupt */
Rhyme 8:62982cc8e5d8 125 #define PIN_INT0 P2_4
Rhyme 8:62982cc8e5d8 126 #define PIN_INT1 P2_5
Rhyme 8:62982cc8e5d8 127 #define PIN_INT2 P1_7
Rhyme 8:62982cc8e5d8 128 #define PIN_INT3 P1_6
Rhyme 8:62982cc8e5d8 129 #define PIN_INT4 P1_5
Rhyme 8:62982cc8e5d8 130 #define PIN_INT5 P1_4
Rhyme 8:62982cc8e5d8 131 /* Analog In */
Rhyme 8:62982cc8e5d8 132 #define PIN_AN0 AIN_0P
Rhyme 8:62982cc8e5d8 133 #define PIN_AN1 AIN_1P
Rhyme 8:62982cc8e5d8 134 #define PIN_AN2 AIN_2P
Rhyme 8:62982cc8e5d8 135 #define PIN_AN3 AIN_3P
Rhyme 8:62982cc8e5d8 136 #define PIN_AN4 AIN_4P
Rhyme 8:62982cc8e5d8 137 #define PIN_AN5 AIN_5P
Rhyme 8:62982cc8e5d8 138 #define BOARD_NAME "MAX32600MBED"
Rhyme 8:62982cc8e5d8 139
Rhyme 8:62982cc8e5d8 140 #define PIN_CS_TFT P2_3 // D10 PTD0
Rhyme 8:62982cc8e5d8 141 #define PIN_DC_TFT P2_4 // D9 PTD5
Rhyme 8:62982cc8e5d8 142 #define PIN_CS_TSC P2_5 // D8 PTA13
Rhyme 8:62982cc8e5d8 143 #define PIN_BL_TFT P1_7 // D7 PTC9
Rhyme 8:62982cc8e5d8 144 #define PIN_CS_SD P1_4 // D4 PTA4
Rhyme 8:62982cc8e5d8 145 #define PIN_TSC_INTR P5_4 // PTC9 /* place holder */
Rhyme 8:62982cc8e5d8 146 #define PIN_RESET_TFT P5_5 /// PTB10 /* place holder */
Rhyme 8:62982cc8e5d8 147 #define PIN_ADC_CH0 AIN_0P // A0 PTB0
Rhyme 8:62982cc8e5d8 148 #define PIN_ADC_CH1 AIN_2P // A2 PTB2
Rhyme 8:62982cc8e5d8 149
Rhyme 2:4b9260139892 150 #else
Rhyme 6:c93e2f12b789 151 #error TARGET NOT DEFINED
Rhyme 6:c93e2f12b789 152 #define PIN_SCLK D13
Rhyme 6:c93e2f12b789 153 #define PIN_MISO D12
Rhyme 6:c93e2f12b789 154 #define PIN_MOSI D11
Rhyme 6:c93e2f12b789 155 #define PIN_CS_TFT D10
Rhyme 6:c93e2f12b789 156 #define PIN_DC_TFT D9
Rhyme 6:c93e2f12b789 157 #define PIN_CS_TSC D8
Rhyme 6:c93e2f12b789 158 #define PIN_BL_TFT D7
Rhyme 6:c93e2f12b789 159 #define PIN_CS_SD D4
Rhyme 6:c93e2f12b789 160 #define PIN_TSC_INTR D5-inside /* place holder */
Rhyme 6:c93e2f12b789 161 #define PIN_RESET_TFT D4-inside /* place holder */
Rhyme 6:c93e2f12b789 162 #define PIN_ADC_CH0 A0
Rhyme 6:c93e2f12b789 163 #define PIN_ADC_CH1 A2
Rhyme 6:c93e2f12b789 164
Rhyme 2:4b9260139892 165 #endif
Rhyme 2:4b9260139892 166
Rhyme 0:2b9a6c5fcd52 167 #define CHART_LEN 198
Rhyme 0:2b9a6c5fcd52 168
Rhyme 0:2b9a6c5fcd52 169 // NOTE: in case MIN_INTERVAL is too small
Rhyme 0:2b9a6c5fcd52 170 // the program hangs during ADC and timer interrupt
Rhyme 8:62982cc8e5d8 171 #if defined (TARGET_MAX32600MBED)
Rhyme 8:62982cc8e5d8 172 #define MIN_INTERVAL 60
Rhyme 8:62982cc8e5d8 173 #else
Rhyme 0:2b9a6c5fcd52 174 #define MIN_INTERVAL 30
Rhyme 8:62982cc8e5d8 175 #endif
Rhyme 0:2b9a6c5fcd52 176 #define MAX_INTERVAL 20000
Rhyme 0:2b9a6c5fcd52 177 #define NUM_MAX_MENU 20
Rhyme 0:2b9a6c5fcd52 178 #define NUM_MAX_ANALOG_CH 2
Rhyme 0:2b9a6c5fcd52 179 #define MODE_RUN 1
Rhyme 0:2b9a6c5fcd52 180 #define MODE_STOP 0
Rhyme 0:2b9a6c5fcd52 181
Rhyme 0:2b9a6c5fcd52 182 extern vt100 tty ;
Rhyme 0:2b9a6c5fcd52 183 extern AnalogIn *ach[] ;
Rhyme 0:2b9a6c5fcd52 184 extern Ticker timer ;
Rhyme 0:2b9a6c5fcd52 185
Rhyme 0:2b9a6c5fcd52 186 extern DigitalOut backlight ;
Rhyme 3:ea0c3cffa988 187 extern ILI9341 TFT ;
Rhyme 0:2b9a6c5fcd52 188 extern SPI_STMPE610 TSC ;
Rhyme 0:2b9a6c5fcd52 189 extern TFTMenuItem *menu[] ;
Rhyme 0:2b9a6c5fcd52 190 extern int numMenu ;
Rhyme 0:2b9a6c5fcd52 191
Rhyme 0:2b9a6c5fcd52 192 extern float vref ; // input range 0 - 3.3V
Rhyme 0:2b9a6c5fcd52 193
Rhyme 0:2b9a6c5fcd52 194 extern uint16_t udata[2][NUM_MAX_ANALOG_CH][CHART_LEN] ;
Rhyme 0:2b9a6c5fcd52 195 extern int data_index ;
Rhyme 0:2b9a6c5fcd52 196 extern uint16_t bor[2] ; // begin of ring buffer
Rhyme 0:2b9a6c5fcd52 197
Rhyme 0:2b9a6c5fcd52 198 extern int numAnalogIn ;
Rhyme 0:2b9a6c5fcd52 199 extern int memLength ;
Rhyme 0:2b9a6c5fcd52 200 extern int us_interval ; // 20us = 50KHz
Rhyme 0:2b9a6c5fcd52 201 extern bool frame_full ;
Rhyme 0:2b9a6c5fcd52 202 extern int page ; //
Rhyme 0:2b9a6c5fcd52 203 extern int prev_page ;
Rhyme 0:2b9a6c5fcd52 204 extern int mode ;
Rhyme 0:2b9a6c5fcd52 205
Rhyme 0:2b9a6c5fcd52 206 float u2v(uint16_t uvalue) ;
Rhyme 0:2b9a6c5fcd52 207 uint16_t v2u(float voltage) ;
Rhyme 0:2b9a6c5fcd52 208 float u2f(uint16_t value) ;
Rhyme 0:2b9a6c5fcd52 209
Rhyme 0:2b9a6c5fcd52 210 void initADC(void) ;
Rhyme 0:2b9a6c5fcd52 211 void envChanged(void) ;
Rhyme 0:2b9a6c5fcd52 212 bool checkTrigger(void) ;
Rhyme 0:2b9a6c5fcd52 213 void sampleAD(void) ;
Rhyme 0:2b9a6c5fcd52 214 #endif /* _MAIN_H_ */