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 ---
Forum général sur le langage C !

Modérateur : Jérémy

Projet "superviseur de charge" pour batteries
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#11 Message par djviper16 » mer. 29 déc. 2021 16:13

Bonjour Paulfjujo,

paulfjujo a écrit :Source du message je suppose que c'est pour interfacer les 4 signaux
3 entrées Clock ,Data, et CS et 1 sortie DOut ...pour chacun des ADC 10bits SPI MCP3002

Tout à fait

paulfjujo a écrit :Source du message combien (maxima possible) de cellules envisages tu de mettre en série ?
cellule Li-ion ?
de 4.1V,au max de charge ?
capacité en maH ou AH ?
d'ou Maxi Intensité ?

4 batteries maximum pour commencer, et je parle de batteries 12V au plomb ou gel, de capacité de quelques 10ènes d'Ah à plus de 100Ah.

paulfjujo a écrit :Source du message mesure de temperature sur chaque cellule ?

Ce n'est pas prévu, il n'y a pas autant de risque que pour du Li-Ion, LifePo4 etc

paulfjujo a écrit :Source du message as-tu deja preparé un schema ?

Pas encore, j'ai juste gribouillé un petit schéma de principe.

paulfjujo a écrit :Source du message Est-ce qu'un circuit specialisé serait plus approprié ?

Je ne sais pas si ça existe pour les batteries 12V, je ne connaissais pas, c'est intéressant comme composant ! À voir...

L'idée est de maintenir chargées en permanence 4 batteries 12V en série qui alimentent un gros onduleur 230V.
Aujourd'hui on trouve des chargeurs avec la fonction 'maintien de charge", mais le soucis étant qu'il en faut un par batterie.
Avec ce superviseur de charge, j'espère maintenir chargées les 4 batteries avec un seul chargeur (du commerce).

Image

Projet "superviseur de charge" pour batteries
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#12 Message par paulfjujo » mer. 29 déc. 2021 16:58

OK, pas besoin de mesure de temperature pour des batteries au plomb ..

Mais Quid des mesures de courant ?

j'ai pas mal travaillé sur unprojet d'arrosage de plantes autonome: al imentation par panneau solaire + batterie 12V 7AH
avec possibilité aussi, de recharger la batterie via secteur ..
management du courant (valeur et sens du courant) et des tensions batterie ,et Panneau solaire
..reglage du courant par PWM
et suivi de l'evolution tension
et bien sur la periodicité et duree arrosage ..

projet en stand by actuellement.. sur ces points bloquants ..
capteur d'humidité dans la terre .. trop peu fiable => remplacé par DHT11 (dans le feuillage !)
electrovanne fonctionnant à pression tres faible , voir nulle .
une piste : elevation de la sortie tuyau au dessus du niveau cuve ou vanne motorisée ..
j'ai installé entre-temps une cuve de 350L recup eau de pluie .. ce qui va bientot me forcer à relancer mon projet

comme capteur de courant : ACS712 (effet hall) sortie analogique .. avec un zero flottant à U alim / 2
remplacé ensuite par un capteur INA219 (shunt + ADC numérique)
bien plus fiable et precis, mesure coté High Side .. avec mesure aussi de la tension !
Aide toi, le ciel ou FantasPic t'aidera

Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#13 Message par djviper16 » mer. 29 déc. 2021 19:26

paulfjujo a écrit :Source du message Mais Quid des mesures de courant ?

Je n'ai pas prévu de faire de mesure de courant pour l'instant.
Une simple mesure de tension me semble suffisante pour contrôler l'auto-décharge.
Mais puisque je n'utilise qu'un chargeur pour 4 batteries, il serait assez facile de placer un shunt en sortie de celui ci.

Intéressant ton projet aussi !

Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#14 Message par djviper16 » jeu. 30 déc. 2021 23:47

Bonsoir,

J'arrive maintenant à afficher des chaines de caractères contenues dans un tableau "Menus", avec leurs paramètres associés dans un second tableau.

Les paramètres sont :
- choix de la taille des caractères 7px ou 10px
- surbrillance ou non
- numéro de page (ligne)
- décalage pour centrer le texte

J'arrive aussi à afficher une valeur contenue dans une variable. :-D

Je vous joins le projet si vous voulez jeter un oeil au code.

Les 5 fichiers sur lesquels j'ai travaillé sont :
- main.c
- Oled_SSD1306.c
- interrupt_manager.c
- Fonts.h
- Menus.h

Bonne fin d'année à tous !

v2.X.zip


https://www.youtube.com/watch?v=unMmVyJ_egs
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#15 Message par djviper16 » lun. 13 févr. 2023 01:44

Bonjour à tous,

J'essaye de reprendre ce projet qui me tient à cœur.

J'ai passé quelques soirées pour faire un menu de réglage de la luminosité, et maintenant j'aimerais communiquer en SPI avec mon MCP3002.

Le soucis, je n'arrive même pas à générer l'horloge SCK (broche RC1).

À l'oscilloscope je ne vois pas de signal carré, j'ai soit un 0V soit un 5V en fonction de la config du bit CKP du registre SPI1CON1. Ce qui me laisse penser que déjà, ma

Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#16 Message par djviper16 » lun. 13 févr. 2023 01:44

Bonjour à tous,

J'essaye de reprendre ce projet qui me tient à cœur.

J'ai passé quelques soirées pour faire un menu de réglage de la luminosité, et maintenant j'aimerais communiquer en SPI avec mon MCP3002.

Le soucis, je n'arrive même pas à générer l'horloge SCK (broche RC1).

À l'oscilloscope je ne vois pas de signal carré, j'ai soit un 0V soit un 5V en fonction de la config du bit CKP du registre SPI1CON1. Ce qui me laisse penser que déjà, ma

Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#17 Message par djviper16 » lun. 13 févr. 2023 01:44

Bonjour à tous,

J'essaye de reprendre ce projet qui me tient à cœur.

J'ai passé quelques soirées pour faire un menu de réglage de la luminosité, et maintenant j'aimerais communiquer en SPI avec mon MCP3002.

Le soucis, je n'arrive même pas à générer le signal d'horloge SCK (broche RC1). J'ai essayé avec plusieurs source dans le registre SPI1CLK, sans succès.

À l'oscilloscope je ne vois pas de signal carré, j'ai soit un 0V soit un 5V en fonction de la config du bit CKP du registre SPI1CON1. Ce qui me laisse penser que déjà, ma broche RC1 est correctement assignée.

Mon init ressemble à ça :

Code : Tout sélectionner

#include "mcc_generated_files/mcc.h"
#include <xc.h>


//--------------------------------------------------------------------------------------------
void init_SPI (void)
//--------------------------------------------------------------------------------------------
{
    TRISCbits.TRISC0 = 0;   //RC0 output    //Din MCP3002
    TRISCbits.TRISC1 = 0;   //RC1 output    //CLK MCP3002
    TRISCbits.TRISC2 = 0;   //RC2 output    //CS MCP3002
    TRISCbits.TRISC6 = 1;   //RC6 input     //Dout MCP3002
    
    
    WPUC 
= 0b01011111;      //RC6 / RC2 / RC1 / RC0 pull-up (+ RC3 et RC4 pour garder la config I2C)
    ODCONC = 0b01011111;    //RC6 / RC2 / RC1 / RC0 open drain (+ RC3 et RC4 pour garder la config I2C)
   
    
    
//Remap des pin        
    RC0PPS = 0b00011111;    //RC0 en SDO (voir PPS OUTPUT REGISTER DETAILS p.282)
    RC6PPS = 0b00010100;    //RC6 en SDI (voir PPS INPUT REGISTER DETAILS p.280)
    RC1PPS = 0b00011110;    //RC1 en SCK (voir PPS OUTPUT REGISTER DETAILS p.282)
    RC2PPS = 0b00100000;    //RC2 en SS (voir PPS OUTPUT REGISTER DETAILS p.282)
            

    SPI1CON0 
= 0b00000011;  //SPI CONFIGURATION REGISTER 0 p.539
    SPI1CON1 = 0b11100111;  //SPI CONFIGURATION REGISTER 1 p.540
    SPI1CON2 = 0b00000100;  //SPI CONFIGURATION REGISTER 2 p.541

        
    SPI1CLK 
= 0b00000010;   //config horloge en MFINTOSC (SPI CLOCK SELECTION REGISTER p.543)
    
    
    SPI1INTE 
= 0x00;        //SPI INTERRUPT ENABLE REGISTER p.536
    SPI1INTF = 0x00;        //SPI INTERRUPT FLAG REGISTER p.535
    SPI1BAUD = 0x00;        //SPI BAUD RATE REGISTER p.539
    SPI1TWIDTH = 0x00;      //SPI TRANSFER WIDTH REGISTER p.538
    SPI1STATUS = 0x00;      //SPI STATUS REGISTER p.542
    SPI1TCNTH = 0x00;       //SPI TRANSFER COUNTER MSB REGISTER p.538
    SPI1TCNTL = 0x00;       //SPI TRANSFER COUNTER LSB REGISTER p.537
    SPI1TXB = 0x00;         //SPI TRANSMIT BUFFER REGISTER p.543
    SPI1RXB = 0x00;         //SPI READ BUFFER REGISTER p.542
    
    
    SPI1CON0bits
.EN = 1;  //active le module SPI, (faire la config avant)

}


Merci pour votre aide

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#18 Message par satinas » lun. 13 févr. 2023 05:07

Bonjour djviper16,
Les inputs PPS se programment différemment des outputs. Au lieu de faire Pin = Fonction, on fait Fonction = Pin, cela permet de mettre plusieurs fonctions input sur une même pin, et une fonction output peut sortir sur plusieurs pins différentes.

Voir page 278 la sélection de la pin input PPS dans les registres xxxPPS.
SPI1SDIPPS = 0b00010110 (RC6 en SDI voir PPS INPUT REGISTER DETAILS p.278 et 280)

Il y a sans doute d'autres problèmes car le port SPI devrait quand même démarrer.
Les pins qui fonctionnent en analogique et numérique démarrent en mode analogique, voir le registre ANSELC.
Pourquoi activer pull-up et open drain sur les pins SPI ?

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#19 Message par djviper16 » lun. 13 févr. 2023 14:39

Bonjour Satinas,

Merci, j'ai modifié mon init suite à tes remarques pertinentes, mais c'est pas beaucoup mieux. J'ai 1V sur RC1 et pareil sur RC0, toujours pas de clock, je pige pas.

J'ai essayé des choses, rajouté la séquence PPSLOCK, tripatouillé les registres de config mais rien n'y fait.

J'ai mis des pull-up car je souhaite travailler sur le 0 logique, et les open drain pour correspondre à ce que je fais dans l'init de l'I2C. Sachant que l'I2C ne fonctionne pas si je ne mets pas les broches en open drain.

L'init du spi modifiée (ne fonctionne toujours pas) :

Code : Tout sélectionner

#include "mcc_generated_files/mcc.h"
#include <xc.h>


//--------------------------------------------------------------------------------------------
void init_SPI (void)
//--------------------------------------------------------------------------------------------
{
    ANSELC = 0x00;          //PortC en numérique
    TRISCbits.TRISC0 = 0;   //RC0 output    //Din MCP3002
    TRISCbits.TRISC1 = 0;   //RC1 output    //CLK MCP3002
    TRISCbits.TRISC2 = 0;   //RC2 output    //CS MCP3002
    TRISCbits.TRISC6 = 1;   //RC6 input     //Dout MCP3002
    
    
    WPUC 
= 0b01011111;      //RC6 / RC2 / RC1 / RC0 pull-up (+ RC3 et RC4 pour garder la config I2C)
    ODCONC = 0b01011111;    //RC6 / RC2 / RC1 / RC0 open drain (+ RC3 et RC4 pour garder la config I2C)
   
    
    
/////////////Remap des pin////////////
    PPSLOCK = 0x55;             //special sequence
    PPSLOCK = 0xAA;
    PPSLOCK = 0b00000000;       // PPS selections can be changed       
    
    RC0PPS 
= 0b00011111;        //SDO sort en RC0 (voir PPS OUTPUT REGISTER DETAILS p.282 et p.278)
    RC1PPS = 0b00011110;        //SCK sort en RC1 (voir PPS OUTPUT REGISTER DETAILS p.282 et p.278)
    RC2PPS = 0b00100000;        //SS sort en RC2 (voir PPS OUTPUT REGISTER DETAILS p.282 et p.278)
    SPI1SDIPPS = 0b00010110;    //SDI rentre en RC6 (PPS INPUT REGISTER DETAILS p.280 et p.278)
            
    PPSLOCK 
= 0x55;             //special sequence
    PPSLOCK = 0xAA;
    PPSLOCK = 0b00000001;       // PPS is locked
    ////////////////////////////////////////
    
    
    
    
    SPI1CON0bits
.EN = 0;    //desactive le module SPI
    
    SPI1CLK 
= 0x00;         //config horloge en FOSC (SPI CLOCK SELECTION REGISTER p.543)
    SPI1BAUD = 0xFF;        //64Mhz/(2x256) = 125KHz (SPI BAUD RATE REGISTER p.539)
    SPI1TWIDTH = 0x00;      //8bits (SPI TRANSFER WIDTH REGISTER p.538)
    SPI1INTE = 0x00;        //SPI INTERRUPT ENABLE REGISTER p.536
    SPI1INTF = 0x00;        //SPI INTERRUPT FLAG REGISTER p.535
    
    SPI1CON0 
= 0b00000011;  //SPI CONFIGURATION REGISTER 0 p.539
    SPI1CON1 = 0b11100111;  //SPI CONFIGURATION REGISTER 1 p.540
    SPI1CON2 = 0b00000100;  //SPI CONFIGURATION REGISTER 2 p.541

    SPI1CON0bits.EN = 1;  //active le module SPI, (faire la config avant)
    
    
    
    
    
    
    
/*
    SPI1STATUS = 0x00;      //SPI STATUS REGISTER p.542
    SPI1TCNTH = 0x00;       //SPI TRANSFER COUNTER MSB REGISTER p.538
    SPI1TCNTL = 0x00;       //SPI TRANSFER COUNTER LSB REGISTER p.537
    SPI1TXB = 0x00;         //SPI TRANSMIT BUFFER REGISTER p.543
    SPI1RXB = 0x00;         //SPI READ BUFFER REGISTER p.542
    */
    
    
    
    
    

}



L'init de l'I2C (qui fonctionne avec mon écran oled) :

Code : Tout sélectionner

#include "mcc_generated_files/mcc.h"
#include <xc.h>


//--------------------------------------------------------------------------------------------
void init_I2C (void)
//--------------------------------------------------------------------------------------------
{
    TRISCbits.TRISC3 = 0;       //RC3 output
    TRISCbits.TRISC4 = 0;       //RC4 output
    WPUC       = 0x18;          //RC3 & RC4 pull-up
    ODCONC     = 0x18;          //RC3 & RC4 open drain
    RC3PPS     = 0x21;          //scl -> C3
    I2C1SCLPPS = 0x13;          //scl <- C3
    RC4PPS     = 0x22;          //sda -> C4
    I2C1SDAPPS = 0x14;          //sda <- C4
    I2C1CON0   = 0x04;          //I2C1 Control Register 0, Master mode, 7-bit address  // doc p.577
    I2C1CON1   = 0x80;          //I2C1 Control Register 1, Acknowledge value transmitted after received data (when I2CCNT=0) : 1 = NACK (Not ACKnowledge)  // doc p.579
    I2C1CON2   = 0x00;          //I2C1 Control Register 2, envoi Start non auto, SDAHT 300ns hold time, BFRET 8 i2c clock pulses  // doc p.580
    I2C1CLK    = 0b00000011;    //I2C1 Clock Selection Register, MFINTOSC 500kHz ?? 100kHz ??  // doc p. 581
    I2C1ADB1   = 0x78;          //adresse bus I2C SSD1306
    I2C1CON0bits.EN = 1;        //i2c1 on
}

[PIC18F27K42] Projet "superviseur de charge" pour 4 batteries 12V
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#20 Message par satinas » lun. 13 févr. 2023 14:59

L'open drain est obligatoire en mode I2C, pour le SPI c'est suicidaire, les pins output ne pourront pas sortir du Vdd car c'est un circuit ouvert.
Tu enlèves le pull-up et l'open drain, tu vérifies que cela démarre, ensuite tu peux mettre un pull-up sur SDI, ensuite tu remets l'open drain et cela marchera plus :)


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 52 invités