Monitor de energía de precisión con pantalla y salida de datos


En este interesante proyecto de radiopench , utilizaremos un Arduino NANO, un medidor PZEM004T v3 y una pantalla OLED de 0.96 pulgadas , y dos pulsadores de operación, que son lo más pequeños posibles.

El esquema de conexiones podemos resumirlo del siguiente modo:

  • Pin 10 : select.
  • Pin 9 :enter.
  • Pin 11 Rx (conectado a Tx pin en el PZEM).
  • Pin 12 Tx (conectado a Rx pin en the PZEM).
  • Pin 4 a SDA de la pantalla amoled.
  • Pin5a SCL de la pantalla amoled.

En este blog se ha tratado en un articulo anterior el modulo medidor PZEM004T v3 (ver PZEM-004Tv3 del fabricante Peacefair
). Esta vez leeremos el resultado de la medición del Arduino pero además lo mostraremos en una pequeña pantalla amoled de 6 líneas. Además, como no es interesante solo mostrarlo, dejaremos que el resultado fluya hacia el puerto serial como un registro pues de esta manera podemos recibir datos en una PC, etc. y crear gráficos fácilmente.

Asimismo al incluir dos pulsadores podemos variar el periodo de muestreo o resetear los resultados.

En este esquema podemos ver más en detalle todas las conexiones (la fuente se puede suprimir en caso de que lo conectemos permanentemente a un ordenador vía USB)

Hay dos pulsadores de seleccionar e ingresar en la parte superior izquierda. El Arduino NANO (compatible) se puede reemplazar por cualquier variante de la familia Arduino (incluido el ESP32) y la pantalla OLED de 0.96 pulgadas no deberían costar demasiado

Descripción de la funcionalidad de la operación

La operación es simple y el resultado de la medición de potencia se muestra en el OLED a intervalos de 1 segundo. Además, el resultado de la medición se envía al puerto serie (salida de registro) en el intervalo especificado.

Vamos a ver el significado de cada línea mostrada en el panel amoled (el orden es el correspondiente a empezar desde la parte superior de la pantalla hacia abajo):

  • Línea 1: El valor de la potencia activa se muestra como un carácter con un cuadrado doble (unidad W). El borde derecho de la primera línea es el tiempo restante hasta la salida del registro. Cuando llega a 0, el registro se genera y, al mismo tiempo, el registro se muestra en la parte superior derecha de la pantalla.
  • Línea 2: Muestra los valores de tensión y corriente (unidades V, A). El valor es un valor efectivo
  • Línea 3: Mostrar el valor de la potencia aparente (unidad VA)
  • Línea 4: Mostrar la cantidad de electricidad (energy) (unidad: kWh)
  • Línea 5: Frecuencia (unidad Hz)
  • Línea 6: Muestra el valor del factor de potencia (unidad %), y además como un gráfico de barras.

Puede ser difícil de leer porque está lleno de información en una pantalla pequeña. Sin embargo, dado que la potencia activa más importante se muestra en letras grandes en la fila superior y el factor de potencia también se muestra en el gráfico de barras en la parte inferior, debería ser relativamente fácil de ver incluso desde la distancia.

Al restablecer mientras presiona el botón de configuración del ciclo de grabación, ingresará a la pantalla de configuración del ciclo de grabación. El período de medición se puede cambiar presionando el botón SELECT y se puede especificar como 1, 2, 5, 10, 30, 60, 120, 300 segundos. El valor se confirma presionando el botón Enter y se inicia el modo de medición normal. Además, el valor establecido se registra en la EEPROM, por lo que se recuerda incluso si la alimentación está apagada.

Al presionar el botón Enter durante la operación de restablecimiento de energía, el valor de potencia integrado (valor de kWh) se puede borrar a cero. Para indicar que se ha aceptado la operación del botón, la pantalla se apaga una vez .

Dado que se emite en formato CSV separado por comas, puede leerlo tal como está en Excel. Los datos son desde el principio hasta el segundo, en el siguiente orden: segundo, voltaje (V), corriente (A), potencia aparente (VA), potencia activa (W), factor de potencia, consumo de energía (kWh) y frecuencia (Hz).
Además, se inserta la coma inicial para aclarar el delimitador porque si se inserta una cadena de marca de tiempo en el software del terminal, se puede perder el límite con el segundo valor.

A continuación podemos ver el código completo para gestionar la pantalla , los dos pulsadores y el monitor PZEM.

/* AC power meter with text log
  Measuring instrument:PZEM-004T v3.0
  Display 0.96 inch OLED (SSD1306, 128x64)

   Pin 10 energy clear button
   Pin 11 Rx (Connects to the Tx pin on the PZEM)
   Pin 12 Tx (Connects to the Rx pin on the PZEM)
  
*/

#include <EEPROM.h>
#include <PZEM004Tv30.h>                     // PZEM004Tv3 library
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>                // 0.96inch OLED
#include <MsTimer2.h>

#define vCal 1.006                           // voltage calibration coefficient(dafault=1.0)
#define iCal 0.9205                          // current calibration coefficient(dafault=1.0)

#define entPin   9                           // enter button
#define selPin  10                           // select button
#define pzemRX  11                           // recieve data (connect to PZEM TX)
#define pzemTX  12                           // send data    (connect to PZEM RX)

Adafruit_SSD1306 oled(128, 64, &Wire, 4);    // OLED setup
PZEM004Tv30 pzem(pzemRX, pzemTX);            // Pin11 to TX, Pin12 to RX

unsigned int rangeTable[8] = {1, 2, 5, 10, 30, 60, 120, 300}; // time Inerval Table
int rangeNumber;
int timeToLog;                               // remaining time to output log

float Vx, Ax, VAx, Wx, kWhx, PFx, Hzx, VARx; // measured value
char buff[8];                                // character format buffer
unsigned int logInterval;                    // log interval
volatile boolean t2Flag = false;             // timing sync variable

void setup() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);    // set OLED I2C Address 0x3C or 0x3D
  Serial.begin(115200);
  pinMode(entPin, INPUT_PULLUP);             // enter button
  pinMode(selPin, INPUT_PULLUP);             // select button

  rangeNumber = EEPROM.read(0);
  if (rangeNumber > 7) {                     // abnormal range number will be
    rangeNumber = 0;                         // set to 0
  }
  logInterval = rangeTable[rangeNumber];

  oled.clearDisplay();
  oled.display();
  oled.setTextColor(WHITE);                  // write with white character

  if (digitalRead(entPin) == LOW) {
    recIntervalSet();
  }

  startScreen();                             // show start screen
  Serial.println();                          // start message
  Serial.println(F(" , PZEM-004V3 Power meter start V0.5"));
  Serial.println(F(" , sec, V(rms), I(rms), VA, W, PF, kWh, Hz"));
  Serial.flush();

  timeToLog = logInterval;                   // set interval
  measure();                                 // get value from PZEM-004Tv3
  logPrint();                                // data out serial port
  oledDisplay();                             // display data on OLED

  MsTimer2::set(1000, timer2IRQ);            // IRQ interval 1sec
  MsTimer2::start();
}

void loop() {
  if (digitalRead(selPin) == LOW) {          // if select button pushed during running
    resetKWh();                              // clear the energy value
  }
  while (t2Flag == false) {                  // wait MsTimer2 IRQ
  }
  t2Flag = false;

  measure();                                 // get value from PZEM-004Tv3
  timeToLog --;                              // decrement log timer
  oledDisplay();                             // display present data to OLED
  if (timeToLog == 0 ) {                     // if log interval time is up,
    logPrint();                              // output log data to serial port
    timeToLog = logInterval;                 // set value for next cycle
  }
}            // end of loop

void measure() {                             // read values from PZEM-004T v3
  Vx = vCal * pzem.voltage();                // voltage(apply calibration correction)
  Ax = iCal * pzem.current();                // current(apply calibration correction)
  VAx = Vx * Ax;                             // calculate apparent power
  Wx = vCal * iCal * pzem.power();           // effective power(Use the value after calibration correction)
  PFx = pzem.pf();                           // power factor
  kWhx = vCal * iCal * pzem.energy();        // sum of energy(Use the value after calibration correction)
  Hzx = pzem.frequency();                    // line frequency
}

void logPrint() {                               // serial out for log
  static long t = 0;
  Serial.print(F(" , "));                       // this for the separator for terminal software timestamp text
  Serial.print(t); Serial.print(F(", "));       // time in second
  Serial.print(Vx, 1); Serial.print(F(", "));   // voltage
  Serial.print(Ax, 3); Serial.print(F(", "));   // current amps
  Serial.print(VAx, 2); Serial.print(F(", "));  // VA value
  Serial.print(Wx, 1); Serial.print(F(", "));   // wattage
  Serial.print(PFx, 2); Serial.print(F(", "));  // powewr factor
  Serial.print(kWhx, 3); Serial.print(F(", ")); // totall energy
  Serial.print(Hzx, 1);                         // frequency
  Serial.println();
  t += logInterval;                             // increment accumurate time
}

void oledDisplay() {                                // display information on OLED
  oled.clearDisplay();                              // clear display buffer
  oled.setTextSize(2);                              // double size character

  dtostrf(Wx, 6, 1, buff);                          // format nnnn.n
  oled.setCursor(0, 0);
  oled.print(buff); oled.print(F("W"));             // display power value

  oled.setTextSize(1);                              // standerd size character
  oled.setCursor(110, 8);
  sprintf(buff, "%3d", timeToLog);                  // format decimal 3-digit
  oled.print(buff);                                 // remainig time display
  if (timeToLog == 0) {                             // if time up
    oled.setCursor(110, 0); oled.print(F("Log"));   // display "Log" at top right
  }

  dtostrf(Vx, 5, 1, buff); oled.setCursor(0, 16); oled.print(F("V:"));
  oled.print(buff); oled.print(F("V"));             // voltage nnn.n

  dtostrf(Ax, 6, 3, buff); oled.setCursor(56, 16); oled.print(F("I: "));
  oled.print(buff); oled.print(F("A"));             // amps nn.nnn

  dtostrf(VAx, 7, 2, buff); oled.setCursor(0, 26); oled.print(F("Pappa:"));
  oled.print(buff); oled.print(F(" VA"));           // volt amps nnnn.nn

  dtostrf(kWhx, 7, 3, buff); oled.setCursor(0, 36); oled.print("Energ");
  oled.print(buff); oled.print(F(" kWh"));          // watt hours nnn.nnn


  dtostrf(Hzx, 4, 1, buff); oled.setCursor(0, 46); oled.print(F("Freq :   "));
  oled.print(buff); oled.print(F(" Hz"));           // fequency nn.n

  dtostrf(PFx * 100.0, 3, 0, buff); oled.setCursor(0, 56); oled.print(F("PF:"));
  oled.print(buff); oled.print(F("% Y    Y    Y")); // power factor nnn
  oled.fillRect(50, 61, (60 * PFx) + 1, 3, WHITE);  // Power factor bar

  oled.display();                                   // actual display will be done at here
}

void recIntervalSet() {                             // Log interval time setting by button swith
  while (digitalRead(entPin) == LOW) {              // wait till the enter button is released
    oled.clearDisplay(); oled.setCursor(0, 0);
    oled.print(F("Log interval setting"));          // start message
    oled.display();
  }
  delay(30);

  while (digitalRead(entPin) == HIGH) {
    oled.clearDisplay();
    oled.setTextSize(2);                            // double size character
    oled.setCursor(0, 0);
    oled.println(F("Set Int."));                    // display set interaval value

    oled.setCursor(35, 30);
    oled.print(logInterval); oled.print(F("sec"));  // display the value
    oled.display();

    if (digitalRead(selPin) == LOW) {
      rangeNumber ++;                               // increment range number
      if (rangeNumber > 7) {                        // if beyond upper limit
        rangeNumber = 0;                            // circulate the number
      }
      logInterval = rangeTable[rangeNumber];        // set interval time from table
    }
    while (digitalRead(selPin) == LOW) {            // wait select botton relesed
    }
    delay(30);
  }

  EEPROM.write(0, rangeNumber);                     // save value to EEPROM
}

void startScreen() {                                // start message
  oled.clearDisplay(); oled.setTextSize(2);         // double size character
  oled.setCursor(0, 0);
  oled.println(F("PZEM-004T"));
  oled.println();
  oled.print(F("int.="));
  oled.print(logInterval); oled.print(F("s"));      // display log interval
  oled.display();
  delay(2000);
}

void resetKWh() {                   // clear accumulated energy value
  Serial.println(F("Reset kWh"));   // write message on the log
  pzem.resetEnergy();               // reset value
  oled.clearDisplay();              // erase disp. to show command accepted
  oled.display();
  delay(50);
}

void timer2IRQ() {                  // MsTimer2 IRQ
  t2Flag = true;                    // set flag for loop
}

Se ha omitido la descripción del programa, pues no hay nada complicado. Sin embargo, dado que el coeficiente de corrección se define a continuación y corrige el resultado de la medición de voltaje y corriente, es mejor ajustarlo para cada dispositivo.

Si no conoce el valor de corrección, está bien establecerlo en 1.0.

  • define vCal 1.006 // coeficiente de calibración de voltaje(dafault=1.0)
  • define iCal 0.9205 // coeficiente de calibración de corriente(dafault=1.0)

En el siguiente video podemos ver una demostración práctica del dispositivo:

Video del proyecto en inglés

Fuente :El diagrama de circuito y el código del programa están disponibles en el siguiente siguiente sitio escrito en japonés http://radiopench.blog96.fc2.com/blog-entry-995.html

Hablemos de la familia STM32


La familia STM32 de microcontroladores de 32 bits basada en el procesador Arm ® Cortex ® -M está diseñada para ofrecer nuevos grados de libertad a los usuarios de MCU. Ofrece productos que combinan un rendimiento muy alto, en tiempo real, procesamiento de señales digitales, operación de baja potencia/bajo voltaje y conectividad, al mismo tiempo que mantiene una integración total y facilidad de desarrollo.

La gama incomparable de microcontroladores STM32, basada en un núcleo estándar de la industria, viene con una amplia variedad de herramientas y software para respaldar el desarrollo de proyectos, lo que hace que esta familia de productos sea ideal tanto para proyectos pequeños como para plataformas de extremo un extremo.

En este cuadro podemos ver un resumen de todas sus varaintes:

Arm® Cortex®-M en pocas palabras

El grupo de núcleos de procesador Arm® Cortex®-M es una serie de núcleos optimizados para la eficiencia energética y el funcionamiento determinista. Se usa ampliamente en microcontroladores (MCU) y también se puede encontrar integrado en microprocesadores multinúcleo (MPU).

Desde el núcleo del microcontrolador Cortex®-M3 inicial y la introducción de variantes de núcleo optimizadas para bajo consumo , como Cortex®-M0 y luego Cortex®-M0+ , rendimiento , con Cortex®-M7 , tiempo real , con Cortex®- M4 o seguridad con el último Cortex®-M33 , la arquitectura Arm® Cortex®-M es la arquitectura estándar de facto para MCU de uso general de 32 bits. También ofrece una alternativa convincente a las arquitecturas MCU de 8 y 16 bits de propósito general.

Las principales ventajas de tener la arquitectura de perfil Arm® Cortex®-M estandarizada en esta familia de núcleos son:

  • para que los ingenieros transfieran fácilmente su código de una serie de MCU a la otra. Pueden elegir el equilibrio adecuado entre eficiencia energética, rendimiento informático, seguridad y variedad de periféricos para su sistema.
  • aprovechar un rico ecosistema de proveedores de silicio y de proveedores de herramientas de software y hardware
  • para acelerar la innovación en aplicaciones integradas

STMicroelectronics es uno de los primeros en adoptar los núcleos Arm® Cortex®-M y lidera el mercado con la cartera más grande de MCU Cortex®-M de 32 bits.

Ofrece a los ingenieros:

  • la opción de microcontroladores más flexible y escalable del mercado con más de 1000 números de pieza
  • la experiencia de diseño más integrada con un amplio ecosistema de herramientas y software MCU creado por ST y socios autorizados
  • 10 años de compromiso de longevidad de suministro

Desde su lanzamiento en 2007, STM han vendido más de 6 mil millones de microcontroladores basados ​​en Arm® Cortex®-M STM32 de 32 bits en todo el mundo.

El procesador central Arm® Cortex®-M3 de 32 bits está diseñado para un procesamiento en tiempo real de alto rendimiento en aplicaciones con costos limitados y puede manejar tareas complejas. Cualquier microcontrolador Arm® Cortex®-M3 ofrece alta escalabilidad combinada con un compromiso óptimo entre rendimiento y costo.

Características clave del núcleo Arm® Cortex®-M3

  • Arquitectura Armv7-M
  • Interfaz de bus 3x interfaz AMBA AHB-lite (arquitectura de bus de Harvard) Interfaz AMBA ATB para componentes de depuración de CoreSight
  • Compatibilidad con instrucciones de subconjunto Thumb/Thumb-2
  • tubería de 3 etapas
  • Controlador de interrupción vectorial anidado (NVIC)
  • 8 regiones MPU opcionales con subregiones y región de fondo
  • Instrucciones de procesamiento de campo de bits integradas y bandas de bits a nivel de bus
  • Interrupción no enmascarable + 1 a 240 interrupciones físicas con 8 a 256 niveles de prioridad
  • Controlador de interrupción de reactivación
  • Multiplicación de ciclo único de hardware (32×32), división de hardware (2-12 ciclos), soporte de ajuste saturado
  • Instrucciones WFI y WFE integradas y capacidad Sleep On Exit. Señal de sueño y sueño profundo, modo de retención opcional con kit de administración de energía del brazo
  • Puertos opcionales JTAG y Serial Wire Debug. Hasta 8 puntos de interrupción y 4 puntos de vigilancia
  • Instrucción opcional (ETM), seguimiento de datos (DWT) y seguimiento de instrumentación (ITM)

 

Diagrama de bloques de Arm Cortex-M3

Serie MCU Arm® Cortex®-M3 de última generación

Pequeña huella de pie

El tamaño reducido del núcleo permite que se use como un núcleo único en dispositivos pequeños o como un núcleo complementario incorporado adicional cuando se requiere un aislamiento de hardware específico o una partición de tareas. Gracias a los avances en las tecnologías de fabricación de silicio, el proceso de litografía pasó de 180 a 90 nm y menos, y el núcleo de silicio ahora alcanza los 0,03 mm² en litografía de 90 nm.

De manera similar a Cortex®-M0 y Cortex®-M0+ , el núcleo Cortex®-M3 tiene un bajo impacto en el equilibrio que se debe realizar entre los elementos típicos de una arquitectura MCU, basada en E/S, analógica y memorias no volátiles. Por lo tanto, el tamaño del bus (8, 16 o 32 bits) ya no es relevante al particionar carteras de MCU.

Los microcontroladores Cortex®-M3 se utilizan ampliamente y ofrecen varios beneficios :

  • Cumplen con los requisitos de rendimiento en aplicaciones de nivel de entrada.
  • También son adecuados para aplicaciones de propósito general.
  • La arquitectura de los procesadores Arm® Cortex®-M3 ofrece una alta escalabilidad y permite reutilizar los diseños existentes en diferentes proyectos.
  • Y, por lo tanto, le permite reducir los costos generales de propiedad y facilitar los pasos de desarrollo .

Consumo de energía dinámico de 10 a 150 µW/MHz

La potencia dinámica del núcleo oscila entre 10 y 150 µW/MHz según la tecnología utilizada. Sin embargo, el núcleo en sí no es representativo del consumo total de energía de un dispositivo y no es el único factor a tener en cuenta. Por lo tanto, es importante leer atentamente las fichas técnicas de los productos.

El conjunto de instrucciones Thumb es un subconjunto de la familia Cortex-M. Facilita la escalabilidad de la cartera mediante la reutilización de bloques de software validados para cualquier producto Cortex-M.

Unidad de protección de memoria (MPU)

La Unidad de Protección de Memoria (MPU) administra el acceso de la CPU a la memoria . Garantiza que una tarea no corrompa accidentalmente la memoria o los recursos utilizados por otras tareas activas. La MPU generalmente está controlada por un sistema operativo en tiempo real (RTOS).

Si un programa accede a una ubicación de memoria que está prohibida por la MPU, el RTOS puede detectarlo y tomar medidas. En un entorno RTOS, el kernel puede actualizar dinámicamente la configuración del área MPU, según el proceso que se ejecutará. La MPU es opcional y se puede omitir para aplicaciones que no la necesitan.

Microcontroladores basados ​​en Arm® Cortex®-M3

Serie de un solo núcleoVelocidad (MHz)Rendimiento (CoreMark)Destello (kB)RAM (kB)Fuente de alimentación (V)PaquetesConectividadCosa análoga
STM32L1329332 a 5124 a 801,65 a 3,6LQFP48/64/100/144, TBGA64, UFBGA100/132 UFQFPN48, WLCSP63/64/104USART, SPI, I2C, USB
STM32F124 a 7211716 a 10244 a 962 a 3.6LFBGA100/144, LQFP48/64/100/144, UFBGA100, TFBGA64, UFQFPN48, VFQFPN36, WLCSP64USART, SPI, I2C, PUEDE, USB
STM32F2120398128 a 102464 a 1281,8 a 3,6LQFP64/100/144/176, BGA176, WLCSP66USART, SPI, I2C, PUEDE, USB

Arm® Cortex®-M4 en pocas palabras

El núcleo del procesador Arm® Cortex®-M4 de 32 bits es el primer núcleo de la línea Cortex-M que cuenta con bloques de IP de procesamiento de señal digital (DSP) dedicados , incluida una unidad de punto flotante (FPU) opcional. Aborda aplicaciones de control de señales digitales que requieren capacidades de procesamiento de señales y control eficientes y fáciles de usar, como IoT, control de motores, administración de energía, audio integrado, automatización industrial y del hogar, aplicaciones de salud y bienestar.

Al igual que el núcleo Cortex-M3, el núcleo Cortex-M4 alcanza un rendimiento de subprocesos de 1,25 DMIPS/MHz y 3,42 CoreMark/MHz .

Características clave del núcleo Arm® Cortex®-M4

  • Arquitectura Armv7E-M
  • Interfaz de bus 3x interfaz AMBA AHB-lite (arquitectura de bus de Harvard) Interfaz AMBA ATB para componentes de depuración de CoreSight
  • Compatibilidad con instrucciones de subconjunto Thumb/Thumb-2
  • tubería de 3 etapas
  • Extensiones DSP: MAC de 16/32 bits de ciclo único, MAC dual de 16 bits de ciclo único, aritmética SIMD de 8/16 bits, División de hardware (2-12 ciclos)
  • Unidad de punto flotante (FPU) de precisión simple opcional, compatible con IEEE 754
  • 8 regiones MPU opcionales con subregiones y región de fondo
  • Instrucciones de procesamiento de campo de bits integradas y bandas de bits a nivel de bus
  • Interrupción no enmascarable y de 1 a 240 interrupciones físicas con 8 a 256 niveles de prioridad
  • Controlador de interrupción de reactivación
  • Instrucciones WFI y WFE integradas y capacidad Sleep-On-Exit, señales Sleep & Deep Sleep, modo de retención opcional con Arm Power Management Kit
  • Puertos opcionales JTAG y Serial Wire Debug. Hasta 8 puntos de interrupción y 4 puntos de vigilancia
  • Rastreo de instrucciones (ETM), rastreo de datos (DWT) y rastreo de instrumentación (ITM) opcionales

Diagrama de bloques de Arm Cortex-M4

Ventajas clave de los microcontroladores Arm® Cortex®-M4

Arquitectura Armv7E-M

Los microcontroladores basados ​​en el núcleo Cortex-M4 se benefician de la arquitectura Armv7E-M. La arquitectura Armv7E-M se basa en la arquitectura Armv7-M del núcleo Cortex-M3 y ofrece extensiones DSP adicionales , como:

  • Procesamiento de datos múltiples de instrucción única (SIMD)
  • instrucciones aritméticas de saturación
  • una amplia gama de instrucciones MAC que pueden ejecutarse en ciclos individuales
  • y una FPU opcional, que admite operaciones de punto flotante de precisión simple.

Esta arquitectura se adapta perfectamente a las aplicaciones de control en tiempo real que requieren operaciones altamente deterministas con ejecución de conteo de ciclos bajo, latencia de interrupción mínima, una canalización corta y la posibilidad de realizar operaciones sin caché.

Procesamiento de señales digitales

Los microcontroladores basados ​​en Cortex-M4 se basan en sus aceleradores de hardware DSP avanzados integrados para procesar señales mediante cálculos matemáticos . El acelerador de hardware DSP puede procesar cualquier señal analógica, como la señal de salida de un micrófono, la retroalimentación de un sensor integrado en un sistema de control de motores o las salidas de aplicaciones de fusión de sensores.

Gracias al procesamiento de señales digitales, se requieren menos ciclos para ejecutar algoritmos de bucle de control , lo que contribuye al rendimiento y la eficiencia energética de la aplicación. De hecho, cuando los algoritmos se procesan con formatos de datos Q1.15 o Float32, las MCU que se ejecutan en un Cortex-M4 ofrecen un rendimiento mucho mayor que las MCU basadas en Cortex-M3. Para el formato Q1.15, la mejora se debe principalmente a la disponibilidad de instrucciones SIMD , lo que permite que Cortex-M4 divida la cantidad de ciclos requeridos por aproximadamente dos. Para el formato de datos Float32, el acelerador de unidades de coma flotante aumenta el rendimiento de los MCU Cortex-M4 en un orden de magnitud, en comparación con el de los MCU Cortex-M3 .

Los MCU Cortex-M4 con DSP a veces son comercializados por fabricantes de MCU alternativos como MCU Cortex-M4F . Todos los MCU STM32 Cortex-M4 incorporan la opción DSP del núcleo Cortex-M4, y todos se denominan MCU Cortex-M4 .

Escalabilidad y eficiencia energética

Los microcontroladores Arm Cortex-M4 son compatibles con el estándar de interfaz de software de microcontrolador Cortex (CMSIS), lo que permite a los desarrolladores transferir su código hacia o desde diferentes microcontroladores para proyectos futuros. Esta interfaz también facilita la integración de software de terceros, lo que ayuda a reducir el tiempo de comercialización .

La flexibilidad y la escalabilidad de la arquitectura de Cortex-M4 permiten a los diseñadores ejecutar la mayoría de los algoritmos de aprendizaje automático recientes .

También es extremadamente eficiente desde el punto de vista energético . Por lo tanto, los microcontroladores Cortex-M4 son excelentes opciones para los controladores perimetrales de IoT o los nodos de sensores que funcionan con baterías, así como para los dispositivos portátiles de consumo.

El núcleo Cortex-M4 está integrado principalmente en MCU de un solo núcleo. Sin embargo, una nueva generación de microcontroladores y microprocesadores multinúcleo empuja los límites de la integración del sistema y la optimización del rendimiento, implementando casos de uso de partición de dos tareas :

  • El Cortex-M4 se puede utilizar como el núcleo de control principal , asociado con el núcleo Cortex-M0+ de mayor eficiencia energética, que puede ejecutar protocolos de radio de manera más eficiente.
  • El núcleo Cortex-M4 se puede utilizar como núcleo complementario de uso general y en tiempo real para la potencia informática de los núcleos Cortex-M7 o -A7 que procesan gráficos avanzados, algoritmos complejos de procesamiento de señales digitales o ejecutan el código abierto. Sistema operativo Linux y bibliotecas.

Microcontroladores basados ​​en Arm Cortex-M4

STMicroelectronics combina el núcleo Arm Cortex-M4 con su exclusiva propiedad intelectual de silicio de bajo consumo, tecnología de memoria integrada no volátil, aceleradores de hardware ( Cordic para cálculo trigonométrico e hiperbólico y FMAC para filtrado), arquitecturas de alto rendimiento y conectividad inalámbrica experiencia para ofrecer los MCU STM32 Arm Cortex-M4 como una solución a los muchos desafíos técnicos y comerciales que los ingenieros deben resolver.

Los microcontroladores STM32 Cortex-M4 están completamente integrados en el entorno de desarrollo STM32Cube y aprovechan las herramientas y soluciones que ofrece la extensa red de socios de ST.

Serie de microcontroladores Arm M4 de un solo núcleo

SerieVelocidad (MHz)Rendimiento (CoreMark)Destello (kB)RAM (kB)Fuente de alimentación (V)PaquetesConectividadCosa análoga
STM32F37224516 a 51216 a 801,8 a 3,6LQFP48/64/100, UFBGA100, UFQFPN32, WLCSP49/66/100USART, SPI, I2C, I2S, PUEDE, USB
STM32L48027364 a 102440 a 3201,7 a 3,6LQFP32/48/64/100/144, UFBGA64/100/132, UFQFPN32/48, WLCSP36/49/64/72/100USART, SPI, I2C, PUEDE, USB, chrom-ART
STM32L4+120409512 a 2048320 a 6401,7 a 3,6LQFP48/64/100/144, UFBGA132/169, UFQFPN48, WLCSP100USART, SPI, I2C, PUEDE, USB, TFT, MIPI DSI, Chrom-ART
STM32G417055032 a 512118 a 1281,7 a 3,6LQFP32/48/64/80/100/128, UFBGA64/100/121, UFQFPN32/48, WLCSP48/64/81USART, SPI, I2C, PUEDE, USBAnalógico rico
STM32F484 a 180hasta 61364 a 204832 a 3841,7 a 3,6LQFP48/64/100/144/176/208, BGA100/144/176/216, UFQFPN48, WLCSP36/49/81/90/143/168USART, SPI, I2C, CAN, Ethernet, USB, TFT, MIPI DSI, Chrom-ART

Serie de doble núcleo (inalámbrico) de microcontroladores Arm M4

Serie
(inalámbrica)
Velocidad de la corteza M4 (MHz)Procesador 2Destello (kB)RAM (kB)Fuente de alimentación (V)PaquetesConectividadConectividad inalámbrica
STM32WL548Cortex-M0+@48MHz64 a 25620 a 641,8 a 3,6UFBGA73, UFQFPN48USART, SPI, I2C150 a 960 MHz, LoRa, (G)FSK, (G)MSK, BPSK
STM32WB64Cortex-M0+@32MHz256 a 1024128 a 2561,71 a 3,6UFBGA129, UFQFPN48, VFQFPN68, WLCSP100USART, SPI, I2C, USB2,4 GHz, 802.15.4, BLE5.0, hilo/hilo abierto, Zigbee3.0

Serie de doble núcleo (alto rendimiento) de microcontroladores Arm M4

Serie
(Alto Rendimiento)
Velocidad de la corteza M4 (MHz)Procesador 2Destello (kB)RAM (kB)Fuente de alimentación (V)PaquetesConectividadCosa análoga
STM32H7240Cortex-M7@480MHz
+L1
1024 a 204810241,62 a 3,6UFBGA129/169, LQFP176/208, TFBGA240, WLCSP156USART, SPI, I2C, USB, TFT-LCD, MIPI-DSIAnalógico avanzado
STM32MP1209Doble Cortex-A7@800MHz
+L1+L2
GPU 3D
n / A7081,71 a 3,6LFBGA354/448, TFBGA257/361USART, SPI, I2C, USB HS
GbE
TFT-LCD, MIPI-DSI

Mas información en https://www-st-com