162 lines
5.2 KiB
Markdown
162 lines
5.2 KiB
Markdown
## 📌 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?
|