tdse-tp4_02-pwm

FIUBA - Electrónica - Taller de Sistemas Embebidos - Trabajo Práctico N°: 4 - PWM
Index Commits Files Refs README
commit 15b35c448c79fd89b6eafae5d47b573ddb0824b0
parent a5335069bd9b062c4c3215407cb381d90bad6ce0
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Mon, 27 Oct 2025 16:23:20 -0300

Added `app/*.txt`, `app/*.png`

Diffstat:
MREADME.md | 32++++++++++++++++++++++++--------
Aapp/pwm.txt | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapp/screenshot_1.png | 0
Aapp/screenshot_2.png | 0
Aapp/screenshot_3.png | 0
Aapp/screenshot_4.png | 0
Aapp/screenshot_5.png | 0
Aapp/screenshot_6.png | 0
Aapp/test_1.txt | 28++++++++++++++++++++++++++++
Aapp/test_2.txt | 14++++++++++++++
10 files changed, 132 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
@@ -2,20 +2,36 @@
 
 1. Forkear el repositorio y abrir el proyecto en STM32CubeIDE
 2. Analizar en el IOC las configuraciones del TIM3 y del RCC, sin modificarlas
-3. En PA6 colocar un cable Dupont hembra macho y dejarlo al aire. En GND colocar un cable Dupont macho macho y dejarlo al aire.
+3. En PA6 colocar un cable Dupont hembra macho y dejarlo al aire. En GND colocar
+   un cable Dupont macho macho y dejarlo al aire.
 4. Enchufar la placa NUCLEO-F103RB
 
 ## Test 1
-5. Volver al código y configurar el primer test, verificando el `#define TEST_NUMBER` (línea 18 de app.c), es decir que diga `#define TEST_NUMBER TEST_1`
+
+5. Volver al código y configurar el primer test, verificando el `#define
+   TEST_NUMBER` (línea 18 de app.c), es decir que diga `#define TEST_NUMBER
+   TEST_1`
 6. Compilar y debuggear.
-7. Colocar la punta del osciloscopio entre PA6 y GND y analizar la forma de onda mostrada. ¿Cuál es el período de la señal? ¿Se modifica? ¿Cómo se define duty cycle? Se modifica?
-8. Colocar un led entre PA6 y GND (no olvidar R de polarización) y observar la intensidad del brillo.
+7. Colocar la punta del osciloscopio entre PA6 y GND y analizar la forma de onda
+   mostrada. ¿Cuál es el período de la señal? ¿Se modifica? ¿Cómo se define duty
+   cycle? Se modifica?
+8. Colocar un led entre PA6 y GND (no olvidar R de polarización) y observar la
+   intensidad del brillo.
 
 ## Test 2
-9. Volver al código y configurar el segundo test, mediante la directiva `#define TEST_NUMBER TEST_2`
+
+9. Volver al código y configurar el segundo test, mediante la directiva `#define
+   TEST_NUMBER TEST_2`
 10. Compilar y debuggear.
-11. Colocar la punta del osciloscopio entre PA6 y GND y analizar la forma de onda mostrada. ¿Qué ocurre con el período de la señal? ¿Qué ocurre con el duty cycle?
-12. Colocar un led entre PA6 y GND (no olvidar R de polarización) y observar la intensidad del brillo.
+11. Colocar la punta del osciloscopio entre PA6 y GND y analizar la forma de
+    onda mostrada. ¿Qué ocurre con el período de la señal? ¿Qué ocurre con el
+    duty cycle?
+12. Colocar un led entre PA6 y GND (no olvidar R de polarización) y observar la
+    intensidad del brillo.
 13. Comparar resultados
 
