Check out my first novel, midnight's simulacra!

ESP8266

From dankwiki
Revision as of 07:12, 26 November 2022 by Dank (talk | contribs) (→‎PWM)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Pinout for the NodeMCU v1

A series of 32-bit microcontroller units from Espressif, followed by the ESP32. The first generation of the NodeMCU SoC was based around ESP8266.

Hardware

A Tensilica Diamond Standard 106Micro runs the Xtensa instruction set at 80MHz by default, and can be run at 160MHz. 32KB of code memory and 80KB of data are available to the user. There is no cache. IEEE 802.11 b/g/n support is available in AP, STA, and monitor modes.

GPIO

  • 17 bidirectional, non-inverting, tristate GPIO pins, with input and output buffer registers.
    • Pullup and pulldown resistors available on all pins
    • Pins can be set high-impedence
    • Edge- and level-triggered interrupts available on all pins

PWM

Four PWM channels on pins 10, 13, 9, and 16:

Pin name Pin number IO Function Name
MTDI 10 IO12 PWM0
MTDO 13 IO15 PWM1
MTMS 9 IO14 PWM2
GPIO4 16 IO4 PWM3

The minimum PWM resolution is 45ns (an approximate PWM clock of 22.72MHz), supporting 14 bits of PWM resolution at 1KHz. Active PWM prevents the system from entering Deep Sleep mode, and entering Light Sleep will disrupt PWM.

Unfortunately, the Espressif-provided PWM API only supports frequencies up to 1KHz. Libraries such as ESP8266_new_pwm can exceed these limitations. It ought be possible to achieve 7-bit PWM at the 25KHz required for pc fans.

ADC

There is only one (10-bit) ADC, and it reports values between [0, 1], not [0, 3.3]. This is not a scaling--the input voltage should not exceed 1V. The NodeMCU changes this significantly:

  • The NodeMCU applies a divider network to scale the 3.3V down to 1V. This usefully allows supplying 3.3V to the external device.
  • On the NodeMCU, this ADC can read the battery voltage instead of a connected external device. This is set in firmware.
  • If the ADC is left unconnected, VCC can be read using ESP.getVcc(). Before calling this function, ADC_MODE(ADC_TOUT) (for external voltage) or ADC_MODE(ADC_VCC) (for system voltage) must be called.

External links