## 📌 Descripción General

Este proyecto permite **visualizar y analizar señales de encoders rotativos** y su relación con la frecuencia de muestreo y la resolución angular eléctrica.

Incluye dos módulos principales:

1. **`gui.py`** → Aplicación interactiva con interfaz gráfica en Tkinter y gráficos integrados en Matplotlib.
2. **`main.py`** → Script de análisis comparativo de parámetros de encoders, graficando la relación entre RPM, CPR, pares de polos y precisión angular.

---

## 🎯 Objetivo

El propósito principal de este proyecto es **estudiar el fenómeno de aliasing en señales de encoders**.

Cuando un encoder gira, genera pulsos eléctricos a una frecuencia proporcional a la velocidad del motor y al número de clics por revolución (CPR).
Si la **frecuencia de muestreo** no es al menos el doble de la frecuencia de la señal del encoder (criterio de Nyquist), se produce **aliasing**, es decir, la señal muestreada pierde fidelidad y puede aparentar tener otra frecuencia distinta a la real.

Este software permite:

* **Visualizar en tiempo real** cómo cambian las señales del encoder al variar RPM, CPR, desfase y número de ciclos.
* **Superponer las líneas de muestreo** para observar cuándo la frecuencia de sampleo es insuficiente.
* **Comparar distintos CPR y pares de polos**, analizando la precisión angular eléctrica y su impacto en la medición.

De esta forma, el usuario puede **experimentar interactivamente el aliasing** y comprender las limitaciones prácticas en sistemas de control que usan encoders y muestreo digital.

---

## ⚙️ Requisitos

* **Python 3.8+**
* Librerías necesarias:

  ```bash
  pip install numpy scipy matplotlib
  ```

  (Tkinter viene incluido con la mayoría de instalaciones de Python).

---

## 🖥️ Módulo 1: `gui.py`

### 🎯 Funcionalidad

Este módulo implementa un **visualizador gráfico interactivo** para observar las señales cuadradas generadas por un **encoder rotativo** en función de:

* **RPM (Revoluciones por minuto)**
* **CPR (Clicks por revolución)**
* **Frecuencia de sampleo (Hz)**
* **Desfase entre señales (°)**
* **Número de ciclos a mostrar**

También permite visualizar:

* Canal A y/o Canal B del encoder.
* Líneas verticales que representan el instante de muestreo.

### 📊 Flujo de trabajo

1. Se capturan los parámetros introducidos en la GUI.
2. Se calcula la **frecuencia del encoder**:

   ```
   fEncoder = (RPM * CPR) / 60
   ```
3. Se generan señales cuadradas usando `scipy.signal.square`:

   * **Canal A**: fase base.
   * **Canal B**: desfase de -90° (π/2 rad).
4. Se representa en tiempo la señal de ambos canales y las líneas de sampleo.
5. El gráfico se actualiza dinámicamente con cada cambio.

### 🖼️ Interfaz

* **Panel izquierdo (control)**:

  * Slider para ajustar RPM (con paso de 10).
  * Entradas para CPR, frecuencia de sampleo, desfase y número de ciclos.
  * Checkboxes para activar/desactivar canales y líneas de sampleo.
  * Botón de actualización manual.
* **Panel derecho (visualización)**:

  * Gráfico dinámico en Matplotlib embebido en Tkinter.

---

## 🖥️ Módulo 2: `main.py`

### 🎯 Funcionalidad

Este módulo realiza un **análisis comparativo** mediante gráficos de dos fenómenos relacionados con encoders:

1. **Relación RPM – Frecuencia del encoder**
   Para diferentes valores de CPR, se grafica cómo aumenta la frecuencia de la señal del encoder según la velocidad de giro.
   Además, se incluye una línea horizontal indicando el límite de Nyquist (`fs/2`) para evaluar aliasing.

2. **Relación CPR – Precisión angular eléctrica**
   Para diferentes pares de polos de un motor, se grafica la relación entre CPR y el ángulo eléctrico mínimo detectable.

### 📊 Flujo de trabajo

1. Se define un rango de velocidades `n_motor` (0–3000 RPM).
2. Se consideran varios valores de CPR `[200, 300, 500, 1000, 2000]`.
3. Se calcula la frecuencia de salida del encoder:

   ```
   fEncoder = (RPM * CPR) / 60
   ```
4. Se grafica **frecuencia vs RPM** para cada CPR con límite de Nyquist.
5. Se calcula la precisión angular eléctrica:

   ```
   gradoMecanico = 360 / CPR
   gradoElectrico = gradoMecanico * (pares de polos)
   ```
6. Se grafica **precisión eléctrica vs CPR** para distintos pares de polos.

### 🖼️ Salida

* **Gráfico 1**: Velocidad vs Frecuencia del encoder (comparando CPR).
* **Gráfico 2**: CPR vs Precisión del ángulo eléctrico (comparando pares de polos).

---

## 🚀 Ejecución

* Para abrir la **interfaz gráfica**:

  ```bash
  python gui.py
  ```
* Para ejecutar el **análisis comparativo**:

  ```bash
  python main.py
  ```

---

## 📂 Estructura del Proyecto

```
.
├── gui.py   # Visualizador interactivo de señales de encoder
├── main.py  # Análisis comparativo de CPR, RPM y precisión angular
└── README.md
```

---

## 🔧 Posibles Extensiones

* Guardar configuraciones en un archivo externo (ej. JSON).
* Exportar gráficos en formato PNG o PDF.
* Añadir simulación de ruido en las señales.
* Implementar interpolación y detección de aliasing.

---

¿Quieres que también te agregue un **ejemplo práctico de aliasing** (con valores de RPM, CPR y fs que lo provoquen) en este README?
