Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Tout ce qui n'a pas de catégorie !
Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3260
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#121 Message par paulfjujo » lun. 14 avr. 2025 19:29

Test INA226 sur un shunt 15A 150mV
detailsici
Test mesure en DC pur
Test mesure en PWM sur petit moteur DC Piloté via IBT2 pont MOSFET

INA229_sur_Shunt_150mV_15Amps.jpg


INA229_Cal_Shunt_10mOhm.jpg


valeur du seuil d'ALERT :

81.92 mV correspond à 8.192 Amps soit 32768 pts
2400 pts ou 0x960 <---- valeur du seuil pour 0,6A ( je n'ai qu'un PETIT MOTEUR !)
0.600 Amps

execution programme:
Init INA226 mesure de courant via I2C, shunt de 150mV pou 15Amps
Config INA226_CONF_REG,0x43FF (was 0x4127 )
Calibration register 05h (pour shunt 0,01 ohm et 8 Amps)
Mask/Alert MASK_EN_REG register 06h <- 0x8001
Alert MASK_EN_REG register 07h <- 2400 pour 0.6 A
Mesure de courant 0 mA
Seuil d'alerte 0.600 Amperes
INA Manufactuer 0x5449
INA Identifiant 0x2260
Fin de parametrage INA226... OK

1er test avec pooling du status INTERNE INA et bit ALERT

