mesure-frequence.ino

GD32F103 (GigaDevice) — puce + cartes compatibles Blue Pill · Fichier : mesure-frequence.ino · Langage : Arduino · Usage : Mesurer une fréquence par interruption externe

Les GPIO du GD32 ont la matrice d'interruption : chaque front d'appel la routine, et compter sur une fenêtre de 1 s donne la fréquence. Le patron ISR-courte + copie verrouillée est celui de tous les compteurs.

Matériel requis

Une carte de développement GD32F103C8T6 (Cortex-M3 108 MHz, compatible broche à broche Blue Pill), alimentée en 3,3 V/5 V, avec un adaptateur ST-Link ou série. Un générateur de carré (sortie PWM d'une autre carte, capteur à effet Hall, codeur).

Branchement

Signal sur PA3 (3,3 V max !), masses communes. Le générateur peut être la broche PWM d'une autre carte via 1 kΩ.

Fonctionnement

attachInterrupt mappe PA3 sur EXTI3 ; l'ISR ne fait qu'incrémenter un volatile. noInterrupts/interrupts encadrent la lecture pour une copie cohérente du compteur 32 bits. Avec Arduino : installez le core « STM32F1 » (Roger Clark, gestionnaire de cartes) et choisissez la carte « GD32F103C » ; le LED utilisateur est PC13 (actif à LOW). En C : bibliothèque GD32F10x + ST-Link.

Pour aller plus loin

Un compteur d'impulsions d'eau/électricité (lente), ou un tachymètre avec deux fenêtres de durées différentes.

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);
}

← Retour à la fiche