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
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#181 Message par Babar64 » mer. 16 juil. 2025 13:05

LO à tous,

paulfjujo a écrit :tu ne peux pas modifier FOSC à 32 ou 8 ou 4 ou 2 ... à tester !! NCO variable de 1Hz à 16MHz
il y a nécessité de garder PR2 à 255 pour que le réglage %PWM soit le même pour chaque fréquence PWM. gamme 0 à100%.
il manque juste la validation ?
si tous les réglages par menu se font sur 2 digits, une seule fonction commune sera nécessaire,
encadrée , fonction(menu) par des : mini, maxi value et éventuellement position du digit
... simplifie le programme
après validation , il faudra ensuite convertir les unités physiques en points -> RAM -> Eeprom
Je me disais bien que j'avais faux ! Encore pas mal de pain sur la planche, donc.

=> Est-ce à dire qu'exclure la version avec potars est la bonne stratégie à retenir? Compatible avec un potentiel réglage via NCO ?

=> La validation concerne les valeurs des réglages ; et la sauvegarde concerne leur conversion en points, c'est bien çà ?
==> Si oui, j'ai donc besoin de 2 actions différentes via les poussoirs, par exemple pour chaque valeur :
==> - Sx1 >4s = Validation de la valeur traitée
==> - Sx2 >4s = Sauvegarde en RAM de sa conversion en points (après validation)

=> simplifier le programme : Je ne saisis pas bien ce que tu veux dire...

Remarque :
J'ai la mauvaise impression que le réglage envisagé de la fréquence PWM va hélas rester impossible, et que cette valeur sera donc à fixer "en dur"...
Je ne suis pas arrivé à déterminer la fréquence PWM utilisée à partir des composants sur la carte HS.
Tout ce que j'avais pu remarquer, c'était un bruit strident (qqs kHz?) lors du forçage en butée.
Je vais donc m'enquérir d'un générateur PWM (fréquence et duty) en tête d'une carte Ponts-en-H et faire des essais réels sur mes moteurs, histoire d'avoir une idée plus précise de ces valeurs.

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 : 3257
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#182 Message par paulfjujo » mer. 16 juil. 2025 17:53

Babar64 a écrit :après validation , il faudra ensuite convertir les unités physiques en points -> RAM -> Eeprom


si on ne modifie que les unités physique ( avec visu sur LCD) on ne pourra pas verifier la modif , car c'est bien la valeur correspondante en points qui est utilisée dans l'application ..
il faut donc que la validation realise => la conversion en points et sauvegarde en RAM

nota : la partie modification de parametres est en dehors de la boucle principale
ou alors on est forcément avec vantaux portails sur butee..pas de commande portail engagée.
Le resultat d'une modif ne sera vue qu'apres coup.

sortie preventive du menu SANS validation ..les modifs sont abandonnées ?
sortie AVEC Validation ..les modifs sont transférées en Memoire de travail ..SANS sauvegarde en eeprom ?
..pour verifier le comportement
Menu specifique pour Sauvegarde des parametres en eeprom ?

Babar64 a écrit :=> Est-ce à dire qu'exclure la version avec potars est la bonne stratégie à retenir?
Compatible avec un potentiel réglage via NCO ?


Attendre la faisabilité d'usage du NCO, à la place de FOSC ou FOSC/4 , comme frequence de pilotage TMR2 ..
donc de la frequence du PWM .. le % duty-cycle PWM restant 0 à1023 pou 0 à 100% avec PR2 fixe=255

Babar64 a écrit :=> La validation concerne les valeurs des réglages ; et la sauvegarde concerne leur conversion en points, c'est bien çà ?