Du fait de la liaison (ceinture) directe Hardware entre sortie INA ALERT et DIS (driver), via des portes logiques
traiter l'etat RC0 (ALERT)via interruption perd de son interet
ou alors peut servir de bretelle si la ceinture ne marche pas ..
d'où le questionnement Traitement RC0 via pooling ou Interrupt
si par interrupt ..quelle action (reaction d'evenement ) associée ?

package XC8
18F27K42_PMW_CCP1234_2025-0413.X.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#122 Message par Babar64 » mer. 16 avr. 2025 18:25

Bonjour à tous,
Merci Paul pour ces essais instructifs et les fichiers MPLAB correspondants qui m'aident beaucoup.
paulfjujo a écrit :traiter l'état RC0 (ALERT)via interruption perd de son intérêt
Sauf que j'ai besoin de récupérer l'état Alert pour sa visualisation par led via le PIC.
Et puis, tu m'avais indiqué par ailleurs qu'il était judicieux de bloquer aussi les sorties PWM du PIC au basculement en Alert (bretelles...).
Raisons pour lesquelles je recoure à RC0, par interrupt (si je t'ai bien compris).

J'ai aussi cherché des avis sur d'autres forums, pour valider la conception de mon PCB projeté, mais n'ai pour l'instant pas encore de réponse (pour les fantaspiciens : voir le gerber joint à mon message précédent).
J'espère en obtenir et ainsi rapidement lancer sa fabrication sans appréhension. :sifflotte:

Comme JLCPCB exige une commande minimale de 5 pièces, que ceux que ce projet intéresse me le fasse savoir et je leur en adresserai un avec plaisir.

A suivre...
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3260
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#123 Message par paulfjujo » ven. 18 avr. 2025 19:47

Bonjour Henri,

1 pierre à rajouter :


RC0 relié à ALERT INA226
Declenche l'interruption RC0
un demarrage à fond PWM=100% declenche d'office l'ALERT (meme moteur à vide!)
par contre reste OK avec PWM=75% ,car en dessous de 0,6A
la reaction est quasi immediate.

19:05:33.049) Recu :PWM1=1000
(19:05:33.049) Saisie OK PWM1-RC2 1000 98.0%
(19:05:33.102) *ALERT<CR>NbB= 1657 Cpt6=10071 PWM1= 0 PWM2= 0 15.61 V 0.018 A . Seuil=0.600
...53mS ( et sans deduire le delai d'ecriture sur terminal!)

on a quand meme peut etre besoin de tester le STATUS de l'INA #1 ou INA #2
pour differencier quel Battant déclenche l'ALERT quand les mouvements des battants sont simultanés.
mais il faudra sans doute arreter les 2 mouvements en meme tremps ...(les 4 PMW)

mon proto n'a qu'un seul INA et 1 seul moteur...

Code : Tout sélectionner


void __interrupt
(irq(IRQ_IOC),high_priority) IOC_ISR(void)
{
 
  unsigned char i
;
  const char *p2="ALERT\r\n"; 
  U1TXB 
='*';__delay_ms(2);
  if ( (IOCCF & 0x01)==1)  // RC0
  {  
    for 
(i=0; i<6; i++) 
    
{
     while (!U1TXIF) { };
     U1TXB = *(p2+i);
     }
    Led_Rouge=0;  // allume led
    k1_PWM=0;
    k2_PWM=0;
    PWM1_LoadDutyValue(k1_PWM); // plus de cde PWM sur le PONT H
    PWM2_LoadDutyValue(k2_PWM);
    }  
 IOCCF 
= 0x00; 
 
}
 


il ne faut pas utiliser la mémorisation de l'ALERT dans l'INA

extrait de l'init INA226

Code : Tout sélectionner

    CPrint(" Mask/Alert  MASK_EN_REG register 06h <- 0x8001\r\n");
        // 0x00D1B
        tmp[0]=INA226_MASK_EN_REG;
        tmp[1]=0x80;
        tmp[2]=0x00;  // avec latch_EN=1   il faut couper l'alim INA pour RAZER le defaut
        Addr=INA226_ADDR;
        p1=&tmp[0];
        cx=3;
        I2C1_WriteNBytes(Addr, p1, cx);
 
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#124 Message par Babar64 » sam. 19 avr. 2025 17:52

Bonjour Paul, bonjour à tous,
paulfjujo a écrit :Source du message un démarrage à fond PWM=100% déclenche d'office l'ALERT
Je m'en doutais : raison pour laquelle j'ai prévu un démarrage des mouvements en vitesse lente (réglable) sur les 5 premiers degrés de la rotation.

paulfjujo a écrit :Source du message il ne faut pas utiliser la mémorisation de l'ALERT dans l'INA
Comme je l'avais indiqué :
Je n'utilise pas le latch propre à l'INA (paramètre LEN=0). J'ai préféré recourir à des portes logiques (CD4001) pour exploiter un Reset hard sur carte via SW3.
Le paramètre LEN (latch Enable) des INA doit bien sûr être laissé à 0.

paulfjujo a écrit :Source du message différencier quel Battant déclenche l'ALERT (...) il faudra sans doute arrêter les 2 mouvements en même temps ...(les 4 PMW)
Je n'ai pas prévu une telle différenciation dans la mesure où j'ai opté pour LEN=0 aux INA et une gestion globale hard par CD4093.
En revanche les 2 moteurs seront bien bloqués par la sortie de la porte U12C, complétée selon tes conseils par les 4 PWM à 0, via l'état bas fourni en entrée RC0 du Pic par l'une des sorties Alert des INA (Alert_inPC0).

Je suis toujours sur la bonne structuration des conditionnalités qui me donne du fil à retordre...

Merci encore.
A suivre...
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#125 Message par Babar64 » mer. 7 mai 2025 20:36

Bonsoir à tous,

Je dois me rendre à l'évidence, je patauge pas mal, mais à défaut du Grand Bain j'arrive au moins au pédiluve. :sifflotte:

Comme je veux tout avoir sous la main, j'ai regroupé tous mes critères dans le (gros) fichier docx joint.
Pour aller dans le vif du sujet (les conditionnalités), rendez-vous en fin de page 12 et suivantes (lignes numérotées).
Je ne voudrais pas inquiéter, mais c'est dense, et probablement trop, mais ça devrait permettre de bien cerner l'ampleur du bousin... et de mes erreurs : il y a du taff!

Bon, certes, ça n'est quand même pas du niveau d'une CNC, mais pour moi, plus j'avance et moins j'en vois le bout :mur:

Merci de votre compassion et surtout de votre aide patiente...

Carte_Portail_2_Vantaux_24v_H-en-MOSFET_INA226-HIP4082_FQP30N06L (V7.0.2).docx

A suivre...
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3260
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#126 Message par paulfjujo » sam. 10 mai 2025 17:22

bonjour Henri,

j'ai bossé un peu sur le MCP23017 que je n'avais jusqu'alors jamais utilisé en interruption ,
voici le resumé :

en lien avec ce post
viewtopic.php?f=10&t=1506
Insertion fonctions dans une interruption XC8 18F27K42


Usage de l'interrupt MCP23017 pour la Réactivité quasi temps reel ....
MAIS on ne peut pas en profiter
VU qu'on ne peut pas mettre la lecture I2C des regsitres MCP dans une interrupt ...
Dans cet exmple (zip ci-joint)

L'interrupt MCP se contente d'armer un flag et capturer le chrono (SMT1 en µS )en cours

mais comme la lecture de l'etat port B MCP se fait dans le main en I2C
la vraie lecture du portB n'est pas forcément celle correspondant au moment de l'interrupt !
il s'ensuit une duree minimum pour BIEN lire le bon etat du port,
lié à la duree de boucle programme .
par contre le lecture du registre CAPB (capture du portb au moment de l'interrupt)
correspond bien au chrono affiché .. mais non synchronisé temps reel.

on pourrait effectuer plusieurs fois le test du flag dans la boucle principale
pour pouvoir capter l'etat MCP avec le moins de latence possible
MAIS le traitement correspondant à l'evenement devra etre AUSSI etre multiplié !

dans ce test la duree de boucle est de 640mS
incluant l'affichage LCD, les mesures INA, le traitement ALERT, 2 sorties PWM, + sortie UART
et une TEMPO de 100mS correspondant à d'autres futurs traitements de fond.
en resumé, si l'I2C est utilisé par ailleurs, l'IT MCP23017 n'est pas directement utilisable.
on pourrait donc rester en mode pooling :


probleme solvable ?
attendre que le bus I2C soit libre (non occupé par le LCD ou Les 2 INA , pour lancer une lecture MCP ?
mais le compilateur NE VEUT PAS 2 branches Interrupt avec I2C
....avec un PIC18F47K42 ... usage de I2C2
....ou usage de MCP23S17 en SPI ... pas assez de PIn sur 18F27K42

d'ou ce tout dernier test :
Remplacement du delay 500mS par une boucle de 250 x 2ms
incluant le test du flag MCP , => traitement de l'info si armé...

hors tempo 500mS; le traitement actuel prend 640-500=140mS
si on test alors le flag dans un fenetre temporelle de 500mS
on a 75% fois plus de change de le capter

La latence de traitement est reduite


le bout de code s'y rapportant

Code : Tout sélectionner


 
//  __delay_ms(500); 
        i=0;
        do
        
{
         if (mcp_flag) break;
          __delay_ms(2);
          i++;
         } while(i<250);
         if (mcp_flag)
         { 
                IOCBNbits
.IOCBN1 =0;   
                 IT_Flag
=I2C1_Read1ByteRegister(MCP23017_ADDR,MCP_INTFB);
                 CAPB=I2C1_Read1ByteRegister(MCP23017_ADDR,MCP_INTCAPB);
                 MCP_B = MCP23017_ReadGPIOB();
                 sprintf(CRam1," %lu.%03d mS  IT_Flag = 0x%02X  CAPB= 0x%02X",mcp_timestamp/1000,mcp_timestamp%1000,(int) IT_Flag,(int) CAPB); // ok
                 Print(CRam1);
                 CRLF1();
                 CPrint(" \r\nTraitement de l'evenenment ....\r\n");
                 //__delay_ms(100); 
                 mcp_flag = false;
                 IOCBNbits.IOCBN1 = 1
           
}
           // pendant une ouverture de dialogue operateur on ratera des changements sucessifs sur MCP23017
         if (Flag_Buffer1==1) Dialogue_Operateur();
         Nb_Boucles ++; 
   
}
   while (1);



j'ai 2 BP sur les entrée B1 et b3 du MCP (tirées au +Vcc via 2.7k)
un zero declenche l'interrupt INTB MCP qui va sur RB1 du PIC ( IOCB1)
Le traitement interrupt IOC traite aussi RC0 (Alert INA)



le resultat sur terminal
* show time delta activé sur YAT terminal


Code : Tout sélectionner



((0.268) PWM1=1000
(0.331) Recu :PWM1=1000
(0.027)  Saisie OK PWM1-RC2 1000 98.0%
(
0.066) N=  267  PWM1= 1000 PWM2=    0 4.99 V  0.001 A  . Seuil=0.600 
(0.639) N=  268  PWM1= 1000 PWM2=    0 4.99 V  0.001 A  . Seuil=0.600 
(0.640) N=  269  PWM1= 1000 PWM2=    0 4.99 V  0.001 A  . Seuil=0.600 
(0.640) N=  270  PWM1= 1000 PWM2=    0 4.99 V  0.001 A  . Seuil=0.600 
(0.640) N=  271  PWM1= 1000 PWM2=    0 4.99 V  0.001 A  . Seuil=0.600 
(0.640) N=  272  PWM1= 1000 PWM2=    0 4.99 V  0.001 A  . Seuil=0.600 
(0.465) MA=1
(0.134) Recu :MA=1
(0.021)  ITB2 Enabled 
(0.021) N=  273  PWM1= 1000 PWM2=    0 4.99 V  0.001 A  . Seuil=0.600 
(0.639) N=  274  PWM1= 1000 PWM2=    0 4.86 V  0.052 A  . Seuil=0.600 
(0.641) N=  275  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.639) N=  276  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.640) N=  277  PWM1= 1000 PWM2=    0 4.86 V  0.053 A  . Seuil=0.600 
(0.641) N=  278  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.643) N=  279  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.637) N=  280  PWM1= 1000 PWM2=    0 4.86 V  0.053 A  . Seuil=0.600 
(0.302)  6383.696 mS  IT_Flag = 0x00  CAPB= 0x02
(0.265)  6516.802 mS  IT_Flag = 0x00  CAPB= 0x02
(0.109) N=  281  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.640) N=  282  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.640) N=  283  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.651) N=  284  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.106)  7531.851 mS  IT_Flag = 0x00  CAPB= 0x02
(0.070)  7630.139 mS  IT_Flag = 0x00  CAPB= 0x02
(0.207)  7734.704 mS  IT_Flag = 0x00  CAPB= 0x02
(0.151)  7810.948 mS  IT_Flag = 0x00  CAPB= 0x02
(0.167) N=  285  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.155)  7949.175 mS  IT_Flag = 0x00  CAPB= 0x02
(0.123)  8034.878 mS  IT_Flag = 0x00  CAPB= 0x02
(0.229)  8150.009 mS  IT_Flag = 0x00  CAPB= 0x02
(0.156)  8228.469 mS  IT_Flag = 0x00  CAPB= 0x02
(0.057) N=  286  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.125)  8320.774 mS  IT_Flag = 0x00  CAPB= 0x02
(0.139)  8390.724 mS  IT_Flag = 0x00  CAPB= 0x02
(0.189)  8485.573 mS  IT_Flag = 0x00  CAPB= 0x02
(0.159)  8566.183 mS  IT_Flag = 0x00  CAPB= 0x02
(0.092) N=  287  PWM1= 1000 PWM2=    0 4.86 V  0.053 A  . Seuil=0.600 
(0.116)  8659.101 mS  IT_Flag = 0x00  CAPB= 0x02
(0.112)  8726.966 mS  IT_Flag = 0x00  CAPB= 0x02
(0.450) N=  288  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.639) N=  289  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.652) N=  290  PWM1= 1000 PWM2=    0 4.86 V  0.053 A  . Seuil=0.600 
(0.129)  9597.045 mS  IT_Flag = 0x00  CAPB= 0x08
(0.042)  9679.500 mS  IT_Flag = 0x00  CAPB= 0x08
(0.504) N=  291  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.135)  9928.806 mS  IT_Flag = 0x00  CAPB= 0x08
(0.022)  10020.126 mS  IT_Flag = 0x00  CAPB= 0x08
(0.508) N=  292  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.166)  10358.767 mS  IT_Flag = 0x00  CAPB= 0x08
(0.176)  10448.138 mS  IT_Flag = 0x00  CAPB= 0x08
(0.335) N=  293  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.387)  10810.209 mS  IT_Flag = 0x00  CAPB= 0x02
(0.281) N=  294  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.152)  11027.922 mS  IT_Flag = 0x00  CAPB= 0x08
(0.499) N=  295  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.652) N=  296  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.124)  11601.398 mS  IT_Flag = 0x00  CAPB= 0x02
(0.108)  11722.040 mS  IT_Flag = 0x00  CAPB= 0x08
(0.230)  11837.119 mS  IT_Flag = 0x00  CAPB= 0x08
(0.224) N=  297  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.639) N=  298  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.147)  12304.482 mS  IT_Flag = 0x00  CAPB= 0x08
(0.036)  12362.990 mS  IT_Flag = 0x00  CAPB= 0x02
(0.059)  12393.136 mS  IT_Flag = 0x00  CAPB= 0x08
(0.186)  12486.611 mS  IT_Flag = 0x00  CAPB= 0x02
(0.288) N=  299  PWM1= 1000 PWM2=    0 4.86 V  0.053 A  . Seuil=0.600 
(0.641) N=  300  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.471)  13188.436 mS  IT_Flag = 0x00  CAPB= 0x02
(0.188) N=  301  PWM1= 1000 PWM2=    0 4.86 V  0.054 A  . Seuil=0.600 
(0.146)  13293.499 mS  IT_Flag = 0x00  CAPB= 0x08
(0.125)  13420.233 mS  IT_Flag = 0x00  CAPB= 0x08
(0.404) N=  302  PWM1= 1000 PWM2=    0 4.86 V  0.053 A  . Seuil=0.600 
(0.641) N=  303  PWM1= 1000 PWM2=    0 4.86 V  0.053 A  . Seuil=0.600 
 


on peut voir que le delai de latence est souvent infeieur à 140mS ....

18F27K42_PMW_CCP1234_2025-0510.X.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#127 Message par Babar64 » sam. 10 mai 2025 19:24

Bonsoir Paul,
D'abord merci!
j'ai bossé un peu
Oh le doux euphémisme :wink:

Mais bon, là, même en pédiluve, sûr, il va me falloir une bouée...
on peut voir que le délai de latence est souvent inférieur à 140mS ....

Oui, mais je suppose qu'avec tout le reste, ce délai s'envole, et puis tu indiques :
si on teste alors le flag dans un fenêtre temporelle de 500mS, on a 75% fois plus de chance de le capter
Que ce passe-t-il pour les 25% restants ?

Quelques remarques interrogatives dans le doc joint.
Si je comprends bien....docx


A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3260
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#128 Message par paulfjujo » dim. 11 mai 2025 13:58

bonjour à tous,

Babar64 a écrit :on peut voir que le délai de latence est souvent inférieur à 140mS ....
Oui, mais je suppose qu'avec tout le reste, ce délai s'envole,


640ms est la duree actuelle totale de cette boucle dans ce programme de test
les 140mS representent la durée de boucle SANS la boucle delai de 500mS (250x2mS)
on aura donc un temps de latence suite à une interruption MCP23017
de 0 à 140mS maxi, si l'IT survient AVANT la boucle delai
alors que , une fois dans la boucle delai (250x2ms)
le temps de latence est de 0 à 2mS seulement.

bien sur on ne rajoutera pas cette boucle delai 500ms dnas le programme final
c'était juste pour bien expliquer , que la reactivité immediate de l'interruption
necessite un espace temporel pour y faire le traitement voulu.

:furieux: c'est quand meme dommage d'avoir un circuit pouvant generer une interruption sur changement d'etat
et qu'on ne puisse pas traiter celle ci directement, parceque l'I2C n'est pas ré-entrante.


Au final, c'est la duree de la boucle principale qui fera la latence maximale

Nota:
Vu que la detection ALERTE se fait doublement :
* par hardware
* et par Interruption PIC + traitement immediat=> RAZ PWM moteurs
cette Latence n'aura pas d'incidence sur l'evenement le plus critique de l'application

mes reponses dans ton doc
Si je comprends bien-0511.docx



Mesures de durée execution code :






Code : Tout sélectionner


 Start_Chrono
(); 
            Volts 
=(float) mvU * 1.25 / 1000;
            Amps  =(float) mvA * 2.5 /10000.0;  // (5120/2048=2.5)
            Stop_Chrono(1); // 
 

N= 19 PWM1= 500 PWM2= 0 SMT1 Nb Tics ....230 µS
----------------------------
exemple de gain , en utilisant un precalcul de coeff.

Code : Tout sélectionner


      Start_Chrono
();
            Volts =(float) mvU * 0.00125 ;
            Amps  =(float) mvA * 0.00025 ;  // (5120/2048=2.5)  
            Stop_Chrono(1);
 

N= 16 PWM1= 0 PWM2= 0 SMT1 Nb Tics ... 80µS
-----------------------------------------
Acquisition de 1 seul module INA

Code : Tout sélectionner


Start_Chrono
();  
            Init_INA226_Done
=1;
            Mesures_INA226();
            Stop_Chrono(1);

N= 61 PWM1= 0 PWM2= 0 SMT1 Nb Tics 2540 µS
-------------------------------------
affichage sur Terminal et sur 1 ligne LCD : " 5.37 V 0.001 A "
des 2 mesures calculées en unités physiques d'un module INA

Code : Tout sélectionner


           Start_Chrono
();  
            Init_INA226_Done
=1;
            Mesures_INA226();
            Volts =(float) mvU * 0.00125 ;
            Amps  =(float) mvA * 0.00025 ;  
            sprintf
(CRam1," %2.2f V  %2.3f A  .",Volts,Amps);
            Print(CRam1); 
            LCD_Write_Text_At
(3,1,CRam1); 
            Stop_Chrono
(1);

N= 59 PWM1= 0 PWM2= 0 5.37 V 0.001 A . SMT1 Nb Tics 43222 ....en 43.2mS
et sans l'envoi sur terminal ....en 41.7 mS
l'envoi sur terminal compte pour 1,5mS

------------------------------------------
envoi des données mises en forme sur 1 ligne LCD en 22.56mS

Code : Tout sélectionner


 Start_Chrono
(); 
            sprintf
(CRam1," PWM2= % 4d",k2_PWM);
            Print(CRam1);
            LCD_Write_Text_At(2,1,CRam1);
            Stop_Chrono(1);

N= 459 PWM1= 0 PWM2= 0 SMT1 Nb Tics 22566
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3260
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#129 Message par paulfjujo » lun. 12 mai 2025 17:18

paulfjujo a écrit :bonjour à tous,

Babar64 a écrit :on peut voir que le délai de latence est souvent inférieur à 140mS ....
Oui, mais je suppose qu'avec tout le reste, ce délai s'envole,


640ms est la duree actuelle totale de cette boucle dans ce programme de test
les 140mS representent la durée de boucle SANS la boucle delai de 500mS (250x2mS)
on aura donc un temps de latence suite à une interruption MCP23017
de 0 à 140mS maxi, si l'IT survient AVANT la boucle delai
alors que , une fois dans la boucle delai (250x2ms)
le temps de latence est de 0 à 2mS seulement.

bien sur on ne rajoutera pas cette boucle delai 500ms dnas le programme final
c'était juste pour bien expliquer , que la reactivité immediate de l'interruption
necessite un espace temporel pour y faire le traitement voulu.

:furieux: c'est quand meme dommage d'avoir un circuit pouvant generer une interruption sur changement d'etat
et qu'on ne puisse pas traiter celle ci directement, parceque l'I2C n'est pas ré-entrante.


Au final, c'est la duree de la boucle principale qui fera la latence maximale

Nota:
Vu que la detection ALERTE se fait doublement :
* par hardware
* et par Interruption PIC + traitement immediat=> RAZ PWM moteurs
cette Latence n'aura pas d'incidence sur l'evenement le plus critique de l'application

mes reponses dans ton doc
Si je comprends bien-0511.docx


Mesures de durée execution code :






Code : Tout sélectionner


 Start_Chrono
(); 
            Volts 
=(float) mvU * 1.25 / 1000;
            Amps  =(float) mvA * 2.5 /10000.0;  // (5120/2048=2.5)
            Stop_Chrono(1); // 
 

N= 19 PWM1= 500 PWM2= 0 SMT1 Nb Tics ....230 µS
----------------------------
exemple de gain , en utilisant un precalcul de coeff.

Code : Tout sélectionner


      Start_Chrono
();
            Volts =(float) mvU * 0.00125 ;
            Amps  =(float) mvA * 0.00025 ;  // (5120/2048=2.5)  
            Stop_Chrono(1);
 

N= 16 PWM1= 0 PWM2= 0 SMT1 Nb Tics ... 80µS
-----------------------------------------
Acquisition de 1 seul module INA

Code : Tout sélectionner


Start_Chrono
();  
            Init_INA226_Done
=1;
            Mesures_INA226();
            Stop_Chrono(1);

N= 61 PWM1= 0 PWM2= 0 SMT1 Nb Tics 2540 µS
-------------------------------------
affichage sur Terminal et sur 1 ligne LCD : " 5.37 V 0.001 A "
des 2 mesures calculées en unités physiques d'un module INA

Code : Tout sélectionner


           Start_Chrono
();  
            Init_INA226_Done
=1;
            Mesures_INA226();
            Volts =(float) mvU * 0.00125 ;
            Amps  =(float) mvA * 0.00025 ;  
            sprintf
(CRam1," %2.2f V  %2.3f A  .",Volts,Amps);
            Print(CRam1); 
            LCD_Write_Text_At
(3,1,CRam1); 
            Stop_Chrono
(1);

N= 59 PWM1= 0 PWM2= 0 5.37 V 0.001 A . SMT1 Nb Tics 43222 ....en 43.2mS
et sans l'envoi sur terminal ....en 41.7 mS
l'envoi sur terminal compte pour 1,5mS

------------------------------------------
envoi des données mises en forme sur 1 ligne LCD en 22.56mS

Code : Tout sélectionner


 Start_Chrono
(); 
            sprintf
(CRam1," PWM2= % 4d",k2_PWM);
            Print(CRam1);
            LCD_Write_Text_At(2,1,CRam1);
            Stop_Chrono(1);

N= 459 PWM1= 0 PWM2= 0 SMT1 Nb Tics 22566


********************************************************************************************
idea ! recherche optimisation coté LCD

modif :
dans LCD_4bits_I2C_2024-01.c
delay 10µs carrément supprimé ,
le dialogue via I2C à 100Khz ralentissant déja suffisament la vitesse d'échange entre PIC et LCD
:!!: contrairement à une commande directe PIC -> LCD ..avec delais obligatoires
la main boucle passe de 628ms à 580mS

test durée traitement acquisition + affichage sur 1 ligne LCD des mesures d'un module INA
(et sur Terminal )

Code : Tout sélectionner

          Start_Chrono();  
            Init_INA226_Done
=1;
            Mesures_INA226();
            Volts =(float) mvU * 0.00125 ;
            Amps  =(float) mvA * 0.00025 ;  
            sprintf
(CRam1," %2.2f V  %2.3f A  .",Volts,Amps);
            Print(CRam1); 
            LCD_Write_Text_At
(3,1,CRam1); 
            Stop_Chrono
(1);



N= 30 PWM1= 0 PWM2= 0 12.25 V 0.001 A . SMT1 Nb Tics 29862

:-D 29.8 mS au lieu de 43mS .... gain global de 13ms en enlevant un delais de 10µS sur ecritures registres LCD
et l'affichage LCD reste OK
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3260
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#130 Message par paulfjujo » mar. 20 mai 2025 18:11

bonjour à tous,


suite Tests MCP23017
sur port de sortie MA , acces individuel au bit dans le registre OLATA , activation ou pas du clignotement
Test via l'usage du terminal YAT ...



MA=1
Recu :MA=1
ITB2 Marche
N=12021 PWM1= 250 PWM2= 0 14.41 V 0.022 A . Seuil=0.600 MA=0x00 MB=0xFF
N=12022 PWM1= 250 PWM2= 0 14.41 V 0.022 A . Seuil=0.600 MA=0x00 MB=0xFF

PWM1=0500
MA=0x00 MB=0xFF

