Форум программистов, компьютерный форум, киберфорум
Наши страницы
Arduino
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
gav998
2 / 2 / 0
Регистрация: 20.09.2015
Сообщений: 5
1

Осциллограф на ардуино

05.11.2016, 22:56. Просмотров 4879. Ответов 9

Представляю Вашему вниманию простой осциллограф. Может интерфейс у него не очень, но главное что он работает. И Вы можете посмотреть изнутри.

Осциллограф на ардуино


Сделано в 2х программах

Ide arduino
и в processing
Код для прошивки МК arduino
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
byte head[3]={170,204,195};
byte MyBuff[800]; 
unsigned int i=0; 
 
void setup()   
{  
Serial.begin(115200);   
}   
void loop()   
{   
 
  for (i=0;  i < 800; i++)   
  {   
   MyBuff[i] = analogRead(0)/4;  
  } 
    Serial.write(head,3);
    Serial.write(MyBuff,800); 
}
код программы на компьютер для построения графика по точкам в Processing:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import processing.serial.*; 
Serial port; 
int x_size = 800;
int y_size = 800;
int dx,dy;
int k = 1000;
int data[] = new int[803];
int a = -1;
int b = -1;
boolean ok = false;
 
void setup() 
{ 
  size(800, 900); 
  textSize(14);
  dx=x_size/2;
  dy=y_size/2;
  strokeWeight(3);
  frameRate(10); 
  port = new Serial(this, "COM3", 115200); // !!! Здесь прописать свой COM-порт !!!
  line(dx,0,dx,x_size);
  line(0,dy,y_size,dy);
} 
 
void draw() 
{ 
  background(255); 
  stroke(0);
  line(dx,0,dx,x_size); //ось y
  line(0,dy,y_size,dy); //ось x
  for(int i = 0;i<=255;i+=51){
    line(dx-5,dy-i,dx+5,dy-i);
    line(dx-5,dy+i,dx+5,dy+i);
  }
  text("Масштаб: 1/"+k, 60, x_size+10);
  text("(a;s) +- 10;", 60, x_size+30);
  text("(z;x) +- 100;", 60, x_size+50);
  if (keyPressed){ 
    
     if (key == 'q') 
       k+=1;
     if (key == 'w') 
       k-=1;
     if (key == 'a') 
       k+=10;
     if (key == 's') 
       k-=10;
     if (key == 'z') 
       k+=100;
     if (key == 'x') 
       k-=100;
  }
  if (port.available()>0){
    data[0] = port.read();
    println(data[0]); //сверяемся
    data[1] = port.read();
    println(data[1]); //сверяемся
    data[2] = port.read();
    println(data[2]); //сверяемся
    if((data[0] == 170)&&(data[1] == 204)&&(data[2] == 195)){
      ok=true;
    }else{
      ok=false;
    }
    
    a = -1;
    b = -1;
    
    
    data[3] = port.read(); //реальные данные
    for(int i = 4; i<803; i++){
      data[i] = port.read();
      
      if((data[i-1]==0)&&(data[i]>0)&&(b==-1)){
        a = i; //начало 1ого импульса
      }
      if((data[i-1]>0)&&(data[i]==0)&&(a!=-1)){
        b = i; //конец 1ого импульса        
      }
 
    }
    
  } 
  grapf(a, b);
  port.clear();
}
 
void grapf(int a, int b){
  if(ok==true){//если данные верны, то строим
  stroke(255,0,0);
  //int w_impuls = b-a;
  if(a!=-1){
    for(int i=a;i<803;i++){
     point(i-a,dy-data[i]);
    }
  }else{
    for(int i=3;i<803;i++){
     point(i,dy-data[i]);
    }  
  }
  
    
  }  
}
Архив исходников для arduino и processingOscilloscope.zip

Идея взята с сайта {ссылка удалена}только у меня тот проект не заработал. Пришлось написать свой.
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2016, 22:56
Ответы с готовыми решениями:

Как проверить реле к ардуино без ардуино
Собственно вопрос в названии. Дело в том что реле пришло по почте раньше чем само ардуино. Так как...

ОСЦИЛЛОГРАФ C1-94
В общем предлагают сей прибор за 3000 руб. За неимением лучшего, очень даже хочется взять. Но...

