Пультоскоп на Arduino 27МГц!!!

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

Electronik83 пишет:
. И на столе стм32 с большим дисплеем и непонятными мыслями что со всем этим делать...

случайно не этот : STM32F429I-DISCO STM32F4 Discovery

я тоже на него долго вдуплял, в итоге отдал корешу, чбобы он из него что-то сделал,.. 

ArduinoFart
Offline
Зарегистрирован: 14.02.2017

Операционники не нужны ибо пультоскоп дальше звука не вылезает,если не использовать слишком входное и настроить lm358 на 1,1 то частоту до искажения мы получим 150 кГц,чем вам не чем?

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

Обновил папку https://drive.google.com/open?id=0B8Cen3bTAimVYWVOOEF5SzRHUWM документацией на проект.

Пара скриншотов для понятия что там внутри:

Если найдёте ошибки, мыльте мне сразу winstonn2017@gmail.com.

Версию проекта обозвал Ver. V1 . Остальные версии хардварэ-совместимые будут называться Ver. V1.xx.

Версии с новым хардварэ будут называться Ver. V2, Ver. V2.хх...

 

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

сопротивления для согласования с дисплеем можно не ставить. проверено. моя макетка пультоскопа (смотри пост#2399 и #2400) на   старом аккумуляторе   750 мА  с DC-DC UP до 5в   отработала  до выключения ( со включенной подсветкой !) 6 часов с дисплеем nokia 5110.

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Большое Спасибо, Winstonn !

Electronik83
Offline
Зарегистрирован: 06.12.2015

Winstonn пишет:

Electronik83 пишет:
. И на столе стм32 с большим дисплеем и непонятными мыслями что со всем этим делать...

случайно не этот : STM32F429I-DISCO STM32F4 Discovery

я тоже на него долго вдуплял, в итоге отдал корешу, чбобы он из него что-то сделал,.. 

Нет, у меня попроще... А Stm32F4 discovery - крутая плата, и проц лучше, чем у меня. Хотя...

Еще посмотрел на характеристики Arduino Due, аж слюнки потекли...

P.s. Воткнул дисплей от 3310 в макетку, пишу...... ждем новый скейтч.

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

для Winstonn

посмотрел твой код. ужас !!! 80% занимает формирование менюшек. поэтому у тебя места и не хватает. посмотри как это сделано у Elektronik83.

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

Stashevskiy68 пишет:

для Winstonn

посмотрел твой код. ужас !!! 80% занимает формирование менюшек. поэтому у тебя места и не хватает. посмотри как это сделано у Elektronik83.

с удовольствием! код у меня реально через Ж сделан, буду переучиваться

Nikolaj666
Nikolaj666 аватар
Offline
Зарегистрирован: 19.01.2017

блин, парни, я так его никогда не соберу. или придётся штуки 3 делать . 

satelit 2
Offline
Зарегистрирован: 04.12.2016

собрал девайс, теперб голову ломаю, показания скачут около 30кгц, на импульсы мультиметра 50 гц не реагируют. щуп не экранирован, кварц 16 родной. может кто ксинет скетч под 32 и ls020b. 

satelit 2
Offline
Зарегистрирован: 04.12.2016

собрал девайс, теперб голову ломаю, показания скачут около 30кгц, на импульсы мультиметра 50 гц не реагируют. щуп не экранирован, кварц 16мгц родной. может кто ксинет скетч под 32 и ls020b. 

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

для Winstonn

1.  в функции Frequency() вместо if применяй  switch case  она удобнее а главное быстрее раза в 3 работает.

2.в функции DDSSinus() для отрисовки синуса  и остальных форм сигнала можно использовать массивы для DDS генератора. напиши функцию которая будет в цикле со смещением по горизонтали выводить значения из массива формы(с маштабирование по высоте конечно) и получишь картинку.  функция будет  строк 10-15.  как параметры можно указать  где вывести  (X, Y, массив, кратность маштабирования)  и получится универсальная функция.

3. функции могут примнимать параметры и возвращать значения - не забывай об этом. очень упрощает програмирование .

я очень давно (лет 15) не программировал, сейчас  вспоминаю как это делал (скорее учусь  заново).  

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

для Stashevskiy68

я сел за программирование несколько недель назад, тоже с 15-ти летней паузой (в 2002-м году в зимнем семестре сдал С++ и никогда к нему не возвращался) .

По пункту 1 - ваще не знал, новое для меня утверждение, буду делать.

П.2 - так и хотел сделать, но завтыкал на вырисовывании точек на экране и тут понеслось,...

П.3 - с этой мыслью (именно так она и звучала у меня в голове) пытался воспользоваться функцией return, но что-то все время шло нетак.

Буду утюжить код Electronik83, уверен многому научусь, + твои советы. Спасибо. )

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

