WiFi Slot и Espruino

Тема в разделе "ESP8266, ESP32", создана пользователем acos, 28 мар 2019.

  1. acos

    acos Официальный гик Администратор

    WiFi Slot из коробки прошит Espruino. Но хвалёные 8 каналов АЦП на нём не работали. Я тут пару дней потратил на то, чтобы победить АЦП, делюсь наработками.

    Код (Javascript):
    const SDA = D2;
    const SCL = D0;

    const PA0 = D3;
    const PA1 = D1;
    const PA2 = D16;
    const PA3 = D13;
    const PA4 = D5;
    const PA5 = D14;
    const PA6 = D4;
    const PA7 = D12;

    const analog_pin_to_mux_channel = new Uint8Array([
          0xff         // 0
        , 1         // 1
        , 0xff      // 2
        , 0         // 3
        , 6         // 4
        , 4         // 5
        , 0xff      // 6
        , 0xff      // 7
        , 0xff      // 8
        , 0xff      // 9
        , 0xff      // 10
        , 0xff      // 11
        , 7         // 12
        , 3         // 13
        , 5         // 14
        , 0xff      // 15
        , 2         // 16
        ]);

    var analog = {
        currentAin: 0,
        ainHW: 17,
        aInSelectorPin: 15,
        read: function(pin){
            if (pin >= this.ainHW) {
                return 0;
            }
            var ain = analog_pin_to_mux_channel[pin.getInfo().num];
            if (ain === 0xff) {
                return 0;
            }
            pinMode(pin, "input");
            var i;
            var a = this.aInSelectorPin;
            var arr = [];
            if (this.currentAin > ain) {
                for (i = 0; i < (8 - this.currentAin); ++i)
                {
                    arr.push(10);
                }
                this.currentAin = 0;
            }
            for (i = this.currentAin; i < ain; ++i)
            {
                arr.push(10);
            }
            shiftOut(D15, {repeat:5}, arr);
            this.currentAin = ain;
            return analogRead(A0);
        },
        reset: function(){
            pinMode(this.aInSelectorPin, "output");
            digitalPulse(this.aInSelectorPin,1,[1]);
            analog.currentAin = 0;
        }
    };

    E.on('init', function() {
        analog.reset();
    });

    ////USE ANALOG READ

    setInterval(function () {
        console.log(analog.read(PA6));
        console.log(analog.read(PA2));
        console.log(analog.read(PA4));
        console.log(analog.read(PA5));

    }, 500);
     
    С этим кодом АЦП заработал. Основная проблема была в том, что у меня не получалось достаточно быстро изменять состояние ножки D15, которая управляет мультиплексором АЦП. Если очень долго (~200 мкс) держать эту ногу в лог. 1, то мультиплексор сбрасывается на А0. Стандартный
    Код (Javascript):
    digitalWrite(D15, true);digitalWrite(D15, false);
    не успевал.
    В итоге справился магией.

    Код (Javascript):
    shiftOut(D15, {repeat:5}, [10]);
    - вот эта магия способна дать вот тот необходимый быстрый переход _/\_/\_ лог уровня. Магия в том, что 10 это 1010 в двоичной системе.

    Упд. В аттаче espruino v2.01 под WiFi Slot
     

    Вложения:

    NikitOS нравится это.
  2. parovoZZ

    parovoZZ Гуру

    Так в итоге скорость переключения каналов в мультиплексоре какая? AVR-кам похвастаться не чем - 1-1.5 мс всего лишь.