Осциллограф
Помогите с выбором осциллографа. Есть два варианта 1) С1-55 с зипом, но плохо работает...

Осциллограф - самописец
Господа! Есть задача оцифровать сигнал: синусоида с частотой 15 МГц и амплитудой 20В. Но не просто...

Карманный осциллограф
Планирую в ближайшие будущие прикупить осцилограф к примеру такой:...

9
vxg
Модератор
3281 / 2077 / 328
Регистрация: 13.01.2012
Сообщений: 8,071
06.11.2016, 11:13 2
gav998, что то похожее можно увидеть тут Простейший осцилограф, записывающий сигнал 220 V AC какой кстати частоты фиксации данных вам удалось добиться?
0
gav998
2 / 2 / 0
Регистрация: 20.09.2015
Сообщений: 5
06.11.2016, 13:54  [ТС] 3
Удалось улучшить результат. Каждая точка это результат измерений АЦП arduino. Исходя из того, что частота ШИМ ардуино ~ 490 Гц, в первой версии программы на 1 импульс приходится 18 точек => частота считываний АЦП ~ 8800 Гц
Осциллограф на ардуино


Представляю вторую версию программы, код на arduino был украден с другого форума, но я увеличил скорость передачи данных до 999000 бит/c и поменял данные для своей программы
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//Для измерений используется вход А0
#include <CyberLib.h> 
uint8_t MyBuff[803];  
volatile uint16_t i=3; 
 
void setup()    
{   
   MyBuff[0]=180; 
   MyBuff[1]=105;
   MyBuff[2]=206; 
   UART_Init(999000); //чтоб наверняка
   ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS0);  
   ADMUX=(1<<ADLAR)|(1<<REFS0);       
}  
 
void loop(){} 
 
ISR(ADC_vect)  
{  
    MyBuff[i] = ADCH; 
    i++; 
 
  if(i==803)  
      { 
        UART_SendArray(MyBuff, sizeof(MyBuff));  
        i=3; 
      }    
}
Доработанная версия программы в processing:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import processing.serial.*; 
Serial port; 
int x_size = 800;
int y_size = 800;
int dx,dy;
int data[] = new int[803];
int a = -1;
int b = -1;
 
void setup() 
{ 
  size(800, 500); //нижняя часть графика все равно не используется
  textSize(6);
  dx=x_size/2;
  dy=y_size/2;
  strokeWeight(3);
  //frameRate(10); 
  port = new Serial(this, Serial.list()[0], 999000); //Немного универсальности
  //port = new Serial(this, "COM3", 999000); // !!! Здесь прописать свой COM-порт !!!
  //ардуино с такой скоростью вроде справляется)))
} 
 
void draw() 
{ //Внешний вид осей
  background(255); 
  stroke(0);
  line(dx,0,dx,x_size); //ось y
  line(0,dy,y_size,dy); //ось x
  for(int i = 0;i<=255;i+=51){ //разметка
    line(dx-5,dy-i,dx+5,dy-i);//вверх по y
    line(dx-5,dy+i,dx+5,dy+i);//вниз по y
  }
  strokeWeight(1);
  fill( 128, 0, 0 );
  for(int i = 0;i<=800;i+=10){ //разметка
    line(i,dy-5,i,dy+5);//по x
    text(i/10, i-3, dy+15);
  }
  for(int i = 0;i<=5;i+=1)
    text(i, dx + 10, dy - i*51 + 3); //цифры по y в вольтах
  strokeWeight(3);
  
  //Данные
  if (port.available()>0){
    data[0] = port.read();
    println(data[0]); //сверяемся
    data[1] = port.read();
    println(data[1]); //сверяемся
    data[2] = port.read();
    println(data[2]); //сверяемся
    
    if((data[0] == 180)&&(data[1] == 105)&&(data[2] == 206)){    
      a = -1;
      b = -1;
      
      data[3] = port.read(); //реальные данные
      for(int i = 4; i<803; i++){
        data[i] = port.read();
        
        if((data[i-1]==0)&&(data[i]>0)&&(b==-1)){
          a = i; //начало 1ого импульса
        }
        if((data[i-1]>0)&&(data[i]==0)&&(a!=-1)){
          b = i; //конец 1ого импульса        
        }  
      }
    }    
  } 
  grapf(a);//использую только начало импульса, масштабирования пока что нет(
  port.clear();
}
 
