Удалось ли кому-нибудь получить два РАЗНЫХ сигнала на аналоговых выходах A4 и A5?

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем VGrishin, 22 сен 2016.

Метки:
  1. VGrishin

    VGrishin Нуб

    Проблема в том, что при подаче двух РАЗНЫХ сигналов на два DAC на их двух выходах присутствует ОДИНАКОВЫЙ сигнал. Вот как это получено

    Исходный код (скопирован по ссылке http://www.espruino.com/Waveform):
    Там идет пояснение: "You can even output synchronized waveforms on two outputs:"
    и сама программа:

    var w = new Waveform(128);
    var w2 = new Waveform(128);
    for (var i=0;i<128;i++) w.buffer = 128+Math.sin(i*Math.PI/64)*127;
    w2.buffer.set(w.buffer); // copy w's signal to w2

    analogWrite(A4, 0.5);
    analogWrite(A5, 0.5);
    var t = getTime()+0.01; // start in 10ms
    w.startOutput(A4, 4000, {repeat:true, time:t});
    w2.startOutput(A5, 4000, {repeat:true, time:t});

    На обоих выходах присутствует одинаковый сигнал. Правда не синусоида.
    А синусоида с сильным ограничением (!)...

    Мне нужно получить квадратурные сигналы, т.е. синус на одном выходе и косинус
    на другом выходе. Иными словами, сдвиг фазы между каналами должен быть 90 градусов.
    Модифицируем программу:

    var w = new Waveform(128);
    var w2 = new Waveform(128);
    for (var i=0;i<128;i++) w.buffer = 128+Math.sin(i*Math.PI/64)*127;
    for (var i=0;i<128;i++) w2.buffer = 128+Math.cos(i*Math.PI/64)*127;
    analogWrite(A4, 0.5);
    analogWrite(A5, 0.5);
    var t = getTime()+0.01; // start in 10ms
    w.startOutput(A4, 4000, {repeat:true, time:t});
    w2.startOutput(A5, 4000, {repeat:true, time:t});

    Получаем опять ограниченную синусоиду на обоих выходах. И сдвиг фаз между каналами - 0 градусов !
    (Погрешность измерения сдвига фаз по фигурам Лиссажу - 1-2 градуса.)
    И понимать это следует так: По-отдельности каналы работают нормально. Если задействованы оба DAC,
    то на выходе каждого из них присутствует СУММАРНЫЙ сигнал с обоих каналов....
    Продемонстрировать этот эффект можно еще и вот так:

    var w = new Waveform(128);
    var w2 = new Waveform(128);
    for (var i=0;i<128;i++) w.buffer = 128+Math.sin(i*Math.PI/64)*127;
    for (var i=0;i<128;i++) w2.buffer = -(128+Math.sin(i*Math.PI/64)*127);
    analogWrite(A4, 0.5);
    analogWrite(A5, 0.5);
    var t = getTime()+0.01; // start in 10ms
    w.startOutput(A4, 4000, {repeat:true, time:t});
    w2.startOutput(A5, 4000, {repeat:true, time:t});

    Здесь в массивы w и w2 записывается одна и та же синусоида, но с разным знаком.
    На каждом из выходов наблюдаем одинаковый разностный сигнал небольшой амплитуды
    (поскольку оба DAC имеют несколько различные параметры).

    Очень интересно знать, что же это такое: особенность процессора, глюк реализации JavaScript,
    или глюк Iskra JS? И можно ли с эти как-то бороться?
     
  2. Morgan

    Morgan Гик

    Добрый день!

    Потестил с осциллографом DAC. Разных сигналов добиться пока не смог, будем разбираться дальше.

    Помимо того:
    1. В этом коде ошибка:
    Код (Javascript):
    for (var i=0;i<128;i++) w.buffer = 128+Math.sin(i*Math.PI/64)*127;
    Необходимо итерироваться по массиву, т.е. указывать номер элемента массива при записи значения:
    Код (Javascript):
    for (var i=0;i<128;i++) w.buffer[i] = 128+Math.sin(i*Math.PI/64)*127;
    2. DAC всегда должен принимать положительные значения. Так работать не будет:
    Код (Javascript):
    for (var i=0;i<128;i++) w2.buffer[i] = -(128+Math.sin(i*Math.PI/64)*127);
    Перевернуть синусоиду можно, прибавив полпериода:
    Код (Javascript):
    for (var i=0;i<128;i++) w2.buffer[i] = 128+Math.sin(Math.PI/64*i + Math.PI)*127;
    3. Заметил, что DAC работает не от 0 до 3.3 Вольт, а в более узком диапазоне.
    Добиться гладкой синусоиды получилось при значениях от 80 до 180 в цифровом виде (8 бит).
    Итоговая формула для гладкого синуса выглядит так:
    Код (Javascript):
    w.buffer[i] = 130+Math.sin(i*Math.PI/64)*50;
    где 130 - среднее значение синуса (sin(Pi * n) = 0) соответствует 130 * 3.3 В / 255 = 1.68 Вольт, а 50 - амплитуда сигнала 50 * 3.3 В / 255 = 0.65 Вольт

    Спасибо за топик, будем разбираться в DAC!
     
    Последнее редактирование: 22 сен 2016
  3. VGrishin

    VGrishin Нуб

    Здравствуйте!

    Только сейчас обратил внимание, что при обычной вставке текста (ctrl+C - Ctrl+V) исчезают квадратные скобки :(. В исходном тексте они были... Как делать так, чтобы скобки не исчезали?

    Действительно, ошибка.
    Тем более загадочно, что реально получается разность сигналов!
    Возникает подозрение, что сигналы суммируются ПРОГРАММНО перед подачей на DAC.

    Да. Я еще пробовал подавать пилообразный сигнал на один DAC и синусоидальный сигнал на другой DAC.
    Они также суммировались.

    Я также обратил на это внимание. Правда, у меня диапазон, вроде, немного побольше.
    К сожалению, приходится использовать древний осциллограф С1-72, на котором точно измерить не получится.

    Есть еще один непонятный момент. По спецификации производителя микросхемы DAC 12-разрядный.
    Но Waveform 12-разрядного нет. Есть только 16-разрядный. Когда я сделал 16-разрядный массив,
    Cигнала вообще не было...

    Собственно, sin и cos мне нужны для подачи на шаговый двигатель (естественно, через достаточно мощный усилитель). Сначала я сделал генератор четырех фаз на 561 серии и подключил его к ШИМ - регулятору STK6722H (от матричного принтера Epson). Вибрации двигателя были совершенно неприемлемыми. Поэтому необходимо переходить на более "гладкие" сигналы.
     
  4. Morgan

    Morgan Гик

    Используйте функцию "код" в верхней панели при написании сообщения. Так соблюдаются синтаксические правила и удобнее читать.

    У меня пила и синус очень странно суммируются, как будто не складываются, а борются между собой кто сейчас будет выведен на DAC.

    Обратил внимание, но не тестил

    Границы определял приблизительно, возможны отклонения от значений 130 и 50.

    Попробуйте решить проблему микрошагами.
     
  5. VGrishin

    VGrishin Нуб

    Здравствуйте!

    Вид этой суммы действительно весьма своеобразный. Но после тщательного разглядывания становится
    понятным, что суммируется вроде правильно.

    Вообще говоря, предполагается использовать шаговый двигатель в режиме синхронного двигателя.
    Поэтому всякие ШИМ - регуляторы, призванные форсировать токи через фазные обмотки, не очень и нужны.
    ШИМ - регулятору STK6722H настолько древний, что этого просто не умеет :). Посмотрел какой-то более
    современный контроллер, так там требуется опорный сигнал в виде все той-же синусоиды :(, точнее,
    модуля синусоиды.

    Я тут провел эксперимент с использованием команды analogWrite. На выход A4 подаю отсчеты синуса, на выход A5 - отсчеты косинуса. Вот что получилось:
    Код (C++):
    function go() {
    for (var i=0;i<5000;i++)
    {
      analogWrite(A4, 0.0+0.5);
          analogWrite(A5, 1.0*0.49+0.5);
      analogWrite(A4, 0.309016994*0.49+0.5);
          analogWrite(A5, 0.951056516*0.49+0.5);
      analogWrite(A4, 0.587785252*0.49+0.5);
          analogWrite(A5, 0.809016994*0.49+0.5);
      analogWrite(A4, 0.809016994*0.49+0.5);
          analogWrite(A5, 0.587785252*0.49+0.5);
      analogWrite(A4, 0.951056516*0.49+0.5);
          analogWrite(A5, 0.309016994*0.49+0.5);
      analogWrite(A4, 1.0*0.49+0.5);
          analogWrite(A5, 0.0+0.5);
      analogWrite(A4, 0.951056516*0.49+0.5);
          analogWrite(A5, -0.309016994*0.49+0.5);
      analogWrite(A4, 0.809016994*0.49+0.5);
          analogWrite(A5, -0.587785252*0.49+0.5);
      analogWrite(A4, 0.587785252*0.49+0.5);
          analogWrite(A5, -0.809016994*0.49+0.5);
      analogWrite(A4, 0.309016994*0.49+0.5);
          analogWrite(A5, -0.951056516*0.49+0.5);
      analogWrite(A4, 0.0+0.5);
          analogWrite(A5, -1.0*0.49+0.5);
      analogWrite(A4, -0.309016994*0.49+0.5);
          analogWrite(A5, -0.951056516*0.49+0.5);
      analogWrite(A4, -0.587785252*0.49+0.5);
          analogWrite(A5, -0.809016994*0.49+0.5);
      analogWrite(A4, -0.809016994*0.49+0.5);
          analogWrite(A5, -0.587785252*0.49+0.5);
      analogWrite(A4, -0.951056516*0.49+0.5);
          analogWrite(A5, -0.309016994*0.49+0.5);
      analogWrite(A4, -1.0*0.49+0.5);
          analogWrite(A5, 0.0+0.5);
      analogWrite(A4, -0.951056516*0.49+0.5);
          analogWrite(A5, 0.309016994*0.49+0.5);
      analogWrite(A4, -0.809016994*0.49+0.5);
          analogWrite(A5, 0.587785252*0.49+0.5);
      analogWrite(A4, -0.587785252*0.49+0.5);
          analogWrite(A5, 0.809016994*0.49+0.5);
      analogWrite(A4, -0.309016994*0.49+0.5);
          analogWrite(A5, 0.951056516*0.49+0.5);
    }
    }
      setTimeout(go, 500);
    При этом получаются два сигнала, сдвинутые по фазе приблизительно на 90 градусов.
    Понятно, что сдвиг точным не будет, поскольку значения выводятся с некоторой задержкой.

    Из этого IMHO можно сделать два вывода:
    1. Процессор (контроллер) работает правильно.
    2. Плата смонтирована правильно (нет КЗ, нет непонятно как плавающей аналоговой земли и т.п.)

    Вероятно, проблема в реализации функции startOutput.
     
  6. VGrishin

    VGrishin Нуб

    Пришло письмо от пользователя Tomasina, но почему-то этого письма не видно в форуме:(
    .

    На плате против пинов A4 и A5 написано DAC. Т.е. digital-to-analog converter.
    На страничке http://wiki.amperka.ru/js:iskra_js указано ADC и DAC. Насколько я понимаю, по соответствующей команде функции вывода переключаются.
     
  7. ИгорьК

    ИгорьК Гуру

    Полагаю, Tomasina его удалил, поскольку сразу не заметил, что эта тема не про Ардуино.

    Конечно.
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    угу, все никак не могу привыкнуть иной идеологии IskraJS :oops:
     
  9. VGrishin

    VGrishin Нуб

    Здравствуйте!

    Вопрос.
    Программное обеспечение, которое загружено на Iskra JS, получено с http://www.espruino.com, или как-то дорабатывалось в Амперке?
    Это я к тому, что IMHO надо бы писать bug report....