User avatar
Magikbat
Posts: 3
Joined: Wed Jun 12, 2019 9:29 am

Posible problema de optimización

Wed Jun 12, 2019 10:18 am

Buenos días, soy Magikbat, nuevo por este foro y vengo a pediros ayuda con un proyecto que estoy realizando con mi Raspberry Pi 3 Model B. Se trata de realizar un cargador de coche eléctrico (EVSE - Electric Vehicle Supply Equipment) con el estándar J1772 de OpenEVSE. Mi nivel de programación con Python es básico, así que si veis alguna chapuza estoy abierto a sugerencias.

Mi sistema se compone de la Raspberry, un L298N (un puente-H que me genera la señal de onda cuadrada que necesita el J1772) y un ADS1115 (un ADC para leer el estado en alto de la señal de onda cuadrada).

Mi problema llega cuando al ejecutar el código, no consigo que se realice con la suficiente rapidez como para que la señal de onda cuadrada que necesito llegue a 1 kHz de frecuencia. La parte que está constantemente en ejecución he comprobado mediante unos comandos que tarda en ejecutarse muchísimo mas tiempo del que necesito, sobre todo en la parte de los condicionantes (unos 0.05s, cuando todo el programa debería hacerse en 0,001s).

¿Estoy buscando algo imposible con mi proyecto? ¿Tenéis alguna idea de en qué estoy fallando? ¿Es falta de optimización de código? ¿Podría hacerlo mejor de otra manera?

Aquí les dejo el código explicado lo mejor posible:

Code: Select all

import RPi.GPIO as GPIO
import board
import busio
import adafruit_ads1x15.ads1115 as ADS
from adafruit_ads1x15.analog_in import AnalogIn
from time import *

# Defino GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
# LED/RELE
LED=22
GPIO.setup(LED, GPIO.OUT) #Defino pin 22 como salida LED/RELE
GPIO.output(LED, False)
# Permiso APP
APP=23
GPIO.setup(APP, GPIO.OUT) #Defino pin 23 como salida APP
GPIO.output(APP, False)
# Motor A
INA_1=17
INA_2=18
GPIO.setup(INA_1, GPIO.OUT)
GPIO.setup(INA_2, GPIO.OUT)
GPIO.output(INA_1, False)
GPIO.output(INA_2, False)

# Create the I2C bus
i2c = busio.I2C(board.SCL, board.SDA)
# Create the ADC object using the I2C bus
ads = ADS.ADS1115(i2c)
# Create single-ended input on channel 0
chan = AnalogIn(ads, ADS.P0)

try:
    while True:
        GPIO.output(INA_1, True) #Pongo en alto la señal de onda cuadrada
        
        if float(chan.voltage) > 3.58: #Los +12V que debería leer se han escalado a 4.096V (el máximo que lee el ADC)
            GPIO.output(LED, False)
            print(">>>>> ESTADO_A - Not Connected <<<<<")
            
        else:
            if (2.56 < float(chan.voltage) <=  3.58):
                GPIO.output(LED, False)
                print(">>>>> ESTADO_B - EV Connected (Ready) <<<<<")
            elif (1.54 < float(chan.voltage) <=  2.56) and (GPIO.input(APP)==True): #La señal APP es un permiso que doy desde otro dispositivo como método de seguridad para el cargador (que se supone que estaría en un lugar público).
                GPIO.output(LED, True)
                print(">>>>> ESTADO_C - EV Charge <<<<<")
            elif (0.51 < float(chan.voltage) <=  1.54) and (GPIO.input(APP)==True):
                GPIO.output(LED, True)
                print(">>>>> ESTADO_D - EV Charge (Vent. Req.) <<<<<")
            else:
                GPIO.output(LED, False)
                print(">>>>> ESTADO_E - ERROR <<<<<")

            sleep(0.0002) #Este sleep mantiene la señal que puse en alto un 25% del tiempo de la frecuencia que necesito para controlar el amperaje mediante el duty cycle)
            GPIO.output(INA_1, False)
            GPIO.output(INA_2, True) #Pongo la señal de onda cuadrada en -12V mediante el Puente-H
            sleep(0.0008) #Mantengo la señal en -12V el resto del tiempo para mi frecuencia de 1kHz
            GPIO.output(INA_2, False)
            GPIO.output(INA_1, True)

# CTRL+C para parar
except KeyboardInterrupt:
    GPIO.output(INA_1, False)
    GPIO.output(INA_2, False)
    GPIO.output(LED, False)
    GPIO.output(APP, False)
    pass
señal.stop()
GPIO.cleanup()
Muchas gracias por su atención.

Return to “Español”