rev 14/04/2025

Test module INA226 (Mesure de courant) avec BASE 18F27K42

voir Details sur ce capteur I2C

1) Mesure de courant DC
2) Mesure de courant PWM sur charge résitive.
3) Mesure de courant PWM sur DC Moteur
4) Mesure I. Batterie (avec shunt 15A 150mV) et moteur DC en PWM




1) Mesure de courant délivré par une alim Linéaire DC (ou batterie)

Pour ce test , j'utilise ma Base 18F27K42
Alimentation 5V
Terminal YAT PC sur UART1 5C6 TXet RC7 RX , via un cordon prolific LTTL/USB
Pickit4 pour programmer le PIC
MPLABX IDE + XC8 compilateur

HARDWARE :

Prototype de test ;

../_INA226_Tests/images/t_Proto_PIC18F_Test_INA_226_2025-0224.gif ../_INA226_Tests/images/t_Schema_Montage_de_Test_INA226_avec_PIC18F27K42.gif
Prototype de Test Schema


Liaisons bus I2C1 RC3 (SCL) RC4 (SDA) vers INA226 et le LCD 4x20 .
Liaison sortie (Alarme) ALErte INA226 -> entree RB0 du PIC18F
Liaison ICSP <-> Pickit4
Liaison UART via cordon Prolific USB.TTL ... terminal PC YAT 115200bds
Alimentation du PIC et INA226 via converter DC/DC 9V---> 5V
La source de mesure de courant vient d'une alim externe DC ajustable de 5 à 12V
La sortie alim + , passe via un amperemetre DC (0 à 2Amps) ,
..puis sur l'entree +IN du module INA ..traverse le shunt ..ressort sur -IN
..passe dans l'ampoule .et .retour au 0V (- de l'alim )
Le module mesure la tension crée aux bornes du shunt ..pour en deduire la mesure de courant (I =U/ RShunt)
La tension de l'Alim est aussi mesurée entre le point -IN (Strap à mettre entre la pin -IN et la pin VBUS de l'INA226
et le 0V de l'alimentation, qui est relié au 0V de l'INA et du PIC18F
Le PIC18F recolte le contenu des registre INA226 , via le dialogue I2C
met les données en forme pour les afficher sur le LCD et aussi sur un Terminal PC
via la iaison Prolific UART TTL/USB
Liaison entre sortie RC2 et Buzzer ... signal 1000Hz delivré par module NCO1 PIC18F si la sortie ALE du INA226
reliée à l'entree Interrpt RBO, passe à 0. (ALE=0=Alarme)
La reponse ALErte est traité par interruption.. démarre le signal sonore immediat ..Allume led rouge RA4
La signal sonore stop en fin de boucle principale

Rem:
disabler NCO1 n'arrete pas le son ? j'ai du reprogrammer la sortie RC2 en entrée pour cela
et la reactiver en sortie en fin de boucle principale .

Affichage sur LCD ( avec AL =Alarme detectée )



