Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

To display the center line correctly. #2

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions ESP32_Oscilloscope/ESP32_Oscilloscope.ino
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@
#include "filters.h"

//#define DEBUG_SERIAL
//#define DEBUG_BUFF
//#define DEBUG_BUF
#define DELAY 1000

// Width and height of sprite
#define WIDTH 240
#define HEIGHT 280

#define ADC_CHANNEL ADC1_CHANNEL_5 // GPIO33
#define ADC_CHANNEL ADC1_CHANNEL_3 // GPIO39
#define NUM_SAMPLES 1000 // number of samples
#define I2S_NUM (0)
#define BUFF_SIZE 50000
Expand All @@ -36,7 +36,7 @@ esp_adc_cal_characteristics_t adc_chars;
TaskHandle_t task_menu;
TaskHandle_t task_adc;

float v_div = 825;
float v_div = 550;
float s_div = 10;
float offset = 0;
float toffset = 0;
Expand All @@ -54,7 +54,7 @@ enum Option {
Stop,
Mode,
Single,
Clear,
Rate,
Reset,
Probe,
UpdateF,
Expand All @@ -63,6 +63,7 @@ enum Option {
};

int8_t volts_index = 0;
int8_t rate_index=0;

int8_t tscale_index = 0;

Expand All @@ -83,14 +84,15 @@ bool stop = false;
bool stop_change = false;

uint16_t i2s_buff[BUFF_SIZE];
//uint16_t *i2s_buff;

bool single_trigger = false;
bool data_trigger = false;

bool updating_screen = false;
bool new_data = false;
bool menu_action = false;
uint8_t digital_wave_option = 0; //0-auto | 1-analog | 2-digital data (SERIAL/SPI/I2C/etc)
uint8_t digital_wave_option = 1; //0-auto | 1-analog | 2-digital data (SERIAL/SPI/I2C/etc)
int btnok,btnpl,btnmn,btnbk;
void IRAM_ATTR btok()
{
Expand All @@ -111,7 +113,7 @@ void IRAM_ATTR btback()
void setup() {
Serial.begin(115200);

configure_i2s(1000000);
configure_i2s(RATE*1000);

setup_screen();

Expand All @@ -129,6 +131,7 @@ void setup() {
debug_buffer();
#endif


xTaskCreatePinnedToCore(
core0_task,
"menu_handle",
Expand Down Expand Up @@ -177,7 +180,11 @@ void core1_task( void * pvParameters ) {
(void) pvParameters;

for (;;) {
if (RATE<700) {set_sample_rate((RATE*1000)/2);}
else set_sample_rate((RATE*1000));

if (!single_trigger) {

while (updating_screen) {
vTaskDelay(pdMS_TO_TICKS(1));
}
Expand All @@ -197,6 +204,7 @@ void core1_task( void * pvParameters ) {
}
}
Serial.println("CORE1");
//Serial.print(i2s_buff[1],DEC);
vTaskDelay(pdMS_TO_TICKS(300));
}
else {
Expand Down
3 changes: 2 additions & 1 deletion ESP32_Oscilloscope/debug_routines.ino
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifdef DEBUG_BUF
void debug_buffer() {
ADC_Sampling();
Serial.println("debug");
ADC_Sampling(i2s_buff);
i2s_adc_disable(I2S_NUM_0);
delay(1000);
for (uint32_t i = 0; i < B_MULT * NUM_SAMPLES; i++) {
Expand Down
17 changes: 14 additions & 3 deletions ESP32_Oscilloscope/i2s.ino
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,34 @@ void configure_i2s(int rate) {
.dma_buf_len = NUM_SAMPLES, // number of samples
.use_apll = 0, // no Audio PLL
};

adc1_config_channel_atten(ADC_CHANNEL, ADC_ATTEN_11db);
adc1_config_width(ADC_WIDTH_12Bit);

i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);

i2s_set_adc_mode(ADC_UNIT_1, ADC_CHANNEL);
SET_PERI_REG_MASK(SYSCON_SARADC_CTRL2_REG, SYSCON_SARADC_SAR1_INV);
i2s_adc_enable(I2S_NUM_0);
}

//void ADC_Sampling(uint16_t *i2s_buff){
// for (int i = 0; i < B_MULT; i++) {
// //TODO i2s_read_bytes is deprecated, replace with new function
// i2s_read_bytes(I2S_NUM_0, (char*)&i2s_buff[i * NUM_SAMPLES], NUM_SAMPLES * sizeof(uint16_t), portMAX_DELAY);
// }
//}

void ADC_Sampling(uint16_t *i2s_buff){
size_t bytes_read;
for (int i = 0; i < B_MULT; i++) {
//TODO i2s_read_bytes is deprecated, replace with new function
i2s_read_bytes(I2S_NUM_0, (char*)&i2s_buff[i * NUM_SAMPLES], NUM_SAMPLES * sizeof(uint16_t), portMAX_DELAY);
i2s_read(I2S_NUM_0, (void*)&i2s_buff[i * NUM_SAMPLES], NUM_SAMPLES * sizeof(uint16_t), &bytes_read, portMAX_DELAY);
for(size_t ix = 0; ix < bytes_read/2; ix++) i2s_buff[(i * NUM_SAMPLES) + ix] &= 0x0FFF; // 16bit to 12bit conversion
}
}

void set_sample_rate(uint32_t rate) {
i2s_adc_disable(I2S_NUM_0);
i2s_driver_uninstall(I2S_NUM_0);
configure_i2s(rate);
}
54 changes: 41 additions & 13 deletions ESP32_Oscilloscope/options_handler.ino
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,19 @@ int voltage_division[6] = { //screen has 4 divisions, 31 pixels each (125 pixels
50
};

int rate_division[5] = {
1000,
750,
500,
200,
70
};

/*each sample represents 1us (1Msps),
thus, the time division is the number
of samples per screen division
/*каждая выборка представляет собой 1us (1 мбит/с),
таким образом, деление по времени - это количество
выборок на одно деление экрана
*/
float time_division[9] = { //screen has 4 divisions, 60 pixel each (240 pixel of width)
float time_division[13] = { //экран имеет 4 деления по 60 пикселей каждое (ширина 240 пикселей).
10,
25,
50,
Expand All @@ -21,14 +28,12 @@ float time_division[9] = { //screen has 4 divisions, 60 pixel each (240 pixel of
500,
1000,
2500,
5000
5000, //1Mhz 35ms of data (of 50ms possible)
10000, //100khz 70ms/500ms
25000, //100khz 175ms/500ms of data
50000, //100khz 350ms/500ms of data
100000 //50khz 700ms/1000ms of data
};
//, //1Mhz 35ms of data (of 50ms possible)
// 10000, //100khz 70ms/500ms
// 25000, //100khz 175ms/500ms of data
// 50000, //100khz 350ms/500ms of data
// 100000 //50khz 700ms/1000ms of data
//};

void menu_handler() {
button();
Expand Down Expand Up @@ -112,6 +117,25 @@ void button() {

break;

case Rate:
if (btnpl == 1) {
rate_index++;
if (rate_index >= sizeof(rate_division) / sizeof(*rate_division)) {
rate_index = 0;
}
btnpl = 0;
}
else if (btnmn == 1) {
rate_index--;
if (rate_index < 0) {
rate_index = sizeof(rate_division) / sizeof(*rate_division) - 1;
}
btnmn = 0;
}

RATE = rate_division[rate_index];
break;

default:
break;

Expand All @@ -127,7 +151,7 @@ void button() {
if (btnpl == 1)
{
opt++;
if (opt > Single)
if (opt > Rate)
{
opt = 1;
}
Expand All @@ -140,7 +164,7 @@ void button() {
opt--;
if (opt < 1)
{
opt = 9;
opt = 10;
}
Serial.print("option : ");
Serial.println(opt);
Expand Down Expand Up @@ -209,6 +233,10 @@ void button() {
current_filter = 0;
break;

case Rate:
set_value = true;
break;

default:
break;

Expand Down
73 changes: 39 additions & 34 deletions ESP32_Oscilloscope/screen.ino
Original file line number Diff line number Diff line change
Expand Up @@ -14,30 +14,14 @@ void setup_screen() {

int data[280] = {0};


float to_scale(float reading) {
float temp = WIDTH -
(
(
(
(float)((reading - 20480.0) / 4095.0)
+ (offset / 3.3)
)
* 3300 /
(v_div * 6)
)
)
* (WIDTH - 1)
- 1;
return temp;
float temp = WIDTH - (((ADC_LUT[(int)reading] / 4095.0) + (offset / 3.3)) * 3300 / (v_div * 6)) * (WIDTH - 1) - 1; return temp;
}

float to_voltage(float reading) {
return (reading - 20480.0) / 4095.0 * 3.3;
}
float to_voltage(float reading) { return ADC_LUT[(int)reading] / 4095.0 * 3.3; }

uint32_t from_voltage(float voltage) {
return uint32_t(voltage / 3.3 * 4095 + 20480.0);
}
uint32_t from_voltage(float voltage) { return ((uint32_t)(voltage / 3.3 * 4095)) ; }

void update_screen(uint16_t *i2s_buff, float sample_rate) {

Expand Down Expand Up @@ -153,7 +137,7 @@ void draw_sprite(float freq,
if (menu) {
spr.drawLine( 0, 120, 280, 120, TFT_WHITE); //center line
spr.fillRect(shift, 0, 102, 135, TFT_BLACK);
spr.drawRect(shift, 0, 102, 135, TFT_WHITE);
spr.drawRect(shift, 0, 102, 145, TFT_WHITE);
spr.fillRect(shift + 1, 3 + 10 * (opt - 1), 100, 11, TFT_RED);

spr.drawString("AUTOSCALE", shift + 5, 5);
Expand All @@ -165,20 +149,21 @@ void draw_sprite(float freq,
spr.drawString(str_stop, shift + 5, 65);
spr.drawString(wave_option, shift + 5, 75);
spr.drawString("Single " + String(single_trigger ? "ON" : "OFF"), shift + 5, 85);
spr.drawString("Rate " + String((uint16_t)RATE) + " kHz", shift + 5, 95);

spr.drawLine(shift, 103, shift + 100, 103, TFT_WHITE);
spr.drawLine(shift, 108, shift + 100, 108, TFT_WHITE);

spr.drawString("Vmax: " + String(max_v) + "V", shift + 5, 105);
spr.drawString("Vmin: " + String(min_v) + "V", shift + 5, 115);
spr.drawString(s_mean, shift + 5, 125);
spr.drawString("Vmax: " + String(max_v) + "V", shift + 5, 110);
spr.drawString("Vmin: " + String(min_v) + "V", shift + 5, 120);
spr.drawString(s_mean, shift + 5, 135);

shift -= 70;

//spr.fillRect(shift, 0, 70, 30, TFT_BLACK);
spr.drawRect(shift, 0, 70, 30, TFT_WHITE);
spr.drawString("P-P: " + String(max_v - min_v) + "V", shift + 5, 5);
spr.drawString(frequency, shift + 5, 15);
String offset_line = String((2.0 * v_div) / 1000.0 - offset) + "V";
String offset_line = String((3.0 * v_div) / 1000.0 - offset) + "V";
spr.drawString(offset_line, shift + 40, 59);

if (set_value) {
Expand All @@ -197,10 +182,11 @@ void draw_sprite(float freq,
spr.drawLine( 0, 120, 280, 120, TFT_WHITE); //center line
//spr.drawRect(shift + 10, 0, 280 - shift - 20, 30, TFT_WHITE);
spr.drawString("P-P: " + String(max_v - min_v) + "V", shift + 15, 5);
spr.drawString(frequency, shift + 15, 15);
spr.drawString(String(int(v_div)) + "mV/div", shift - 100, 5);
spr.drawString(String(int(s_div)) + "uS/div", shift - 100, 15);
String offset_line = String((2.0 * v_div) / 1000.0 - offset) + "V";
spr.drawString("Vmax: " + String(max_v) + "V", shift + 15, 15);
spr.drawString(frequency, shift + 15, 25);
spr.drawString(String(int(v_div)) + "mV/div", shift - 100, 15);
spr.drawString(String(int(s_div)) + "uS/div", shift - 100, 5);
String offset_line = String((3.0 * v_div) / 1000.0 - offset) + "V";
spr.drawString(offset_line, shift + 100, 112);
}

Expand Down Expand Up @@ -234,8 +220,23 @@ void draw_channel1(uint32_t trigger0, uint32_t trigger1, uint16_t *i2s_buff, flo
mean_filter mfilter(5);
mfilter.init(i2s_buff[trigger0]);
filter._value = i2s_buff[trigger0];
float data_per_pixel = (s_div / 40.0) / (sample_rate / 1000);

float data_per_pixel = (s_div / 40.0) / (1000/sample_rate);

//Serial.print(s_div);
//Serial.print('/');
//Serial.print(sample_rate);
//Serial.print('/');
//Serial.println(data_per_pixel);


//for (uint32_t i = 0; i < 500; i++) {
//for (int j = 0; j < 1; j++) {
// Serial.print(i);
// Serial.print('/');
// Serial.println(i2s_buff[i]);
//}
//}
//Serial.println('-----------------------------');
// uint32_t cursor = (trigger1-trigger0)/data_per_pixel;
// spr.drawLine(cursor, 0, cursor, 135, TFT_RED);

Expand All @@ -246,6 +247,9 @@ void draw_channel1(uint32_t trigger0, uint32_t trigger1, uint16_t *i2s_buff, flo
for (uint32_t i = 1; i < 280; i++) {
uint32_t index = trigger0 + (uint32_t)((i + 1) * data_per_pixel);
if (index < BUFF_SIZE) {
//Serial.print(index);
//Serial.print('/');
//Serial.println(i2s_buff[index]);
if (full_pix && s_div > 40 && current_filter == 0) {
uint32_t max_val = i2s_buff[old_index];
uint32_t min_val = i2s_buff[old_index];
Expand All @@ -257,7 +261,7 @@ void draw_channel1(uint32_t trigger0, uint32_t trigger1, uint16_t *i2s_buff, flo
min_val = i2s_buff[j];

}
spr.drawLine(i, to_scale(min_val), i, to_scale(max_val), TFT_BLUE);
spr.drawLine(i, to_scale(min_val), i, to_scale(max_val), TFT_MAGENTA);
}
else {
if (current_filter == 2)
Expand All @@ -267,7 +271,8 @@ void draw_channel1(uint32_t trigger0, uint32_t trigger1, uint16_t *i2s_buff, flo
else
n_data = to_scale(i2s_buff[index]);

spr.drawLine(i - 1, o_data, i, n_data, TFT_BLUE);
spr.drawLine(i - 1, o_data, i, n_data, TFT_MAGENTA);

o_data = n_data;
}

Expand Down