void grapf(int a){
  stroke(255,0,0);
  if(a!=-1){//если есть импульсы, то строим с начала 1ого импульса
    for(int i=a;i<803;i++){
     point(i-a,dy-data[i]);
    }
  }else{
    for(int i=3;i<803;i++){
     point(i,dy-data[i]);
    }  
  }      
}
Во второй версии программы на 1 импульс приходится 78 точек => частота считываний АЦП ~ 38220 Гц
Осциллограф на ардуино
1
stend
152 / 90 / 10
Регистрация: 02.04.2016
Сообщений: 306
06.11.2016, 14:25 4
999000 бит/c
ардуино с такой скоростью вроде справляется
во-первых - нестандарт со всеми вытекающики, во-вторых - не ардуино, а конкретный чип на плате модуля (у буратин конверторы USB/UART TTL все разные)/
0
vxg
Модератор
3281 / 2077 / 328
Регистрация: 13.01.2012
Сообщений: 8,071
06.11.2016, 16:13 5
Цитата Сообщение от gav998 Посмотреть сообщение
~ 8800 Гц
верю
Цитата Сообщение от gav998 Посмотреть сообщение
~ 38220 Гц
не верю
у меня частота уперлась в ~ 7000 при практически пустом цикле и отсутствии транспорта, беглое гугление показало что в моем случае двигаться дальше нет смысла так как АЦП не может делать выборку быстрее
что у вас за плата?
0
gav998
2 / 2 / 0
Регистрация: 20.09.2015
Сообщений: 5
06.11.2016, 16:23  [ТС] 6
В моих руках плата с али arduino nano v3
Все расчеты честно выполнены исходя из того, что частота ШИМ МК 490 Гц.
В первой версии программы средняя длина импульса 18 пикселей (1 пиксель = 1 измерению АЦП МК) 490 * 18 = 8820
Во второй версии программы средняя длина того же импульса 78 пикселей (1 пиксель = 1 измерению АЦП МК) 490 * 78 = 38220

Импульсы генерировал отдельным МК
0
vxg
Модератор
3281 / 2077 / 328
Регистрация: 13.01.2012
Сообщений: 8,071
06.11.2016, 17:41 7
gav998, вы пробовали визуально оценить ступенчатость данных например по синусоиде напряжения в розетке? не получится так что вы опросите ячейку в которой АЦП хранит данные 100 раз, но реально за это время АЦП обновит эти данные всего 1 раз?
не совсем понимаю при чем тут ШИМ с его 490 Гц, может я думаю о чем-то своем не разумея...
как вы накладывали импульсы? как настроены буферы портов и "часы" на ПК? почему просто не оценить частоту не по дополнительным импульсам и пикселям, а по количеству измерений пришедших в единицу времени?
0
dserp18
11 / 11 / 1
Регистрация: 20.01.2013
Сообщений: 136
Записей в блоге: 6
17.11.2016, 23:10 8
Processing дает возможность как работать с Arduino, так и создавать интерактивные Web приложения (в том числе игры) с помощью processing.js
0
dserp18
11 / 11 / 1
Регистрация: 20.01.2013
Сообщений: 136
Записей в блоге: 6
18.11.2016, 23:58 9
Можно подцепить потенциометр к аналоговым входам и сделать джойстик. Написать/скачать игру в Processing'e и подцепить в игре джойстик. Я написал в Processing'e арканоид и DoodleJump (переписал коды Pascal'я), чтобы посмотреть как работает джойстик.
0
dserp18
11 / 11 / 1
Регистрация: 20.01.2013
Сообщений: 136
Записей в блоге: 6
19.12.2016, 23:43 10
Вот переводы Татьяны Волковой, посвященные данной тематике http://www.slideshare.net/tanjavolko...ce=ssslideview http://robocraft.ru/blog/arduino/991.html
0
19.12.2016, 23:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2016, 23:43

Осциллограф DSO2250
Хочу преобрести осциллограф для ремонта мелокой електроники, моники , телеки итд + шаманства с МК...

Осциллограф С1-99 90г.в.
День добрый. На халяву достался осцилл С1-99. Со слов бывшего владельца в рабочем состоянии. Но...

осциллограф Н3015
осциллограф Н3015 предлагают всего за 500р. стоит брать за неимением лучшего? Что это за зверь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru