mesure-frequence.ino

GD32F103 (GigaDevice) — chip + placas compatibles Blue Pill · Archivo : mesure-frequence.ino · Lenguaje : Arduino · Uso : Mesurer une fréquence par interruption externe

Los GPIO del GD32 tienen la matriz de interrupción: cada flanco llama a la rutina, y contar en una ventana de 1 s da la frecuencia. El patrón ISR-corta + copia bloqueada es el plano de todo contador.

Hardware necesario

Una placa de desarrollo GD32F103C8T6 (Cortex-M3 a 108 MHz, compatible pin a pin con Blue Pill), alimentada a 3,3 V/5 V, con un adaptador ST-Link o serie. Un generador de cuadrada (salida PWM de otra placa, sensor de efecto Hall, codificador).

Cableado

Señal en PA3 (3,3 V máx!), masas comunes. El generador puede ser un pin PWM de otra placa por 1 kΩ.

Funcionamiento

attachInterrupt mapea PA3 a EXTI3; la ISR solo incrementa un volatile. noInterrupts/interrupts enmarcan la lectura para una copia coherente del contador de 32 bits. Con Arduino: instale el core « STM32F1 » (Roger Clark, gestor de placas) y elija la placa « GD32F103C »; el LED de usuario es PC13 (activo en LOW). En C: biblioteca de firmware GD32F10x + ST-Link.

Para ir más lejos

Un contador de impulsos de agua/electricidad (lento), o un tacómetro con dos ventanas de duraciones distintas.

mesure-frequence.ino

// Compteur de fronts sur PA3 (signal carre 1 Hz a 5 kHz) via attachInterrupt.
const int ENTREE = PA3;
volatile uint32_t fronts = 0;
unsigned long fenetre = 0;

void surFront() { fronts++; }        // ISR minimale

void setup() {
  Serial.begin(115200);
  pinMode(ENTREE, INPUT);
  attachInterrupt(digitalPinToInterrupt(ENTREE), surFront, RISING);
  fenetre = millis();
}

void loop() {
  if (millis() - fenetre >= 1000) {
    noInterrupts();
    uint32_t n = fronts; fronts = 0;      // copie atomique
    interrupts();
    fenetre = millis();
    Serial.printf("frequence = %lu Hz\n", (unsigned long)n);
  }
  delay(10);
}

← Volver a la ficha