я вообще предлагаю делать законченные функции или комплекты функций  и выкладывать с описаниями работы и входных параметров . и каждый сможет выбрать для себя то что ему требуется от пультаскопа  и прикрутить требуемую функцию  к своему коду (сделать как конструктор).    и конечно оставлять "свои отпечатки" в описании функций чтобы форумчане могли в случае проблеммы обратиться с вопросами.  

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

для Stashevskiy68,

тоже нахожу эту мысль самой правильной, именно по такому принципу и надо работать. Можно договориться псать стандартные хэштэги в сообщении с релизом законченой функции, дабы его можно было потом найти на форуме. Страниц то тут уже больше пятидесяти и дело только начинается, люди новые поддтягиваются,.. я вот например )

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

для Winstonn

проблема в том что функции  связанные с выводом информации на дисплей, а это 50%,  должны быть заточены под КОНКРЕТНЫЙ  дисплей или используемую библиотеку.  я сейчас занят другим проектом с дисплеем от сименса с55 и использую библиотеку U8glib , класная библиотека, так пока разобрался как выводить на экран 100 потов сошло. 

Electronik83
Offline
Зарегистрирован: 06.12.2015

Ваще круто выходит, сам не ожидал:

// DDS генератор
const byte ddsWave[4][32] PROGMEM = { 1,6,15,29,48,69,92,117,143,168,191,212,229,243,251,255,254,248,237,222,203,181,156,131,106,81,59,39,22,10,3,1,
                                     1,18,35,52,69,86,103,120,137,154,171,188,205,222,239,255,239,223,207,191,175,159,143,127,111,95,79,63,47,31,15,1,
                                     1,9,17,25,33,41,49,57,65,73,81,89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,209,217,225,235,245,255,
                                     250,246,238,230,222,214,206,198,190,182,174,166,158,150,142,134,126,118,110,102,94,86,78,70,62,54,41,33,25,17,9,1};
void DdsGenerator() {
  const char * ddsStr[] = { "    Синус", " Треугольник", "    Пила", "Обратная пила"};
  byte ddsCount=0;
  // Рисуем DDS-генератор
  display.clearDisplay();
  for (byte i=0; i<84;) display.drawLine(i, 47-pgm_read_byte(&ddsWave[menu][i%32])/7, i, 47-pgm_read_byte(&ddsWave[menu][(i++)%32])/7, BLACK);
    display.setCursor(3, 0);  display.print(ddsStr[menu]);  display.display(); // отрисовали все
  // выводим выбранный сигнал, пока не нажали кнопку
  while(flag_key-digitalRead(key_ok)) pwmWrite(dds, pgm_read_byte(&ddsWave[menu][(ddsCount++)&0x1F]));
  if (++menu==4) menu = 0; // нажали кнопку - переключаем режим
  delay(200); // чтоб кнопки нормально нажимались
}
 
P.S. Скейтч скора будет... как обещал.
EDIT: Сделал еще меньше кода . Сверху строчка - название сигнала, ниже - отрисованная форма сигнала (как в осцилле). Переключается кнопкой ок.
Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

для Electronik83

дорисуй внутри  функции свой двухмерный массив с формами сигналов. пусть это будут локальные переменные . вызвал функцию - они загрузились в озу, вышел - место освободилось. а то они  когда обьявленны вне функции и видимы для всех  только зря занимают место в ОЗУ.  а так очень лаконично! молодец !

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

VetalST пишет:

Xumuk L2F50 не поддерживает 8 бит.

В ls020 можно переключать 8 или 16 бит.


у меня ls020, Вы как то просто говорили, что можете переделать под 8 бит, но потом как я понял вас долго не было и у вас сломался компьютер, поэтому и спрашиваю не делали ли)

Electronik83
Offline
Зарегистрирован: 06.12.2015

Формы не в озу а во флеши хранятся у меня!

man_200
Offline
Зарегистрирован: 29.04.2016

Синус, пила, треугольник, а меандр по умолчанию или забыл?

Electronik83
Offline
Зарегистрирован: 06.12.2015

Да.

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

Electronik83, какая у тебя максимальная частота на выходе DDS?

Electronik83
Offline
Зарегистрирован: 06.12.2015

Winstonn пишет:
Electronik83, какая у тебя максимальная частота на выходе DDS?

600 - 700 Гц.

Можно быстрее сделать, если отказаться от ардуиновской функции PwmWrite(...).

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

на счёт
delay(200); // чтоб кнопки нормально нажимались

от кварца к кварцу этот параметр требует корректировки. Думаю все такие delay переделать на переменные, пропорциональные overlock.

Electronik83
Offline
Зарегистрирован: 06.12.2015

Winstonn пишет:
на счёт delay(200); // чтоб кнопки нормально нажимались от кварца к кварцу этот параметр требует корректировки. Думаю все такие delay переделать на переменные, пропорциональные overlock.

Полностью согласен. Но я не испытвал еще ни разу на других кварцах.

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

Electronik83 пишет:

Winstonn пишет:
Electronik83, какая у тебя максимальная частота на выходе DDS?

600 - 700 Гц


забыл спросить про кварц..
Так 600 или 700 ? У меня на всех функциях на 16Мгц 599-600Гц, а на кварце 24Мгц - ровно в 1,5 раз больше 899-900Гц. Ведь количество точек в массиве одинаковое во всех функциях - 32.

Electronik83
Offline
Зарегистрирован: 06.12.2015

Для разных вариаций программы разная частота получается. Поточнее могу сказать вечером.

Попробывал сделать перезагрузку ардуины с двух кнопок + и - при одновременном нажатии. С генераторов и монитора порта нормально перезагружается. А с осцлла - выпадает в цветочек адафрута и все. Таймер гасил, прерывания вырубал. Как нормально сделать?

з.ы. моя подруга сказала, что 8 марта, вот и показывает цветок)))

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

загляни в мой код,... даже не знаю что у тебя пошло нетак,... странно. Обычно у меня на адафруте зависает когда кнопки резюками не подтянуты. Или ты без резюков с минусом на кнопках сидишь? ... странно всё равно.

Electronik83
Offline
Зарегистрирован: 06.12.2015

Заглянул. Косяк от автора:

    if (countX < 1000) {
      display.print(" ");
      display.print(countX);
      display.print("Hz");
    }
    if (countX > 1000) {
      float countXK = countX / 1000.0;
      display.print(countXK, 1);
      display.print("KHz");
    }

Получается что если частота будет равна 1000, то он не выведет её. Тут можно использовать else или в одном из условий =< или => сделать.

И вывод меню главного можно в четыре раза уменьшить код.

Не обязательно шпиговать код строчкой:

if (digitalRead(pravo) == HIGH && digitalRead(levo) == HIGH) {
    Reset_AVR(); // soft reset

достаточно прописать один раз , вот тут:

if (pultoskop == 1) {
    Generator();
  }
  if (pultoskop == 2) {
    DDSGenerator();
  }
  if (pultoskop == 3) {
    TTL();
  }
  if (digitalRead(pravo) == HIGH && digitalRead(levo) == HIGH) {
    Reset_AVR(); // soft reset
  }

По DDS-генератору:

1. Можно в четыре раза скратить вывод на экран по коду.

2. Картинки сигналов можно брать из массива, который мы кормим PwmWrite

EDIT: Насчет levo и pravo = Reset_avr немного не прав... из dds генератора не сбрасывается, если не опрашивать эти кнопки.

sakatgg
Offline
Зарегистрирован: 09.03.2017

Electronik83, вывод в терминале в Вашей прошивке как происходит? Допустим с uart роутера идет:



























U-Boot 1.1.3 Rev 0.5 by WErt(WErt) 4PDA (Feb  3 2017 - 11:50:53)

Board: Ralink APSoC DRAM: 32 MB
Ralink SPI flash driver, SPI clock: 15MHz
spi device id: ef 40 18 0 0 (40180000)
find flash: W25Q128FV
.*** Warning - bad CRC, using default environment

Собрал проект Минитерминал v.2.0 http://avrproject.ru/publ/miniterminal_v_2_0/1-1-0-157, но там обрезает что не уместилось в строке (отображается только 14 символов из строки) и не разберешь по отрывкам особо. В Вашей прошивке строка полностью отображается, перенос в следующую строку есть? Спасибо

Electronik83
Offline
Зарегистрирован: 06.12.2015

Терминал как у автора. Я отправлял много символов, ничего не режется. Все выводится, как есть. Хочу сделать ответ в ком порт... Сделаю скора. 

И еще под дисплей 5110 - много всяких глюков. Работаю над прошивкой / скейтчем.

Пока отладил только DDS-генератор. Изменение частоты в принципе не буду делать, т.к. не хочу максимальный предел в 800 Гц. Смешно. ИМХО.

Winstonn
Winstonn аватар
Offline
Зарегистрирован: 25.02.2017

Electronik83 пишет:

Заглянул. Косяк от автора:

    if (countX < 1000) {
      display.print(" ");
      display.print(countX);
      display.print("Hz");
    }
    if (countX > 1000) {
      float countXK = countX / 1000.0;
      display.print(countXK, 1);
      display.print("KHz");
    }

Получается что если частота будет равна 1000, то он не выведет её. Тут можно использовать else или в одном из условий =< или => сделать.

ДА! , только не "=>", а ">=" пришлось немного погуглить команды с++. Да и 1000Гц получится на 27+ кварце, у меня он  нормально не запустился, поэтому ошибку даже не увидел.

Electronik83 пишет:

И вывод меню главного можно в четыре раза уменьшить код.

уже подсмотрел как ты это сделал, сейчас буду плагиатить ! )

Electronik83 пишет:

Не обязательно шпиговать код строчкой:

if (digitalRead(pravo) == HIGH && digitalRead(levo) == HIGH) {
    Reset_AVR(); // soft reset

достаточно прописать один раз , вот тут:

if (pultoskop == 1) {
    Generator();
  }
  if (pultoskop == 2) {
    DDSGenerator();
  }
  if (pultoskop == 3) {
    TTL();
  }
  if (digitalRead(pravo) == HIGH && digitalRead(levo) == HIGH) {
    Reset_AVR(); // soft reset
  }

точняк! исправил! спасибо!

Electronik83 пишет:

По DDS-генератору:

1. Можно в четыре раза скратить вывод на экран по коду.

сейчас буду плагиатить

Electronik83 пишет:

2. Картинки сигналов можно брать из массива, который мы кормим PwmWrite

там коэфициенты считать, мороки ужас!,.. но делать придется,..

Electronik83 пишет:

EDIT: Насчет levo и pravo = Reset_avr немного не прав... из dds генератора не сбрасывается, если не опрашивать эти кнопки.

из главного меню DDS генератора levo+pravo=Reset работает, как и на остальных. Вход и выход в ПОДменю DDS делается с помощью OK, а levo+pravo=Reset в ПОДменю уже не работает, так задумано.

sakatgg
Offline
Зарегистрирован: 09.03.2017

Ответ в порт, это нужная функция, как реализован будет? Символы будут выбираться выбором курсора, кнопок дополнительные не нужно будет задействовать?

ssd1306 тоже имеется, даже на нем предпочтительнее. На ТТ его задействовал, работает от 5В (стабилизатор на 3.3В встроен, подвязка к + тоже), согласование уровней не надо делать.

Кстати ssd1306 есть с большей диагональю, если для кого размер маловат 

bulat943
Offline
Зарегистрирован: 19.09.2016

sakatgg пишет:

Собрал проект Минитерминал v.2.0 http://avrproject.ru/publ/miniterminal_v_2_0/1-1-0-157, но там обрезает что не уместилось в строке (отображается только 14 символов из строки) и не разберешь по отрывкам особо. В Вашей прошивке строка полностью отображается, перенос в следующую строку есть? Спасибо

там в программе максимальная принятая строка=14 (Dim S As String * 14  )  вот и режет,по сути надо увеличивать,максимум до 84,а потом раскладывать по строчкам

 

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

 а почему в каждом меню не сделать пункт "выход в Главное меню" и в осцилографе тоже- например буква "М" :)

 

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

для bulat943

а если сразу все записывать на SD .  а потом обрабатывай как хочешь. хоть на твоем терминале  хоть на PC .

bulat943
Offline
Зарегистрирован: 19.09.2016

там не мой проект,я исходник глянул и увидел,там вывод инфы на дисплей еще переделывать надо-как только упираемся в правое знакоместо чтоб след символ печатался со след строки слева(перенос)

 

Stashevskiy68
Offline
Зарегистрирован: 09.01.2017

для sakatgg

для формирования протокола ответа или запроса кнопками не обойдешся - пока наберешь они сотрутся ! тут надо энкодер прикручивать. самому такая функция позарез нужна. у меня штук 20 приборов работают по RS485  (на одной линии висят) и  отвечают по запросу и соответственно у каждого свой идентификатор на который он откликается. запросы  хранить в ЕЕпром.    короче это наверняка отдельный проект!

sakatgg
Offline
Зарегистрирован: 09.03.2017

На том сайте и продолжение проекта, с отправкой в порт, с помощью дисплея 2.8" 240x320 ILI9325 с сенсорной панелью.

 

Electronik83 пишет:
Мне приедет тестер, я поиграюсь с ним и возможно реализую.

Не войдет в 328, мне чтобы влезли хотелки  (uart, энкодер, замер кварцев, стабилитронов), пришлось отключить русский и отказаться от "extended tests T1 to T7", новым ревизиям всё больше места надо.  

Ежели ток урезать до миниума функционал.

Вообще-то надо свой ТТ глянуть на возможность перепрофилирования под сабж, модульная система, Pro Mini другую поставить :)

ArduinoFart
Offline
Зарегистрирован: 14.02.2017

Глубокоуважаемое сообщество Энтузиастов,намедни экскрементировал с 5В питание TL072 и она таки работает.Правда,пока только,в качестве повторителя,однако при использовании делителя замечательно прослеживаются обе полуволны синусоиды ( и зачем мудрить с двухполяркой).Отдельно хочу вставить своё сугубо отдельное мнение:чем мудрить с DDS не  лучше-ли прикрутить TDA 1543 через SPI ,а не возится с этим извращением,но повторяюсь,ИМХО.Я так понимаю,никто больше не заинтересован в развитии пультоскопа?.Если же и крутить к скопу что-то,то не лучше-ли закончить концепцию прибора мультиметром,например,всавить тестер стабилитронов,вольтметр,амметр наконец.

Пи.Си. в коде вычисления частоты автор использует метки переходов от меньшего к большему,что ведёт к неожиданным результатам частотопоказания на зашумлённых сигналах...

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

Поддерживаю направление с отдельным управляемым генераторным модулем DDS. Больше свободы в разных планах, модуль можно при желании основательно заэкранировать, он может быть также вообще отстыкуемый. У меня закуплен такой (не реклама):
http://www.ebay.com/itm/142217460111
вот и пока я не решил, к какой из найденных в Сети схем управления его прикрутить. А хорошо бы к Пультоскопу.

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

А я себе ваще на АД9851 заказал. :)

Juris
Juris аватар
Offline
Зарегистрирован: 28.10.2016

AD9851 модулья тоже собираюсь закупить, как минимум на ветке "STM-O-Scope" оно уже прицеплено в конструкцию (форум stm32diuno)

satelit 2
Offline
Зарегистрирован: 04.12.2016
void DDSGenerator(){
  if(ddsMenu==0) {
    DDSGeneratorMenu();    
    while(flag_key-digitalRead(key_up) && flag_key-digitalRead(key_down) && flag_key-digitalRead(key_ok))что то здесь напутано
{
      PWM=sinM[d];
      pwmWrite(dds,PWM);
      d++;
      if(d==32) d=0;
    }
    ddsMenu++;
    delay(200);
  }
(09.02.2017) Версия Пультоскопа от Electronik83
ок не подтверждается
bulat943
Offline
Зарегистрирован: 19.09.2016

Winstonn пишет:

Electronik83 пишет:

Не обязательно шпиговать код строчкой:

if (digitalRead(pravo) == HIGH && digitalRead(levo) == HIGH) {
    Reset_AVR(); // soft reset

достаточно прописать один раз , вот тут:

if (pultoskop == 1) {
    Generator();
  }
  if (pultoskop == 2) {
    DDSGenerator();
  }
  if (pultoskop == 3) {
    TTL();
  }
  if (digitalRead(pravo) == HIGH && digitalRead(levo) == HIGH) {
    Reset_AVR(); // soft reset
  }

точняк! исправил! спасибо!

у меня ошибка,ругается на reset_AVR(),arduino 1.0.6

Electronik83
Offline
Зарегистрирован: 06.12.2015

bulat943 пишет:

у меня ошибка,ругается на reset_AVR(),arduino 1.0.6

У меня тоже ругается, но я сделал свою функцию:

void (*Reset_AVR)(void) = 0; // объявляем функцию reset с адресом 0
 
Но у меня из осцилла не резетится - висит на адафрут цветке. Наверное из-за подключения кнопок на землю.
 
Electronik83
Offline
Зарегистрирован: 06.12.2015

satelit 2 пишет:
  

    while(flag_key-digitalRead(key_up) && flag_key-digitalRead(key_down) && flag_key-digitalRead(key_ok))что то здесь напутано
(09.02.2017) Версия Пультоскопа от Electronik83
У меня все работает, правда кнопки у меня без резюков и подключены просто к земле. И сделан автодетект кнопок (как у автора с резисторами и просто к земле).
Чувствую, что надо отказаться от этого всего. Много глюков поймал уже на этом....
 
А! И там не должно подтверждаться ничего! Просто навел на надпись и сигнал пошел! Я сто раз писал уже!
bulat943
Offline
Зарегистрирован: 19.09.2016

долго искал,спросил здесь и сазу нашел-сделал так

if (digitalRead(pravo) == LOW && digitalRead(levo) == LOW) {
      wdt_enable(WDTO_30MS); while(1);} // soft reset
в начале программы вставил 
#include <avr/wdt.h>
то есть запускаю собаку и пустой цикл,работает отлично!
Electronik83
Offline
Зарегистрирован: 06.12.2015

bulat943 пишет:

долго искал,спросил здесь и сазу нашел-сделал так

if (digitalRead(pravo) == LOW && digitalRead(levo) == LOW) {
      wdt_enable(WDTO_30MS); while(1);} // soft reset
в начале программы вставил 
#include <avr/wdt.h>
то есть запускаю собаку и пустой цикл,работает отлично!

Отличная идея! Только у меня не прокатило. Проц вроде как резетится и потом на собаке и висит. Надо как то отключать её в начале программы. Вставил в сетап wdt_disable() - все равно че то не то... И причем я нажимаю кнопку резет на ардуинушке и ничего не происходит.