Как загнать 10bit в SPI Iskra JS?

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

  1. Renat

    Renat Нерд

    Имеется одноканальный 8-bit цифровой потенциометр AD8400, для изменения значений сопротивления в него по SPI за раз необходимо загнать 10 бит, два бита адрес (для одноканальника -00) и восемь бит DATA . На форуме обсуждалась подобная тема для Ардуино и код был,
    void send(int data)
    {
    digitalWrite(CS, LOW);
    for (int i=0; i < 10; ++i)
    {
    digitalWrite(SCK, HIGH);
    digitalWrite(MOSI, bitRead(data, i));
    digitalWrite(SCK, LOW);
    }
    но как загнать 10 бит используя синтаксис JS я не понял. Может кто подскажет?
     
  2. sys

    sys Злобный Буратино Модератор

  3. Renat

    Renat Нерд

    Вопрос решен. Как я только не пробовал, ровно 10 bit передать не удалось , регулировка программным чип селектом непростая задача из-за задержки фазы, а использование побитовых операций меня тоже не привели к правильному результату. При обычном SPIn.send(data, nss) каждый байтик data это 8 бит и он не делится на отдельные биты (может я не докопался, кто знает путь скажет), в классе SPI в JS видимо стандарт. Изначально я переживал, что при передаче двух байтов, после первых двух бит 00 адреса, микруха начнет кушать данные сразу после адреса и покажет низкие (или высокие в случае передачи 1 байта) значения сопротивления RDAC. Передав два байта SPI2.send([0b0,data],B12) логический анализатор показал , что первые 6 бит цифровой потенциометр AD8400 проигнорировал, затем правильно считал последние два бита адреса и данные data из остальных 8 бит. В ходе эксперимента было выяснено что настройка SPI ОБЯЗАТЕЛЬНА! SPI2.setup({mosi:B15,sck:B13,baud:3200000}), иначе ничего не заработает.
    Ну и фотка. Например при значении data:111 сопротивление электронного потенциометра ...
    Цель всего этого- цифровая регулировка питающего напряжения BLDC (Gimbal) двигателя с PWM управлением (усиление крутящего момента при повышенных оборотах) при помощи повышающего преобразователя напряжения.
     

    Вложения:

    • 20161008.jpg
      20161008.jpg
      Размер файла:
      1 МБ
      Просмотров:
      573
  4. Renat

    Renat Нерд

    Кто знает скольки битный ШИМ у Iskra JS? Нигде не написано.
     
  5. sys

    sys Злобный Буратино Модератор

    16-bit
     
  6. Renat

    Renat Нерд

    16 бит.....:rolleyes: Ничего себе....Где можно поподробней почитать?
     
  7. sys

    sys Злобный Буратино Модератор

  8. Renat

    Renat Нерд

    Спасибо!!! Круто, все больше и больше Iskra JS нравится! Проверю на практике отпишусь что получилось.
     
  9. Renat

    Renat Нерд

    Есть команда уменьшения битности аппаратного или программного ШИМа? По умолчанию 16 бит конечно здорово, но оооочень медленно. 12 бит было бы достаточно.
     
  10. ostrov

    ostrov Гуру

    Это ШИМ от STM32, сами по себе камни интересные и перспективные хоть JS хоть C++ на них пиши. 16 бит аппаратно уменьшить нельзя, но можно программно.
     
  11. Renat

    Renat Нерд

    Какой синтаксис уменьшения битности программного ШИМа на JS? На Wiki нет инфы.
     
  12. ostrov

    ostrov Гуру

    map();
     
  13. Renat

    Renat Нерд

    Спасибо! Синтаксис будет такой?
    analogWrite(P7, 0.1, {freq: 32000, forceSoft: true, map(12)});
     
  14. Renat

    Renat Нерд

    И еще вопрос, микросекунды в setInterval можно выставить десятыми долями миллисекунды? Вопрос возник по причине того, что в ходе эксперимента (кручу BLDC двигатель расчитывая фазы программно или из массива по 1 градусу), при уменьшении времени callback функции менее 1 миллисекунды (setInterval(function () {....},1);) изменений скорости вращения не происходит. Вот думаю, либо я уже проц сильно нагрузил (примерно 7500 вычислений фаз используя синус в секунду с плавающей запятой, либо 360 значений из готового массива с расчитанными значениями фаз, за полный оборот двух независимых двигателей) , либо меньше миллисекунды никак? Я надеялся что смогу раскрутить двигатель быстрее чем на Arduino DUE, но пока не получается (программа (алгоритм) одна и та же, просто переделанная под JS).
     
  15. Renat

    Renat Нерд

    На заметку, микросекунды в setInterval получить нельзя. По стандарту, минимальная задержка составляет 4 мс.
     
    ИгорьК нравится это.