-*Nota:* Los comentarios deberán registrarse en los archivo pwm.txt, test_1.txt y test_2.txt, en el root de la carpeta app de su repositorio. Asimismo, en esa misma ubicación se debe incorporar todo material de soporte o argumentación, tal como capturas de pantalla de computadora, capturas de pantalla de osciloscopio, fotografías, etcétera.
+*Nota:* Los comentarios deberán registrarse en los archivos `pwm.txt`,
+`test_1.txt` y `test_2.txt`, en el root de la carpeta app de su repositorio.
+Asimismo, en esa misma ubicación se debe incorporar todo material de soporte o
+argumentación, tal como capturas de pantalla de computadora, capturas de
+pantalla de osciloscopio, fotografías, etcétera.
diff --git a/app/pwm.txt b/app/pwm.txt
@@ -0,0 +1,66 @@
+Para este proyecto se configura el Timer 3 del microcontrolador para generar una
+señal PWM. Para hablar de timers es necesario primero definir a que frecuencias 
+trabajan los periféricos y buses del microcontrolador.
+
+Los relojes del microcontrolador
+
+, en particular parte del código generado por CubeMX para inicializar
+el timer se encuentra en el archivo `main.c`, en la función `MX_TIM3_Init`. Para
+habl
+
+Eliminando comentarios utilizados por CubeMX, resulta en el código a
+continuación:
+
+```c
+static void MX_TIM3_Init(void)
+{
+    TIM_MasterConfigTypeDef sMasterConfig = {0};
+    TIM_OC_InitTypeDef sConfigOC = {0};
+
+    htim3.Instance = TIM3;
+    htim3.Init.Prescaler = 0;
+    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
+    htim3.Init.Period = 65535;
+    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+    htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
+
+    if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
+    {
+        Error_Handler();
+    }
+    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+
+    if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
+    {
+        Error_Handler();
+    }
+
+    sConfigOC.OCMode = TIM_OCMODE_PWM1;
+    sConfigOC.Pulse = 0;
+    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+    if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
+    {
+        Error_Handler();
+    }
+
+    HAL_TIM_MspPostInit(&htim3);
+}
+```
+
+Se configura el timer 3 para contar de manera ascendente de 0 a 65536, esto
+en conjunto con el reloj del timer define el período de la señal. El prescaler
+se configura en 0 por lo que el reloj del timer es el reloj del bus al que esta
+conectado, en el caso del timer 3, el bus es APB3, este cuenta con un reloj 
+
+
+```
+TIM_MasterConfigTypeDef sMasterConfig = {0};
+TIM_OC_InitTypeDef sConfigOC = {0};
+```
+
+Estas estructuras se usan para:
+
+* sMasterConfig: configurar opciones maestro-esclavo entre temporizadores.
+* sConfigOC: configurar parámetros del canal de salida (Output Compare / PWM).
diff --git a/app/screenshot_1.png b/app/screenshot_1.png
Binary files differ.
diff --git a/app/screenshot_2.png b/app/screenshot_2.png
Binary files differ.
diff --git a/app/screenshot_3.png b/app/screenshot_3.png
Binary files differ.
diff --git a/app/screenshot_4.png b/app/screenshot_4.png
Binary files differ.
diff --git a/app/screenshot_5.png b/app/screenshot_5.png
Binary files differ.
diff --git a/app/screenshot_6.png b/app/screenshot_6.png
Binary files differ.
diff --git a/app/test_1.txt b/app/test_1.txt
@@ -0,0 +1,28 @@
+Al ejecutar la funcion `test1_tick` se ha observado a traves del osciloscopio
+una señal cuadrada de una frecuencia de 1KHz (periodo de 1ms) y una amplitud
+aproximada de 3.3V, esto se puede ver en la captura del osciloscopio
+`screenshot_3.png`, en la medición de frecuencia y valor pico a pico (Vpp)
+respectivamante. Ademas se observa que a medida que varia el perioodo actvio de
+las señal PWM cambia el valor eficaz, y esto tiene sentido ya que la relacion
+entre el periodo de la señal aumento o disminuye en funcion del periodo activo
+de la señal, esto se puede observar en las cacpturas `screenshot_1.png` y
+`screenshot_3.png` en los cuales se muestra la salida pero para diferentes
+priodos activos de la señal. La relacion entre el periodo activo de la señal y
+el periodo de la misma se denomina ciclo de trabajo, y asi se muestra en las
+capturas del osciloscopio.
+
+A su vez, esta señal tiene una variación en el ciclo de trabajo, de 0% a 100% y
+luego nuevamente a 0%. Se observa que la variación del ciclo de trabajo es
+constante. Esto se ve en el codigo al establecer una variable llamada 'step' la
+cual se suma o resta al periodo activo del PWM. Luego se ha observado que la
+intensidad del LED varia con el tiempo, con un periodo aproximado entre 5 y 6
+segundos, este tiempo considera el LED apagado, luego encendido y finalmente
+apagado. Se ha observado que el SYSCLK es de 64MHz, y se ha establecido una
+variable estatica `period` a la que se asigna el valor 65535. Con esto podria
+determinarse que la frecuencia de la señal cuadrada es de aproximadamente 977Hz.
+Luego se ha observado que la variable estatica `step` la cual se asigna el valor
+100, que cada paso aumenta (o disminuye) la variable que funciona como contador
+`active`. Asimismo se ha observado que el PWM se actualiza cada 4 ticks, por
+tanto: (65535/100) = 655 llamadas a la funcion para completar un ciclo 977Hz/4 =
+244.25Hz frecuencia de actualizacion del pwn, por tanto: 655/244.25Hz = 2.68
+segundos para ir de 0% a 100% de ciclo de trabajo.
diff --git a/app/test_2.txt b/app/test_2.txt
@@ -0,0 +1,14 @@
+En el test 2, se observa mediante la medición con osciloscopio que el ciclo de
+trabajo de la señal cuadrada permanece en 50%, sin embargo la frecuencia de la
+señal varía con el tiempo, esto se puede observar en las capturas
+`screenshot_4.png`, `screenshot_5.png` y `screenshot_6.png`, en los cuales en
+todos los casos el ciclo de trabajo es aproximadamente el mismo, pero cambia la
+frecuencia de la señal.
+
+Se ha observado que el LED presenta la misma intensidad a lo largo del tiempo. A
+diferencia del test 1, en el cual la parte activa del PWM variaba, en este caso
+es el periodo el cual varía con el tiempo, manteniendose el mismo ciclo de
+trabajo. En este caso, analizando el codigo se observa que el periodo se
+mentiene entre PERIOD/2 y PERIOD/4. Por tanto teniendo en cuenta que el System
+Clock es de 64MHz, se puede determinar las frecuencias limites de la funcion
+cuadrada del PWM. 64MHz/(PERIOD/2) = 1953Hz, y 64MHz/(PERIOD/2) = 3906Hz.