NON
on ne peut RIEN FAIRE avec les mesures affichées en unités physique, c'est juste un confort pour l'operateur
il faut les sauvegarder en points (avec mises à l'echelle UPH-> points) pour les utiliser..
Travailler dans la boucle principale avec des valeurs en unités physique ..demande beaucoup plus de ressources MCU


Remarque :
J'ai la mauvaise impression que le réglage envisagé de la fréquence PWM va hélas rester impossible, et que cette valeur sera donc à fixer "en dur"...
[/quote]

les possibilites actuelles :

Code : Tout sélectionner


  REGISTER 22
-5: TxCON: TIMERx CONTROL REGISTER
    bit 6
-4 CKPS<2:0>: Timerx-type Clock Prescale Select bits
                                        Fosc
/4      Fosc
    111 
= 1:128 Prescaler               488Hz        1 953
    110 
= 1:64 Prescaler                977Hz        3 906 
    101 
= 1:32 Prescaler                1 953 Hz     7 813
    100 
= 1:16 Prescaler                3 906Hz      15 625
    011 
= 1:8 Prescaler                 7 813 Hz     31250
    010 
= 1:4 Prescaler                 15 625 Hz    62500
    001 
= 1:2 Prescaler                 31 250 Hz    125000
    000 
= 1:1 Prescaler                 62 500 Hz    250 000
 
 7 choix possibles via le  Prescaler  
( et donc indirectement le diviseur) avec choix  FOSC=64Mhz
 7 autres choix possibles via le  Presccaler  
( et donc indirectement le diviseur) avec choix  FOSC/4==16Mhz
Aide toi, le ciel ou FantasPic t'aidera

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

#183 Message par paulfjujo » ven. 18 juil. 2025 18:51

bonjour,


idea ! ça peut le faire avec NCO !
soit un reglage fin mais difficile avec un potar 270°

FrqNCO (Khz) = EA0*16* 64000000 / (2*2^20) =(EA0<<4)* 30.5176
Freq PMW (KHz) : = 1/( (1/FreqNCO) * (PR2+1)) =FrqNCO/256


timer2_avec_NCO.jpg



EA0=526 FrqPWM= 1,003 KHz
EA0=1050 FrqPWM= 2,003 KHz
EA0=1573 FrqPWM= 3,000 KHz
EA0=2097 FrqPWM= 4,000 KHz
EA0=2622 FrqPWM= 5,003 KHz
EA0=3146 FrqPWM= 6,001 KHz
EA0=2670 FrqPMW= 7,000 Khz
EA0=4095 FrqPWM= 7,811 KHz


si au lieu du potar analogique avec EA0 *16,
on progresse de 1 à 8 pas fixe de 511
Incr=pas*511*16
correspondance :
PAS Freq
1... 975 Hz
2... 1949
3... 2944
4... 3899
5... 4873
6... 5848
7... 6823
8... 7797


soit en parcourant une table de valeurs
ou via une table de valeurs, pour des valeurs rondes 1,2,3,4,5,6,7,sauf 7.8
Ref_Increment[]={ 526,1050,1573,2097,2622,3146,3670,4095};

Test avec
EA0 => Fosc NCO ..donc Freq PWM1
et EA1=% PWM1
TEST REEL avec SQA analyser


j= 5 A0=00484 A1=00224 FStep=4195 Increment = 7744 Freq NCO Out= 236328 KHz PWM1= 56
j= 9 A0=00910 A1=00728 FStep=4195 Increment = 14560 Freq NCO Out= 444336 KHz PWM1= 182
j= 13 A0=01199 A1=00740 FStep=4195 Increment = 19184 Freq NCO Out= 585450 KHz PWM1= 185
j= 16 A0=01273 A1=02700 FStep=4195 Increment = 20368 Freq NCO Out= 621582 KHz PWM1= 675
j= 21 A0=01253 A1=03550 FStep=4195 Increment = 20048 Freq NCO Out= 611817 KHz PWM1= 887
j= 22 A0=01549 A1=03429 FStep=4195 Increment = 24784 Freq NCO Out= 756348 KHz PWM1= 857
j= 29 A0=01726 A1=03665 FStep=4195 Increment = 27616 Freq NCO Out= 842774 KHz PWM1= 916
j= 34 A0=02308 A1=03680 FStep=4195 Increment = 36928 Freq NCO Out= 1126954 KHz PWM1= 920
j= 45 A0=03951 A1=03656 FStep=4195 Increment = 63216 Freq NCO Out= 1929200 KHz PWM1= 914
j= 52 A0=04085 A1=01247 FStep=4195 Increment = 65360 Freq NCO Out= 1994630 KHz PWM1= 311




Code : Tout sélectionner



void main
(void) {
    //  SYSTEM_Initialize();
    OSCCON1 = 0x60; // NOSC HFINTOSC; NDIV 1; 
    OSCCON3 = 0x00; // CSWHOLD may proceed; SOSCPWR Low power; 
    OSCEN = 0x00;
    OSCFRQ = 0x08; //64_MHz; 
    OSCTUNE = 0x10;

............
 
    
// ---------TMR2_Initialize();------------------------------------
    //REGISTER 22-1: TxCLK: TIMERx CLOCK SELECTION REGISTER
    //  T2CLKCON = 0x01;// FOSC/4
    //  T2CLKCON = 0x02;// FOSC
    T2CLKCON = 0x09;//NCO 
    //REGISTER 22-6: TxHLT: TIMERx HARDWARE LIMIT CONTROL REGISTER
    //PSYNC CKPOL CKSYNC MODE<4:0>
    //1 = PSYNC:  TxTMR Prescaler Output is synchronized to Fosc/4
    //0 = CKPOL:  Rising edge of input clock clocks timer/prescaler
    //1  CKSYNC:  1 = ON register bit is synchronized to T2TMR_clk input
    //0000 MODE  TABLE 22-1: TIMER2 OPERATING MODES
    //T2HLT = 0x80;
    T2HLT=0b10000000;  //
    T2RST = 0x04;  // 04= CCP1 out
    T2PR = 0xFF;// PR2 255
    T2TMR = 0x00;
    PIR4bits.TMR2IF = 0;
    //REGISTER 22-5: TxCON: TIMERx CONTROL REGISTER
   // ON CKPS<2:0> OUTPS<3:0>
   //  TMR2ON ON=1;  T2CKPS=000=> 1:1; T2OUTPS=0 => 1:1;
    T2CON = 0x80; //  0b1 000 0000
..........

     CPrint("\r\n Init NCO1 à 10Khz \r\n");
    Increment=3395;
    j=0;
    CPrint(" Init NCO (voir page 454 datasheet) \r\n");
    NCO1CONbits.NCO1EN=0;  // disable
    //PFM: NCO1 Pulse Frequency Mode bit
    // 1 = NCO1 operates in Pulse Frequency mode
    // 0 = NCO1 operates in Fixed Duty Cycle mode, divide by 2
     CPrint(" Polarity =0 (Not inverted) \r\n");
     NCO1CONbits.NCO1POL=0; //0 = NCO1 output signal is not inverted   1=inverted
     CPrint(" NCO1 operates in Fixed Duty Cycle mode 50% , divide by 2  (PFM=0)\r\n");
     NCO1CONbits.PFM=0; //else Fixed duty cycle is 50%
     pI=&Increment;
     PWS_Valeur=0;
    //  The NCO clock source is selected by configuring
    // the  N1CKS<2:0> bits in the NCO1CLK register.
     //  000 =   NCO1 output is active for 1 input clock period
     //  000 =   NCO1 output is active for 1 input clock period
      NCO1_Clock_Choix=1;  //  0=FOSC  1=HFINTOSC  3=500Khz
      CPrint (" NCO1CLK choix = ");
      cx=  NCO1_Clock_Choix+48;
      PrintChar(cx);
      CPrint ("    soit ");
      CPrint ( NCO1_Clock_Name[NCO1_Clock_Choix]);
      CRLF1();
     NCO1CLK=  PWS_Valeur<<|  NCO1_Clock_Choix ;
     NCO1CONbits.NCO1EN=1;  // enable
      SQA=1;
     __delay_ms(2500);
      SQA=0; 
  
//  CPrint (" Freq Output= de 1KHz à 10Kz par pas de 1Khz: \r\n");
    FStep=4195;
    Increment=4195;
    for(j=0;j<10;j++)
     {
        NCO1CONbits.NCO1EN=0;  // disable
        pI=&Increment;
        NCO1INCU=  *(pI+2);
        NCO1INCH=  *(pI+1);
        NCO1INCL=  *(pI+0);
        NCO1CONbits.NCO1EN=1;  // enable
       //Foverflow=  NCO clock /2 * Increment / 2^20   ;   /1 048 576?
       // F0= NCO1_Clock[NCO1_Clock_Choix];
       // F0=F0 *(float)Increment  / 2097152.0 ; 
        F0 =  (float)Increment * 30.5176; //    64000000 / 2097152.0 = 30.5176 
        txt=&TEXTE[0];
        sprintf(txt," j=%5d  FStep=%lu  Increment = %lu ",j,FStep,Increment);
        Print(txt); 
         sprintf 
(CRam1,"   Freq Output= %8.3f KHz ",F0/1000);
        Print (CRam1); 
        CRLF1
();
        SQA=1;
        __delay_ms(150);
        SQA=0;
        Increment = Increment + FStep;
        Led_Rouge_Toggle() ; 
        __delay_ms
(2000);
       Waiting_Enter_Key_Pressed(); 
     
}
    
     CPrint
(" ITB2 enable => Marche\r\n");
     IBT2_Enable=1;
     CPrint("\r\n Test Freq NCO avec EA0*16  et EA1=%PWM1 \r\n");
     j=0;
     do
     
{  // acquisition des 4 mesures ANA 
        Mesures_Analogiques(); 
        sprintf
(CRam1, " j=%5d   A0=%05d  A1=%05d",j, EA0, EA1);
        Print(CRam1);
        Increment = EA0 << 4 ; //  EA0 * 16 
        
        NCO1CONbits
.NCO1EN=0;  // disable
        pI=&Increment;
        NCO1INCU=  *(pI+2);
        NCO1INCH=  *(pI+1);
        NCO1INCL=  *(pI+0);
        NCO1CONbits.NCO1EN=1;  // enable
        
        SQA
=1;
        Led_Rouge_Toggle() ; 
        F0 
=  (float)Increment * 30.5176;
        txt=&TEXTE[0];
        sprintf(txt," FStep=%lu  Increment = %lu ",FStep,Increment);
        Print(txt); 
         sprintf 
(CRam1,"   Freq NCO Out= %9.3f KHz ",F0/1000);
        Print (CRam1); 
        k1_PWM
=EA1>>2;
        PWM1_LoadDutyValue(k1_PWM); // cde PWM Lent  PONT M1
        sprintf (CRam1,"   PWM1= %5d ", k1_PWM);
        Print (CRam1); 
        CRLF1
();
        SQA=0;  
         __delay_ms
(1000);
        Waiting_Enter_Key_Pressed(); 
       j
++;
     }   
     while
(1);
.........................

 



plus de details et code complet ICI
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 : 3257
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#184 Message par paulfjujo » dim. 20 juil. 2025 10:48

bonjour,

à noter:

il n'y a qu'un seul NCO, on ne peut donc pas avoir de frequence differente entre un vantail ou l'autre,
..à part du simple au double via le prescaler ou utiliser FOSC,FOS/16 dans un cas à la place du NCO
d'un autre coté, avec les mêmes moteurs, pourquoi voudrait-on differencier la frequence..!

le Timer2 serait affecté à un vantail ( RC1 RC2 PWM outputs)
le Timer4 serait affecté à l'autre ventail ( RB0 RB5 PWM outputs)
chacun recevant la meme frequence de pilotage NCO ..

Le reglage duty %PWM etant liés à un timer
on peut quand meme regler la vitesse de chaque moteur.

Question:
vitesses differentes suivant les positions du Vantail :(f (position cames)..... vu
ET aussi ?
differentes entre sens Ouverture Ou Fermeture ?
(pertes mecanique trop differentes suivant le sens )

Rappel:
mes test concernent un seul driver PONT H Mosfet IBT2
validation MARCHE Pont H par RB5
cde %PWM1 en RC2 et %PWM2 en RC1
je n'ai qu'un seul (petit) moteur en test..
...eventuellement remplacé par ampoules 12V 10W ,pour l'effet visuel direct du %PWM


France/Allemagne
humour!! ...mettre des avant-centre aux petits pieds ...
un 36 au lieu de 41 aurait peut-etre permis de valider le but refusé ...
dommage, l'aventure s'arrete là.
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

#185 Message par Babar64 » dim. 20 juil. 2025 16:21

LO à tous,
paulfjujo a écrit :un 36 au lieu de 41 aurait peut-être permis de valider le but refusé ...
Euh... ça ne serait pas plutôt un 41 au lieu d'un 36 ? En tout cas le dernier péno aurait eu lui aussi besoin de plus de watts pour espérer échapper aux paluches de Ann-Katrin Berger... Mais on les aime toutes, ces footballeuses :wink:

paulfjujo a écrit :pourquoi voudrait-on différencier la fréquence..!
:+1: Inutile, oui ; c'est au cahier des charges

paulfjujo a écrit :le Timer2 serait affecté à un vantail ( RC1 RC2 PWM outputs)
le Timer4 serait affecté à l'autre vantail ( RB0 RB5 PWM outputs)
chacun recevant la même fréquence de pilotage NCO ..
:+1: Oui ; c'est ce qui a été retenu.

paulfjujo a écrit :vitesses différentes entre sens Ouverture Ou Fermeture ?
Non. Elles étaient commues sur la carte d'origine, et tout se passait correctement. Mais effectivement, ce serait resté une vraie interrogation s'il s'était avéré une trop grande disparité aux moteurs, ou leur charge mécanique.

J'essaie de décrire correctement les réglages avec leur conversion en points... Mais je reste dubitatif... :oops:
Réglages_Sx1-Sx2-Sx3.xls
La feuille est protégée sans mot de passe.
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 : 3257
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#186 Message par paulfjujo » lun. 21 juil. 2025 12:16

bonjour,

Babar64 a écrit :... ça ne serait pas plutôt un 41 au lieu d'un 36 ?



je parlais du but refusé sur hors jeu..
le check montrant le bout du pied dépassant la limite materialisée du hors jeu

j'ai jeté un oeil sur ton fichier ...
Rappel : on ne peut pas regler un courant en fonction du %PWM
à moins d'etablir un modele predictif via tout une serie de mesures
et en considerant que le modele mecanique restera invariable ( et sans vent)

un relevé de la mesure de courant , enregistré pendant un deplacement de ventail
pourrait servir de signature mecanique de reference ...moyennant une option dans le menu
ou réalisée avant une mise en service officielle. .. ou systematique si la duree de boucle principale est suffisament faible.

Ne pas confondre la mise à l'echelle de la mesure de courant et celle du seuil d'alerte

le seuil d'alerte ..uniquement pour le STOP (Hardware) sur grosse anomalie
pourrait d'ailleurs rester inutile avec une Rserie cable + moteur >=6 ohms

et les seuil de courant, comparés à la mesure de courant, en live,
pour detecter un forçage mecanique ,
ou conjointement avec la tempo Brk si arrivé en butee,
le 1er des 2 arretant le PWM.


gamme de tempo 4.096sec ..jouable ?


Réglages_Sx1-Sx2-Sx3_P_2025-0721.xls
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

#187 Message par Babar64 » lun. 21 juil. 2025 20:53

Bonjour Paul, et à tous
paulfjujo a écrit :gamme de tempo 4.096sec ..jouable ?
Oui ; complètement. on retient ça.

paulfjujo a écrit :Ne pas confondre la mise à l'échelle de la mesure de courant et celle du seuil d'alerte
Yes!

On avance :
Les parties Amax_INA ; Amp_BRK et Tmp_BRK sont réglées.
De même les actions Sx1 à Sx3.
Pas de commentaires sur les Duty_LW et Duty_HI : c'est bon aussi ?
Il semble que tu n'aies pas pu consulter le fichier complet, joint plus tardivement, incluant la Fréquence PWM.

paulfjujo a écrit :Rappel : on ne peut pas régler un courant en fonction du %PWM
Oui! Mais je ne me suis pas fait bien comprendre sur ce point : je ne veux pas régler le courant en fonction des % Duty_LW et Duty_HI, mais pouvoir régler une limite en courant pour chacune de ces vitesses (Amax_LW et Amax_HI), provoquant un arrêt en cas d'un obstacle qui n'aurait pas été détecté par les cellules ou le palpeur (ceinture et bretelles).

Bien entendu ces limites devront être inférieures à celles des ALERT aux INA (Amax_INA) et du courant de blocage (Amp_BRK).

Sauf erreur, on n'aura pas le même ampérage en vitesse lente qu'en vitesse rapide ; les seuils dépendent donc de la vitesse active en cours : c'est la raison pour laquelle je tiens compte du % des duty pour déterminer Amax_LW et Amax_HI.
Toutefois, il est probable que la limite en courant Amax_LW soit trop faible et déclenche au démarrage.
Il faudra très certainement prévoir de l'inhiber pendant quelques dixièmes de secondes.

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 : 3257
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#188 Message par paulfjujo » mar. 22 juil. 2025 16:41

bonjour,


Probleme sur la ref PWM
avec un step de 526 point ..et une consigne analogique via EA0 ...............7,8Khz maxi
on est limité par le maxi ADC si solution potar EA0
mais avec des BP incr on peut depasser le 4096! et probablement atteindre 30KHz
MAIS reste à verifier la limite maxi de Freq NCO
:!!: ... à verifier


il faudra donc avoir un menu pour
* reglage de %PWM pour vitesse lente
0 à1023 pour 0 à 100% PMW
* reglage de %PWM pour vitesse Rapide
* reglage seuil Amp pour vitesse Lente
* reglage seuil Amp pour vitesse Rapide

les amperes sont plutot liés au couple resistant mecanique
et bien plus faiblement à la difference de vitesse ..

il faudrait verifier quelle est la part du Cable et de l'induit
sur la mesure globale de ~6ohms (moteur + cable)
influence de R cable (chute R*I)

Que faire si on atteint une de ces limites => Arret moteur ?
La mesure de courant INA devra donc etre constament rafraichie ...
à chaque tour de boucle minimum ....
NOTA: ne peut pas etre l'inclure dans une interruption timer ..I2C non rérentrant.

Problemo_choix_freq_PWM.jpg
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

#189 Message par Babar64 » mer. 23 juil. 2025 03:09

Je viens de rentrer... et je jette un oeil avant le dodo :wink:
paulfjujo a écrit :Source du message il faudra donc avoir un menu pour
* reglage de %PWM pour vitesse lente
0 à1023 pour 0 à 100% PMW
* reglage de %PWM pour vitesse Rapide
* reglage seuil Amp pour vitesse Lente
* reglage seuil Amp pour vitesse Rapide
Oui
paulfjujo a écrit :Source du message Que faire si on atteint une de ces limites => Arret moteur ?
Oui, via la sortie STOP_outPA4 (pin6 du PIC)
paulfjujo a écrit :Source du message La mesure de courant INA devra donc être constamment rafraichie ...
à chaque tour de boucle minimum ....
Bien sûr, mais, sur ton site, je n'ai pas compris comment récupérer cette mesure... :oops:

Pour les mesures ohmiques câble / induit, je vois ça après ma (courte) nuit.
A+
: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 : 3257
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#190 Message par paulfjujo » mer. 23 juil. 2025 18:10

bonsoir,


l'init INA à faire au moins 1 fois, apres calibrage des parametres... pour chaque vantail
Init_INA226_Done=1;

pour 1 vantail :

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

on pourrait se passer de la mesure tension d'induit ...?

Code : Tout sélectionner

#ifdef With_INA226
#define INA226_ADDR 0x40  // sur 7 bits


 // Conversion time in microseconds
#define      CONV_TIME_140    0
#define      CONV_TIME_204    1
#define      CONV_TIME_332    2
#define      CONV_TIME_588    3
#define      CONV_TIME_1100   4
#define      CONV_TIME_2116   5
#define      CONV_TIME_4156   6
#define      CONV_TIME_8244   7

// INA226_measureMode;
#define    INA226_POWER_DOWN  0x00
#define    INA226_TRIGGERED   0x03
#define    INA226_CONTINUOUS  0x077

// INA226_ALERT_TYPE
#define      SHUNT_OVER     0x8000
#define      SHUNT_UNDER    0x4000
#define      BUS_OVER       0x2000
#define      BUS_UNDER      0x1000
#define      POWER_OVER     0x0800
#define      CURRENT_OVER   0xFFFE
#define      CURRENT_UNDER  0xFFFF


 #define INA226_CONF_REG        0x00 //Configuration Register
 #define INA226_SHUNT_REG        0x01 //Shunt Voltage Register
 #define INA226_BUS_REG          0x02 //Bus Voltage Register
 #define INA226_PWR_REG          0x03 //Power Register 
 #define INA226_CURRENT_REG      0x04 //Current flowing through Shunt
 #define INA226_CAL_REG          0x05 //Calibration Register 
 #define INA226_MASK_EN_REG      0x06 //Mask/Enable Register 
 #define INA226_ALERT_LIMIT_REG  0x07 //Alert Limit Register
 #define INA226_MAN_ID_REG       0xFE //Contains Unique Manbufacturer Identification Number
 #define INA226_ID_REG           0xFF //Contains unique ID

        /* parameters, flag bits */
 uint16_t INA226_RST        =0x8000; //Reset 
 uint16_t INA226_AFF        =0x0010; //Alert function flag
 uint16_t INA226_CVRF       =0x0008; //Conversion ready flag
 uint16_t INA226_OVF        =0x0004; //Overflow flags AFF
 uint16_t INA226_ALERT_POL  =0x0002; //Alert pin polarity - if set then active-high
        //Latch enable - if set then alert flag remains until mask/enable register is read
        //if not set then flag is cleared after next conversion within limits
 uint16_t INA226_LATCH_EN   =0x0001; 


//--- INA226-----
  int16_t mvA=0;   
  uint16_t mvU
=0; // toujours positif
  float Power=0.0;
  int16_t mA=0;
  float Amps=0.00;
  float Volts=0.00;
  float Seuil_Alerte=0.0;
  
  uint8_t AFF_Flag
=0;
  uint16_t ALERTE_STATUS=0;
  
  void   INA226_Init_Config
(void);
#endif


#ifdef With_INA226
void INA226_Init_Config(void)
{
   
    CPrint
(" Config  INA226_CONF_REG,0x43FF (was 0x4127 )\r\n");
    p1=&tmp[0];
    //  Addr=0x40; // INA226_ADDR   0x40 8 bits; 
    // configuration RST  AVGX VBUSCTX VSHCTX   MODEx   // 16-bits
    // AVG2 AVG1 AVG0  bit 9 à 11
    // 0 => 1    1 => 4   2-> 8  3-> 16   4 -> 128 ...... 7 -> 1024
    //Reset 1  dumy 000  NbAverage 011= 3 => 64mS 
    // conversion Time Vbus 100=1,1mS  conversion Time SHuntV 100=1,1mS
    // mode 111 Shunt & bus continuous
    // 0b 0 000 001     Vbus 011   Vsht 111    mode 111; 
    // 0b 0100  0011 0011 1111; 
    // V.O. INA226_Write_16bits_Register(INA226_CONF_REG,0x4127);
      tmp[0]=INA226_CONF_REG;
      tmp[1]=0x47;  // 64 ms average Vbus 1.1mS  VSh 1.1mS
      tmp[2]=0x3F; // shunt convertion time 8.24mS  mode continu
      Addr=INA226_ADDR;
     // I2C1CON2bits.ABD=1;
      cx=3;
      I2C1_WriteNBytes(Addr, p1, cx); 
     
//   CPrint(" Calibration register 05h <- 0x0034 (shunt 0,1 ohm) \r\n");
      CPrint(" Calibration register 05h (pour shunt 0,01 ohm  et 8 Amps) \r\n");
      // 0x00D1B
      tmp[0]=INA226_CAL_REG;  //5120 =>0x1400
      tmp[1]=0x00;   // 0x00;// pour shunt 0,1
      tmp[2]=0x14;    // 0x34;//pour shunt 0,1
      Addr=INA226_ADDR;
      p1=&tmp[0];
      cx=3;
      I2C1_WriteNBytes(Addr, p1,cx);
     //  Mask / Enale Register   
     //  SOL/SUL shunt voltage over/Under Limit Alert
     //  BOL /BUL  Bus Voltage Over/Under Limit Alert
     //  POL :Power Over limit Alert           
     //  CNVR Convertion Readdy Alert   
      // 0b 1 0 0 0 0 0 0 0
      // shunt Over alert
      // // 0b 0 0 0 AFF CVRF OVF APOL LEN 
      // AFF Alarm Fonction Flag aune limite a été franchie !
      // CVRF conversion Ready Flag mesure OK   OVF : Overflow Flag  debordement d'un registre
      // APOL= Alert polarity=active high with APOL=0 
      // LEN=1 =Alarme Latche enable
        CPrint(" Mask/Alert  MASK_EN_REG register 06h <- 0x8001\r\n");
        // 0x00D1B
        tmp[0]=INA226_MASK_EN_REG;
        tmp[1]=0x80;
        tmp[2]=0x01;  // avec latch_EN=1
        Addr=INA226_ADDR;
        p1=&tmp[0];
        cx=3;
        I2C1_WriteNBytes(Addr, p1, cx);
           
     
//    CPrint(" Alert MASK_EN_REG register 07h <- 24000 pour 6 A\r\n");
    //    tmp[0]=INA226_ALERT_LIMIT_REG;
    //    // 24000 pour 6Amps
    //    tmp[1]=0x5D;
    //    tmp[2]=0xC0;
        
        CPrint
(" Alert MASK_EN_REG register 07h <- 2400 pour 0.6 A\r\n");
        tmp[0]=INA226_ALERT_LIMIT_REG;
        // 2400 pour 0.6Amps
        tmp[1]=0x09;
        tmp[2]=0x60;
        Addr=INA226_ADDR;
        p1=&tmp[0];
        cx=3;
        I2C1_WriteNBytes(Addr, p1, cx);
            
        Addr
= INA226_ADDR;
        tmp[0]=0;
        tmp[1]=0;
        p1=&tmp[0];
        I2C1_ReadDataBlock(Addr,INA226_CURRENT_REG, p1,3);
        k=(tmp[0]<<8) + tmp[1];
         sprintf(CRam1," Mesure de courant % 5d mA \r\n",k);
        Print(CRam1);
     
        Addr
= INA226_ADDR;
        tmp[0]=0;
        tmp[1]=0;
        p1=&tmp[0];
        I2C1_ReadDataBlock(Addr,INA226_ALERT_LIMIT_REG, p1,3);
        k=(tmp[0]<<8) + tmp[1];
        Seuil_Alerte= 8.192 * (float)/ 32768;
        sprintf(CRam1," Seuil d'alerte %3.3f Amperes\r\n",Seuil_Alerte);
        Print(CRam1);
      
        
        Addr
= INA226_ADDR;
        tmp[0]=0;
        tmp[1]=0;
         tmp[2]=0;
        p1=&tmp[0];
        I2C1_ReadDataBlock(Addr,INA226_MAN_ID_REG, p1,3);  // 2260
        k=(tmp[0]<<8) + tmp[1];
        sprintf(CRam1," INA Manufactuer  0x%04X\r\n",k);
        Print(CRam1);
        
        Addr
= INA226_ADDR;
        tmp[0]=0;
        tmp[1]=0;
         tmp[2]=0;
        p1=&tmp[0];
        I2C1_ReadDataBlock(Addr,INA226_ID_REG, p1,3);  // 2260
        k=(tmp[0]<<8) + tmp[1];
        sprintf(CRam1," INA Identifiant 0x%04X\r\n",k);
        Print(CRam1);
   
        CPrint
(" Fin de parametrage INA226... OK\r\n\r\n");
  }


int Lecture_INA_mA()
{
 
     Addr
= INA226_ADDR;
    tmp[0]=0;
    tmp[1]=0;
    p1=&tmp[0];  
    I2C1_ReadDataBlock
(Addr,INA226_CURRENT_REG,p1,3);
    mA=(tmp[0]<<8) + tmp[1];
    return(mA);
}


void Mesures_INA226(void)
{

    Addr= INA226_ADDR;
    tmp[0]=0;
    tmp[1]=0;
    p1=&tmp[0];
    I2C1_ReadDataBlock(Addr,INA226_BUS_REG, p1,3);
    mvU=(tmp[0]<<8) + tmp[1];
         
    Addr
= INA226_ADDR;
    tmp[0]=0;
    tmp[1]=0;
    p1=&tmp[0];  
    I2C1_ReadDataBlock
(Addr,INA226_SHUNT_REG,p1,3);
    mvA=(tmp[0]<<8) + tmp[1];
    
        Addr
= INA226_ADDR;
        tmp[0]=0;
        tmp[1]=0;
        p1=&tmp[0];
        I2C1_ReadDataBlock(Addr,INA226_ALERT_LIMIT_REG, p1,3);
        k=(tmp[0]<<8) + tmp[1];
        Seuil_Alerte= 8.192 * (float)/ 32768;
   //     sprintf(CRam1," Seuil d'alerte %3.3f Amperes\r\n",Seuil_Alerte);
   //     Print(CRam1);
 
    Addr
=INA226_ADDR; 
    tmp
[0]=0; tmp[1]=0;
    p1=&tmp[0]; // pointeur sur debut de table
    I2C1_ReadDataBlock(Addr,INA226_MASK_EN_REG,p1,2);
    ALERTE_STATUS= (tmp[0]<<8) + tmp[1];
    AFF_Flag=(ALERTE_STATUS & 0x00F0)>>4;
    
     if
(AFF_Flag==1)   Led_Rouge=0;  // allume led
    
      Addr
= INA226_ADDR;
      tmp[0]=0;
      tmp[1]=0;
      p1=&tmp[0];
      I2C1_ReadDataBlock(Addr,INA226_CURRENT_REG, p1,3);
      mA=(tmp[0]<<8) + tmp[1];
     //   sprintf(CRam1," Mesure de courant % 5d mA \r\n",mA);
     //   Print(CRam1);
             
    Addr
= INA226_ADDR;
    tmp[0]=0;
    tmp[1]=0;
    p1=&tmp[0];
    I2C1_ReadDataBlock(Addr,INA226_PWR_REG, p1,3);
    k=(tmp[0]<<8) + tmp[1];
    Power= (float)/ 2500.0;

}
#endif
 



et dans le main, boucle principale


Code : Tout sélectionner

#ifdef With_INA226
        Mesures_INA226();
        Addr=LCD_ADDR; 
      
//  sprintf(CRam1," mvA=% 5d mvU=% 5d ",mvA,mvU);
      //  LCD_Write_Text_At(2,1,CRam1);
      //  strcat(txt,CRam1);
      //  Print(CRam1);
        Volts = mvU * 1.25 / 1000;
        Amps = mvA * 2.5/10000.0;  // (5120/2048=2.5)
        sprintf(CRam1," %2.2f V  %2.3f A  .",Volts,Amps);
        if (AFF_Flag==1) 
        
{
        *(CRam1+19)='O';
          IBT2_Enable=0;  
          k1_PWM
=0;k2_PWM=0;
          PWM1_LoadDutyValue(0);
          PWM2_LoadDutyValue(0);
          CPrint("\r\n Alarm Over_current ..faire un reset\r\n");
        }
        Print(CRam1);
        LCD_Write_Text_At(3,1,CRam1); 
        Power
=Volts*Amps;
        sprintf(CRam1," %3.3f W  Seuil=%3.3f  ",Power,Seuil_Alerte);
        Print(CRam1); 
        LCD_Write_Text_At
(4,1,CRam1); 
        CRam1
[0]=0;
        CRLF1();
        Nb_Boucles ++; 
#endif

 


il faudra adapter la calibration INA ... car mes tests ont été faits sur un petit moteur < 250mA
2 mesures INA ..avec 2 adresse I2C en parametre pour le choix de vantail.(moteur)
le parametrage des 2 devrait etre identique .

certaines mesures / parametres INA pourront être éliminés pour simplifier
ex: mesure de puissance, mesure de tension induit , detection ALERTE (puisqu'on est en hardware)
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 13 invités