affichage des regsitres INA226 :
INA226_BUS_REG 0x02 //Bus Voltage Register
INA226_SHUNT_REG 0x01 //Shunt Voltage Registere
INA226_BUS_REG
INA226_CURRENT_REG
Tension (mise à l'echelle unite physique)
Courant (mise à l'echelle unite physique)
Symbole AL si alarme en cours

SOFTWARE :

Init classiques
void Interrupt_Init(void) ............................... traitement Alarme
void __interrupt(irq(IRQ_INT0),high_priority) INT0_ISR(void)
void Hardware_Init(void);
void Init_I2C (void);
bool I2C1_DevicePresent(uint8_t Address);
void Test_Presence_I2C_devices();
LCD_init(); ...............................................// init LCD 4x20 I2C @0x27
void Affiche_LCD_Repos();

void INA226_Init_Config(void); .............// init module INA226 @0x40 et de ses 4 registres en ecriture + 6 en lectures
void NCO1_Init (void);.......................... // registre DDS gennerateur de frequence
#include "Dialogue_INA226_via_UART_2025-02.inc"
...interaction avec Terminal PC :


Init de L'INA266 (avec shunt 0,1 ohms)
Init des registres du INA226
INA226_Init_Config
Config INA226_CONF_REG,0x4127
Calibration register 05h <- 0x0D1B
Mask/Alert MASK_EN_REG register 06h <- 0x8001
Alert MASK_EN_REG register 07h <- 10.000 pour 250mA
Mesure de courant 14939 mA
Seuil d'alerte 0.250 Amperes
INA Manufactuer 0x5449
INA Identifiant 0x2260
Fin de parametrage INA226... OK


L'alarme est detectée par l'etat de la sortie ALErte INA226 ET AUSSI par la lecture du bit AFF dans le Mask Register.
L'init INA226 gere la calibration de mesure pour le Courant , la duree de moyennage ..etc..
Le Masque (INA226_MASK_EN_REG) gere l'affectation du type d'alarme vers la sortie ALErte
La Consigne de la valeur à surveiller est chargée dans INA226_ALERT_LIMIT_REG;
Dans la boucle de fond du programme, on relit les registres principaux
INA226_BUS_REG , INA226_SHUNT_REG , INA226_MASK_EN_REG , INA226_PWR_REG
et au passage on test le bit AFF du MASK ..si activé à 1, on allume la led Rouge
On affiche tout cela sur le terminal ...

exemple :
30 AFF=0 mvA=11583 mvU= 5884 7.414 V 0.290 A 2.234 W Seuil=0.300 A
31
AFF=1 mvA=11346 mvU= 5623 7.085 V 0.305 A 2.090 W Seuil=0.300 A
32 AFF=0 mvA=10793 mvU= 5038 6.348 V 0.270 A 1.781 W Seuil=0.300 A


et on rafraichit les données sur le LCD.
reste à definir :

voir tous les details dans le code XC8..

Que fait-on , ensuite,de cette alarme dépassement consigne courant ?
pistes:
coupure generale de l'alim ( equivalent à un disjoncteur) ?
limitation de courant .. si l'alim surveillée est commandée parun PWM PIC ou autre module PWM externe ?
on pourrait aussi surveiller la tension ..ex: minima batterie ?
...autres



Details Traitement Alarme

dans la main boucle :


if(AFF_Flag==1) LED_rouge=0;



Nota : la sortie ALErte est quasi immédiate (visuellement)
ALErte est au niveau 1 , SANS ALARME
Grace au dialogue operateur , possibilité de modifier en ligne, le seuil de declenchement Alarme.
La valeur du seuil est reactualisée et affichée sur le terminal.
Dans la cas présent,avec shunt de 0,1 ohms, gamme de mesure 0,819Amps ,
Saisir la valeur du seuil suivant le format : S=xxx (xxx= 3 digits !) avec xxx dans la limite de 100 à 819

Init de L'INA266 (avec shunt 0,1 ohms)
Init des registres du INA226
INA226_Init_Config
Config INA226_CONF_REG,0x4127
Calibration register 05h <- 0x0D1B
Mask/Alert MASK_EN_REG register 06h <- 0x8001
Alert MASK_EN_REG register 07h <- 10.000 pour 250mA
Mesure de courant 14939 mA
Seuil d'alerte 0.250 Amperes
INA Manufactuer 0x5449
INA Identifiant 0x2260
Fin de parametrage INA226... OK




Software : (MPLABX)
main_18F27K42_INA226_I2C_2025-0224.X.c
_18F27K42_INA226_I2C_LCD_UART_2025-0224.X.hex
_18F27K42_INA226_I2C_LCD_UART_2025-0222.X.zip



2) Mesure de courant PWM ( sur charge résitive)

Hardware :
Rajout d'un MOSFET canal N IRLZ14, inseré enserie avec la lampe, sur le retour alim 0V
,
Gate commandée par le signal PWM delivré par le PIC18F27K42 :
Sortie PWM5 PIC18F sur RC1
Affectation sortie RC1 au PWM5 ..via RC1PPS = 0x0D
RC2 reste affecté à la sortie NCO1 ..pour le Buzzer
RB0 en Entree pour le signal ALErte delivré par le module INA226
INA226 et LCD sur le bus I2C1

../_INA226_Tests/images/t_Test_INA226_PWM_sur_Ampoule_2025-0225.gif

Via le software , génération d'une rampe montante de commande valeur Ratio PMW5
Commande duty cycle ou Ratio sur 10 bits => 0 à 100% => 0 à 1023 par check mesures par interval de 32 pas
La mesure de courant INA226 est affichée sur le terminal pendant la rampe
Au franchissement du seuil d'ALErte, RB9 recoit le signal ALErte => génère une interrupt front descendant INTO RB0
qui affiche AL sur le terminal , génere un son 1000hz , arme une tempo avec timer4 de 1sec
Allume la led rouge sur RA3, ..son coupé en fin de tempo Timer4
Arrivé en fin de rampe UP (100%) , la commande s'inverse pour aller vers commande 0..
Pour eviter d'avoir de multiples alarmes pendant le franchissement de seuil .. car PWM= ON/OFF => franchissements de seil !
il faut MOYENNER la mesure : parametre AVERAGE dans la config INA passé de 4 à 64
et Augmenter le temps de convertion : initial de 1,1mS -> à 8,24 mS pour la mesure SHUNT
ce qui donne :


void INA226_Init_Config(void)


Rappel config. PWM5 :
Frequence ajustable via parametre CKPS du Timer2
// PWM5 500Hz avec CKPS=7 1/128
// PWM5 1000 avec CKPS=6 1/64
// PWM5 2000 avec CKPS=5 1/32

//
PWM5 4000 Hz avec CKPS=4--> 1/16



Alarme (NCO1) à 440Hz .

Dialogue operateur :
voir details dans #include "Dialogue_INA226_via_UART_2025-0227.inc"

* Possibilité de modifier le SEUIL via le terminal YAT 115200bds,
Commande S=xxx de 010 à 819 ( en mA)

* Possibilite de Modifier la Frequence PWM5 ,via la commande PW5=x
x etant la valeur de CKPS timer2 ( Clock Prescale Select)
Timer2, correspondance

CKPS diviseur Hz
7 128 500
6 64 1 Khz
5 32 2 Khz
4 16 4Khz
3 8 8 Khz
2 4 16 Khz
1 2 32 Khz
0 1 64Khz

Possibilité de modifier la valeur de Commande_Duty_PWM
via la commande CONS=xxxx avec xxxx de 0000 à 1023 pour 0 à 100%

* commande Help
Recu :Help

Help Commandes :
Seuil alarme courrant en mA S=010 à 819
Freq PWM5=x avec 1=32Khz ... 2=16Khz.. 3=8Khz ... 7=500Hz
Consigne_Duty_PWM : CONS=0001 à 1023
MODE Rampe : MOD=1 sinon MOD=0 =>usage de Consigne_Duty_PWM



SOFTWARE (Mplabx IDE XC8)

main_18F27K42_INA226_I2C_2025-0224.X.c
_18F27K42_INA226_I2C_LCD_UART_2025-0224.X.hex
_18F27K42_INA226_I2C_LCD_UART_2025-0222.X.zip





3) Mesure de courant PWM ( sur petit moteur DC)

Hardware :
Meme Hardware, mais remplacement ampoule 12V 5W par moteur 12V


Rajout commande (terminal YAT):
Mode Rampe validé par la commande MOD=1, => cycle UP : evolution Duty Cycle de 0 à 100 % en 32 pas..
and DOWN cycle de 100 % à 0 en 32 pas.
sinon on a MOD=0 => cde uniquement par la valeur de CONSigne Duty Cycle PWM

Rappel: par commande Help
Recu :Help

Help Commandes :
Seuil alarme courrant en mA S=010 à 819
Freq PWM5=x avec 1=32Khz ... 2=16Khz.. 3=8Khz ... 7=500Hz
Consigne_Duty_PWM : CONS=0001 à 1023
MODE Rampe : MOD=1 sinon MOD=0 =>usage de Consigne_Duty_PWM

test sur petit moteur DC
le moteur decolle à > 80mA puis I redescent à 56mA une fois lancé.
en frainant l'axe de sortie => alarme à 242mA (seuil à 250)

Problematique :
Quel sera le courant de demarrage ..decollage de la mecanique liée au moteur ?
par rapport au courant désigné comme Anormal via le Seuil Alerte ?
Tempo sur le seuil ?
seuil detecté sur plusieurs cycle boucle de fond ?
ou via un timer Temps enveloppe ?

mesures :




Execution (YAT terminal)

Presentation :
PIC18F27K42 + Test INA226 R100 I2C sensor
En Mode DC PWM 4Khz
Directory :C:\MPLABX_Projects\_18F27K42_INA226_I2C_LCD_UART_2025.X
Project : _18F27K42_I2C_LC_UART_2023
Source : main.c _2025-0227
Config Internal Fosc 64MHz
Test PWM5 10 bits->RC1pps Out-> MOSFET->Ampoule 12V 5w
Aiguillage sortie via RC1PPS= 0x0D RB0 in=ALErt , RA4=led, RC2PPS NCO1 out=Buzzer,UART RC6=TX,RC7=RX
Include: Dialogue_Operateur_PC_via_UART_2025-02.inc

Compile le Feb 27 2025 a 16:20:33 UTC
avec version XC8 : 2360

Init NCO1 à 1000Hz
Test Buzzer sur sortie RC2

Init_I2C() à 100Khz;
Test presence devices sur Bus I2C1
@ decimal # 78 soit @Device 7bits = 0X27 PCF8754 for LCD 2x16cars
@ decimal # 128 soit @Device 7bits = 0X40 INA226 Current sensor


ATTENTION : Adresse I2C LCD 4x20 definie dans :
LCD_4bits_I2C_2023-0810.h
via ligne #define LCD_ADDR 0xxx
0x27 avec Proto Base 18F27K42

adresse LCD= 39 soit 0X27

Sequence d'
Init LCD 4x20 via I2C1 PCF8574
.123456789OK
Affichage sur LCD 4x20
Chargement caracteres Speciaux set #1 en CGRAM

Init_Timer2() (associé à PWM5)
I
nit PWM5 10 bits (sur RC1) Freq= 8000 Hz
Mode Rampe=0
PWM5 Duty = 15 %

INA226_Init_Config
Config INA226_CONF_REG,0x43FF (was 0x4127 )
Calibration register 05h <- 0x0034
Mask/Alert MASK_EN_REG register 06h <- 0x8001
Alert MASK_EN_REG register 07h <- 10.000 pour 250mA
Mesure de courant 10 mA
Seuil d'alerte 0.250 Amperes
INA Manufactuer 0x5449
INA Identifiant 0x2260
Fin de parametrage INA226... OK

Boucle principale programme
Alarme via interruption : sortie ALERTE INA226 -> RB0 input
TMR4 initialise (1sec)
moteur à l'arret!
0 AFF=0 mvA= 393 mvU=12525 I= 10 mA 15.781 V 0.010 A 0.003 W Seuil=0.250 A

...etc..


SOFTWARE (Mplabx xc8)

main_18F27K42_INA226_I2C_2025-0227.X.c
_18F27K42_INA226_I2C_LCD_UART_2025-0227.X.hex
_18F27K42_INA226_I2C_LCD_UART_2025-0227.X.zip
INA226_Test_moteur_DC_a_vide_YAT-Log-20250227-1620.log




4) Mesure de courant DC avec INA226
sur Shunt externe 0,01 ohms


Hardware :

Le module INA226 est monté directement sur le shunt , via les 2 fils rigides 1mm²
qui le maintiennent en place et amenent l'info "Shunt Voltage"

Module INA226 sur le shunt 15Amps 150mV classe 0,5
liaisons :
alim +5V et Gnd,
Bus I2C1 : RC3 SCL et RC4 SDA,
sortie : ALERT sur inp RC0

../_INA226_Tests/images/t_INA229_sur_Shunt_150mV_15Amps.gif

Prototype de test :

../_INA226_Tests/images/t_Proto_test_INA226_shunt_15Amps_2025-0412.gif

Batterie 12V 7Ah alimentant
au travers d'un Ampermetre DC 0 à 2 Amps,
d'un Multimetre FI515X gamme 0 -10Amps
et d'un Shunt 0.01 ohm avec INA226 .. donc coté High End (point chaud)..
unecharge de 1 ou 2 ampoules 12V 5W .
Le 0V battery est relié au 0V PIC et INA226 pour la lecture de Vbus
Ve promier test est direct , en Courant continu (pur)

Calibration INA226



Resultas de mesures en DC pur :


Tres bonne concordance sur les 3mesures : Amperemetre,Multimetre et INA226.
A noter au passage la tension de batterie ..

----------------------------------------------------------------------------------------------------

TEST avec petit Moteur DC piloté en PWM
via PONT H complet IBT2

La batterie est remplacé par une alim reglable de 5V à 15V DC
La charge est remplacée par un petit moteur DC piloté en PWM via un Pont H Mosfet IBT2
une commande MARCHE pour valider le pont IBT2.
commande PWM1=xxxx 000 à 1000 pour 0% à 100%


Alim reglable 5 à 15V , charge =Moteur DC sur sortie module driver IBT2 PWM
PWM1=0 variation tension d'alim.
Nb= 2034 PWM1= 0 mvA= 3 mvU= 5547 6.93 V 0.001 A . 0.000 W Seuil=0.250
Nb= 2035 PWM1= 0 mvA= 2 mvU= 3989 4.99 V 0.001 A . 0.000 W Seuil=0.250
Nb= 2036 PWM1= 0 mvA= 4 mvU= 4739 5.92 V 0.001 A . 0.000 W Seuil=0.250
Nb= 2037 PWM1= 0 mvA= 7 mvU= 6480 8.10 V 0.002 A . 0.000 W Seuil=0.250
Nb= 2038 PWM1= 0 mvA= 10 mvU= 9306 11.63 V 0.003 A . 0.000 W Seuil=0.250
Nb= 2039 PWM1= 0 mvA= 5 mvU=11078 13.85 V 0.001 A . 0.000 W Seuil=0.250
Nb= 2040 PWM1= 0 mvA= 5 mvU=12579 15.72 V 0.001 A . 0.000 W Seuil=0.250
PWM1=0250
Nb= 2073 PWM1= 250 mvA= 88 mvU=12515 15.64 V 0.022 A . 0.000 W Seuil=0.250
Nb= 2074 PWM1= 250 mvA= 90 mvU=12517 15.65 V 0.023 A . 0.000 W Seuil=0.250
PWM1=0500
Recu :PWM1=0500
Saisie OK PWM1-RC2 500 49.0%
Nb= 2075 PWM1= 500 mvA= 175 mvU=12461 15.58 V 0.044 A . 0.001 W Seuil=0.250
Nb= 2076 PWM1= 500 mvA= 172 mvU=12472 15.59 V 0.043 A . 0.001 W Seuil=0.250
PWM1=0750
Recu :PWM1=0750
Saisie OK PWM1-RC2 750 73.5%
Nb= 2078 PWM1= 750 mvA= 245 mvU=12487 15.61 V 0.061 A . 0.001 W Seuil=0.250
Nb= 2079 PWM1= 750 mvA= 245 mvU=12489 15.61 V 0.061 A . 0.001 W Seuil=0.250
PWM1=1000
Recu :PWM1=1000
Saisie OK PWM1-RC2 1000 98.0%
Nb= 2081 PWM1= 1000 mvA= 321 mvU=12475 15.59 V 0.080 A . 0.001 W Seuil=0.250
Nb= 2082 PWM1= 1000 mvA= 315 mvU=12472 15.59 V 0.079 A . 0.001 W Seuil=0.250
PWM1=0000
Recu :PWM1=0000
Saisie OK PWM1-RC2 0 0.0%
Nb= 2088 PWM1= 0 mvA= 13 mvU=12575 15.72 V 0.003 A . 0.000 W Seuil=0.250

TEST ALERT (en mode pooling) !
via lecture registre INA
et blocage progressif de l'arbre moteur et augmentation PWM

Nb= 13 PWM1= 250 PWM2= 0 15.64 V 0.025 A . 0.391 W Seuil=0.600
Nb= 14 PWM1= 250 PWM2= 0 15.64 V 0.025 A . 0.395 W Seuil=0.600
Nb= 15 PWM1= 250 PWM2= 0 15.58 V 0.071 A . 1.098 W Seuil=0.600
Nb= 16 PWM1= 250 PWM2= 0 15.56 V 0.082 A . 1.280 W Seuil=0.600
Nb= 17 PWM1= 250 PWM2= 0 15.53 V 0.101 A . 1.561 W Seuil=0.600
Nb= 18 PWM1= 250 PWM2= 0 15.53 V 0.100 A . 1.557 W Seuil=0.600
Nb= 19 PWM1= 250 PWM2= 0 15.54 V 0.093 A . 1.449 W Seuil=0.600
PWM1=0750
Recu :PWM1=0750
Saisie OK PWM1-RC2 750 73.5%
Nb= 20 PWM1= 750 PWM2= 0
Alarm Over_current ..faire un reset ou Restart
11.76 V 0.474 A A 5.576 W Seuil=0.600
Nb= 21 PWM1= 0 PWM2= 0 15.66 V 0.002 A . 0.023 W Seuil=0.600
moteur à l'arret suite ALERT.




..a suivre

...Test ALERT via interruption RC0
....mesures INA dans interrupt Timer 100ms

Software :

Pack Project : 18F27K42_PMW_CCP1234_2025-0413.X.zip
main Source : main_2025-0413.X.c
chargeur : 18F27K42_PMW_CCP1234_2025-0413.X.hex





paulfjujo@free.fr