Construire un mesureur de capacité avec ATmega8 : du schéma au prototype
Le microcontrôleur ATmega8 permet de réaliser un mesureur de capacité précis en utilisant la méthode de charge RC. L'appareil intègre un écran LCD I2C, un régulateur de tension LM7805 et des résistances commutables pour couvrir différentes plages de capacité. Le développement a été effectué dans EasyEDA pour la conception du circuit imprimé, Compass 3D pour l'encastrement, et Proteus pour la simulation.
La capacité C est définie par la formule C = Q/U, où la charge s'accumule de manière exponentielle. Le temps nécessaire pour atteindre 63,2 % de Ucc correspond à la constante de temps τ = R × C. L'algorithme suit ces étapes :
- Mettre le pin de décharge en "INPUT" pour éviter toute décharge.
- Enregistrer t0, le début de la charge.
- Activer le pin de charge en "OUTPUT" HIGH, surveiller l'ADC jusqu'à atteindre 63,2 % de Ucc.
- Calculer C = (t - t0) / R.
- Décharger via une résistance : mettre le pin de décharge en "INPUT", sortie LOW.
Un circuit RC avec résistances sélectionnables ajuste τ sur des plages de capacité allant des picofarads aux millifarads.
Conception du schéma et architecture du circuit
L'ATmega8 (DIP-28) doté d'un ADC 10 bits convertit Uc en code numérique. L'ALU calcule C à partir de τ. Des résistances SMD 0603 (1kΩ–1MΩ) forment le réseau RC. Une résistance de décharge limite le courant. Un écran LCD I2C 16×2 (SDA/SCL) réduit la consommation de broches GPIO. Alimentation : batterie 9 V → LM7805 → 5 V, filtrée par des condensateurs céramiques 0603 et électrolytiques 3216.
AREF/AVCC reliés à 5 V, Vcc/GND standards. Commutation automatique de plage via sorties numériques contrôlant les résistances.
Liste des composants clés :
- ATmega8-16PU
- LM7805
- LCD I2C 0x3F
- Résistances 0603 : 1k, 10k, 100k, 1M
- Condensateurs : 100nF×4, 10μF, 100μF
Conception du circuit imprimé dans EasyEDA
Dimensions du PCB : 30×38 mm. Largeur minimale des pistes b_min = I_max / (j_dop × t) = 0,254 mm (j_dop=50 A/mm², t=35 μm, I_max<0,1 A). Diamètre des trous d=1,2 mm pour les fils ≤1 mm. Surface S = S'/Kz, Kz=0,4.
Méthode soustractive : gravure du cuivre sur FR4. Disposition optimisée pour réduire la longueur du trajet du signal ADC et limiter le bruit. Masse est une plaque solide ; alimentation utilise des pistes larges. Vue 3D vérifie les espaces.
Calculs des paramètres du PCB :
- Surface : S' = ∑ surface des composants, Kz=0,3–0,6.
- Pistes : b_min basée sur le courant et la méthode de fabrication.
- Trou : d = d_element + |Δd| + r (r=0,1–0,4 mm).
- Espacements : ≥0,2 mm.
- Pads : diamètre 1,5–2×d.
Routage : circuits analogiques et numériques séparés ; masse sous l'ADC.
Boîtier et conception mécanique
Conçu dans Compass 3D : compartiment pour pile 9 V, bornes BNC pour Cx, découpe pour l'écran LCD, bouton d'alimentation. Épaisseur des parois : 2 mm, renforcées par nervures. La visualisation confirme l'ergonomie — accès facile aux composants de calibration.
Implémentation logicielle
Code C++ pour AVR-GCC. Initialisation de Wire et LiquidCrystal_I2C. Adresse LCD : 0x3F. Broches : charge PB0, décharge PB1, plage PB2–PB4, ADC PC0.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define LCD_ADDRESS 0x3F
#define LCD_COLS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLS, LCD_ROWS);
// Pins
const int CHARGE_PIN = 9; // PB1
const int DISCHARGE_PIN = 10; // PB2
const int ADC_PIN = A0; // PC0
void setup() {
lcd.init();
lcd.backlight();
pinMode(CHARGE_PIN, OUTPUT);
pinMode(DISCHARGE_PIN, OUTPUT);
digitalWrite(CHARGE_PIN, LOW);
digitalWrite(DISCHARGE_PIN, LOW);
// Initialisation ADC
ADMUX = (1<<REFS0); // Référence AVCC
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
}
float measureCapacitance(float R) {
// Décharge
digitalWrite(DISCHARGE_PIN, LOW);
delay(100);
// Charge
unsigned long t0 = millis();
digitalWrite(CHARGE_PIN, HIGH);
while (analogRead(ADC_PIN) < 645) {} // 63,2 % de 1023
unsigned long t1 = millis();
digitalWrite(CHARGE_PIN, LOW);
return (t1 - t0) / 1000.0 / R;
}
void loop() {
float C = measureCapacitance(10000.0); // R=10k
lcd.clear();
lcd.print("C = ");
lcd.print(C * 1e6, 1);
lcd.print(" uF");
delay(2000);
}
Interrogation de l'ADC toutes les 10 ms, protection contre dépassement de timer. Constantes de calibration stockées en EEPROM.
Points clés
- La méthode de charge RC offre une précision de ±5 % pour C = 1 nF à 100 μF.
- Le commutateur de résistances étend la plage sans sacrifier la résolution de l'ADC.
- L'écran LCD I2C économise les broches GPIO — idéal pour les systèmes embarqués.
- Le régulateur linéaire LM7805 est simple mais chauffe — acceptable pour les prototypes.
- Le PCB à deux couches avec vérification DRC dans EasyEDA évite les erreurs de routage.
— Editorial Team
Aucun commentaire pour le moment.