Recu :PWM1=0500
Saisie OK PWM1-RC2 500 49.0%
N=12025 PWM1= 500 PWM2= 0 14.41 V 0.022 A . Seuil=0.600 MA=0x00 MB=0xFF
N=12026 PWM1= 500 PWM2= 0 14.32 V 0.041 A . Seuil=0.600 MA=0x00 MB=0xFF

FL=1
MA=0x00 MB=0xFF

Recu :FL=1
Flash Out=1
N=12032 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash MA=0x01 MB=0xFF
N=12033 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash MA=0x01 MB=0xFF

SI=1
Recu :SI=1
Sirene=1
N=12037 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash Sir MA=0x03 MB=0xFF
N=12038 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash Sir MA=0x03 MB=0xFF

BU=1
Recu :BU=1
Buzzer=1
N=12046 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash Sir Buz MA=0x07 MB=0xFF
N=12047 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash Sir Buz MA=0x07 MB=0xFF

CL=1
Recu :CL=1
Clignote= 1
N=12051 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash* Sir Buz MA=0x07 MB=0xFF
N=12052 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash* Sir Buz MA=0x06 MB=0xFF
N=12053 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash* Sir Buz MA=0x06 MB=0xFF
N=12054 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600
CL=2
Recu :CL=2
Clignote= 3
N=12055 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash* Sir* Buz MA=0x07 MB=0xFF
N=12056 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash* Sir* Buz MA=0x04 MB=0xFF
N=12057 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash* Sir* Buz MA=0x04 MB=0xFF
N=12058 PWM1= 500 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash* Sir* Buz MA=0x07 MB=0xFF
PWM1=0250

Recu :PWM1=0250
Saisie OK PWM1-RC2 250 24.5%
N=12059 PWM1= 250 PWM2= 0 14.30 V 0.041 A . Seuil=0.600 Flash* Sir* Buz MA=0x07 MB=0xFF
N=12060 PWM1= 250 PWM2= 0 14.40 V 0.021 A . Seuil=0.600 Flash* Sir* Buz MA=0x04 MB=0xFF
N=12061 PWM1= 250 PWM2= 0 14.39 V 0.022 A . Seuil=0.600 Flash* Sir* Buz MA=0x04 MB=0xFF
N=12062 PWM1= 250 PWM2= 0 14.39 V 0.022 A . Seuil=0.600 Flash* Sir* Buz MA=0x07 MB=0xFF
N=12063 PWM1= 250 PWM2= 0 14.39 V 0.022 A . Seuil=0.600 Flash* Sir* Buz MA=0x07 MB=0xFF
N=12064 PWM1= 250 PWM2= 0 14.39 V 0.022 A . Seuil=0.600 Flash* Sir* Buz MA=0x04 MB=0xFF
N=12065 PWM1= 250 PWM2= 0 14.39 V 0.022 A . Seuil=0.600 Flash* Sir* Buz MA=0x07 MB=0xFF
......... freinage rotor ....
N=12155 PWM1= 250 PWM2= 0 14.05 V 0.113 A . Seuil=0.600 Flash* Sir* Buz MA=0x07 MB=0xFF
PWM1=1000
Recu :PWM1=1000
Saisie OK PWM1-RC2 1000 98.0%
ALERT
N=12156 PWM1= 0 PWM2= 0 14.02 V 0.122 A . Seuil=0.600 Flash* Sir* Buz MA=0x04 MB=0xFF
N=12157 PWM1= 0 PWM2= 0 13.64 V 0.158 A . Seuil=0.600 Flash* Sir* Buz MA=0x04 MB=0xFF
N=12158 PWM1= 0 PWM2= 0 14.49 V 0.003 A . Seuil=0.600 Flash* Sir* Buz MA=0x07 MB=0xFF



Test_MCP23017_2025-0520.docx


main_18F27K42_MCP23017_0512.X.c


MCP_ports_Portail_2025-0517.jpg


18F27K42_PMW_INA226_MCP23017_2025-0520.zip


:!!: Les phases de tests prealables sont essentielles pour arriver à un resultat probant.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Coin Fourre-tout »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités