Bonjour,
J'ai réalisé un moniteur de charge batterie à partir d'un esp32 et d'un ina 226.
J'ai des résultats totalement incohérents et aléatoires quand il s'agit de calculer la décharge avec le coefficient de peukert.
voici la fonction en cause :
// fonction lambda lancement calcul charge décharge
auto amp_to_cap_function = [](float courant) ->float {
if (premierDemarage) {
Cap = CapNomiPeuk;
premierDemarage = false;
}
float t = 3600000 / t_callback;
if (courant > 0) {
Cap = Cap + (courant * (ChargeEfficiencyFactor->get_value() / 100) / t);
} else {
float c = - courant;
Cap = Cap - (pow(c, Coef->get_value()) / t);
}
if (Cap > CapNomiPeuk) {Cap = CapNomiPeuk;}
PourCharge = Cap / CapNomiPeuk * 100;
return (Cap);
};
Le code en entier se trouve ici : https://github.com/mat214/sensCoulo/blob/main/src/main.cpp
Je m'en remet à vous car je n'arrive pas à voir ce qui cloche ...
je tenterais ça
float t = 3600000.0 / t_callback;
terwal
July 21, 2023, 8:02am
3
Comme ça juste avec une partie de ton code et des formules que l'on ne connait pas nécessairement, c'est difficile à dire.
En tout cas ton code ne me semble pas avoir d'erreur frappante, hormis l'incohérence de type remonté par @fdufnews , mais qui ne devrait pas engendré des différences de résultats.
je suppose que tu ais 36000 ou 36000,0(ou un nombre approchant) cela ne devrait pas changer tes résultats.
Peut être que si tu donnais tes résultats aberrants et les valeurs qui ont données se résultat, quelqu'un aurait peut être une idée.
J-M-L
July 21, 2023, 8:23am
4
le mieux reste de poster tout le code ici. Généralement l'experience montre que l'on se trompe souvent sur la source du problème (Snippets R Us! )
par exemple j'ai vu que vous aviez
if ((Vi > 14,75) and (v > 13,75) and (v < 13,85)) {
➜ l'usage de la virgule à la place du point décimal ne va pas faire ce que vous pensez...
ça serait interprété comme
if ((Vi > 75) and (v > 75) and (v < 85)) {
ensuite effectivement faire attention aux calculs entiers quand on veut des nombre décimaux
Merci pour vos réponses qui m'ont amené sur la bonne voie. En effet il s'agissait d'un problème de type de variable dans le calcule de puissance.
comme cela ça fonctionne correctement :
float c = - courant;
float pk = Coef->get_value();
Cap = Cap - (pow(c, pk) / t);
Je pense que Coef->get_value() ne retourne pas un float correctement pris en compte dans la fonction pow().
J-M-L
July 22, 2023, 8:49am
6
si il suffit de lire le code, vous avez une variable protected de type float qui est retournée par get_value()
class FloatConfig : public Configurable {
public:
FloatConfig(float value, String config_path,
String description, int sort_order = 1000)
: value_(value),
Configurable(config_path, description, sort_order) {
load_configuration();
}
virtual void get_configuration(JsonObject& doc) override;
virtual bool set_configuration(const JsonObject& config) override;
virtual String get_config_schema() override;
float get_value() { return value_; }
protected:
float value_ = 0.0;
};
ceci reste un souci cela dit...
system
Closed
January 18, 2024, 8:49am
7
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.