Skip to content
Snippets Groups Projects
simple_example_resistance_calculation.py 7.13 KiB
Newer Older
##!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ==============================================================================
# MODULE INFO
# ==============================================================================
"""
Module: simple_example_resistance_calculation
Description: Simple example of resistance calculation

    [fr] Exemple simple de calcul de valeurs de resistance pour pont diviseur
    [en] Simple example of calculating resistance values for a divider bridge

    Copyright (c) 2025 LAPLACE, UMR INP-UPS-CNRS N°5213

    Permission is hereby granted, of charge, any person obtaining a copy
    of self software and associated documentation files (the "Software"), deal
    in the Software without restriction, without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, to permit persons to whom the Software is
    furnished to do so, to the following conditions:

    The above copyright notice and self permission notice shall be included in
    all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WARRANTY OF ANY KIND, OR
    IMPLIED, BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR OTHER
    LIABILITY, IN AN ACTION OF CONTRACT, OR OTHERWISE, FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.
"""


# =============================================================================
# IMPORTS LIBRAIRIES
# =============================================================================
# Ajout du chemin d'accès du module `voltage_divider_calculator.py` dans le fichier `example_resistance_calculation.py`
# Ajoute un chemin au sys.path, pour permettre à Python de trouver et d'importer des modules
# situés dans des répertoires parents :
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../")))
from src.calculator.voltage_divider import get_resistor_bridge_values
from src.calculator.e_series_gererator import generate_e_series_resistor


# =============================================================================
# INFO DEVELOPPEUR
# =============================================================================
__author__ = ["Arnauld BIGANZOLI"]
__copyright__ = "Copyright (c) 2025 LAPLACE, UMR INP-UPS-CNRS N°5213"
__credits__ = ["Arnauld BIGANZOLI"]
__license__ = "GNU GPLv3"
__version__ = "1.0.0"
__maintainer__ = "Arnauld BIGANZOLI"
__email__ = "arnauld.biganzoli@laplace.univ-tlse.fr"
__status__ = "Development"


# ==============================================================================
# MAIN (LOCAL TESTS AND EXAMPLES)
# ==============================================================================
if __name__ == "__main__":
    # Démo d'utilisation de la fonction de calcul de résistance pour pont diviseur

    # Exemple de calcul de valeurs de resistance pour pont diviseur
    # pour une tension d'alimentation de 5 V et une tension de sortie de 4 V
    # avec des resistances de 4 k à 10k de la serie E6, dont la somme maximale ne doit pas dépasser 15000 ohms
    # et une erreur minimale de 0.6 V qui permettant de valider les valeurs de resistances calculées.
    # Changer la valeur de l'erreur minimale pour voir l'impact sur les valeurs de resistances calculées.
    # Les valeurs de resistances calculées seront affichées dans le terminal.
    # 
    # Voici la sortie attendue de cette exemple simple :
    # -------------------------------------------------
    # Pour une tension d'alimentation de 5 V et une tension de sortie de 4 V,
    # si l'on prend des valeurs de résistances entre 4.0 k à 10.0 k dans la série E6, soit [4700, 6800, 10000] en ohms,
    # et que l'on souhaite que la somme maximale de R1 + R2 ne dépasse pas 15 kohms, avec une erreur minimale de 0.6 V,
    # alors les valeurs de résistances retournées sont :
    # 
    # R1 =  4700 ohms
    # R2 = 10000 ohms
    # 
    # La tension de sortie calculée est de 3.401 V
    # L'erreur de calcul est de 0.5986 V
    # L'erreur maximale autorisée était de 0.600 V
    # 
    # L'erreur de calcul est inférieure à l'erreur maximale autorisée, les valeurs de résistances sont validées  
    Vout = 4  # Tension de sortie
    r_start = 4000  # Valeur minimale de la résistance
    r_end = 10000  # Valeur maximale de la résistance
    serie = "E6"  # Test the function with E6 serie
    max_somme = 15000  # Somme maximale des resistances
    resistor_in_serie = generate_e_series_resistor(
        r_start, r_end, serie
    )  # Generate resistors values from E serie
    # erreur_min = 0.5  # Seuil d'erreur acceptable non atteint
    erreur_min = 0.6  # Seuil d'erreur acceptable atteint

    # Trouver les valeurs résistances du pont diviseur
    R1, R2 = get_resistor_bridge_values(
        Vin, Vout, max_somme, resistor_in_serie, erreur_min
    )

    # Affichage des valeurs de résistances trouvées
    print(
        f"\nPour une tension d'alimentation de {
            Vin} V et une tension de sortie de {Vout} V,"
        f"si l'on prend des valeurs de résistances entre {
            r_start/1000} k à {r_end/1000} k dans la série {serie}, soit {resistor_in_serie} en ohms,"
    )
    # Afficher max_somme/1000 pour afficher la valeur en kOhms sans la partie décimale
    print(
        f"et que l'on souhaite que la somme maximale de R1 + R2 ne dépasse pas "
        + f"{round(max_somme/1000)} kohms, avec une erreur minimale de {erreur_min} V,"
    )
    # print("alors les valeurs de résistances retournées sont:")
    # print(f"R1 = {int(R1)} ohms")
    # print(f"R2 = {int(R2)} ohms\n")

    # Calcul de la longeur de la chaîne pour la valeur de la somme des résistances pour l'affichage
    # Calculer la longueur de max_somme
    str_resistor_value_len = len(str(max_somme))
    print("alors les valeurs de résistances retournées sont :\n")
    print(f"R1 = {int(R1):>{str_resistor_value_len}} ohms")
    print(f"R2 = {int(R2):>{str_resistor_value_len}} ohms\n")

    # Calcul de la tension de sortie avec les valeurs de résistances trouvées
    print(f"La tension de sortie calculée est de {Vout_calc:.3f} V")
    print(f"L'erreur de calcul est de {abs(Vout_calc - Vout):.4f} V")
    print(f"L'erreur maximale autorisée était de {erreur_min:.3f} V\n")

    # Comparaison de l'erreur de calcul avec l'erreur maximale autorisée
    if abs(Vout_calc - Vout) < erreur_min:
        print(
            "L'erreur de calcul est inférieure à l'erreur maximale autorisée, les valeurs de résistances sont validées\n"
        )
    else:
        print(
            "L'erreur de calcul est supérieure à l'erreur maximale autorisée, les valeurs de résistances ne satisfont pas les critères de calcul !\n"
        )
        print(
            "Il est recommandé de revoir les valeurs de résistances du pont diviseur, en changeant la valeur de la résistance de départ, la série de résistances ou l'erreur minimale autorisée.\n"
        )