En esta actividad se abarcará lo siguiente:
- Qué es un sistema operativo de tiempo real?
- Qué es concurrencia y multitasking
- Qué sistemas RTOS para el stm32 y microcontroladores existen?
- Qué es FreeRTOS?
- Cómo compilar un ejemplo básico con dos tareas utilizando FreeRTOS?
- Mezclar tres tareas: 1) una tarea de captura de datos en tiempo real, 2) una tarea de atención de botón y 3) una de blinking
- Clone el repositorio que incorpora FreeRTOS con libopencm3:
cd ~/local/src/repos/gitlab/
git clone https://gitlab.com/arcoslab/stm32f429i-disc1-freertos.git
- Inicialice los submodulos de git:
cd stm32f429i-disc1-freertos
git submodule init
git submodule update
cd inc/libopencm3
make -j`nproc`
cd ../..
- Conecte el cable mini-usb a la tarjeta discovery
- Compile y cargue el ejemplo incluido:
make
make flash
E: Grabe un video de lo que realizan los LEDs de la tarjeta de desarrollo.
- Conecte una trimmer o potenciómetro como lo realizó en la Actividad 3. (al mismo pin del stm32)
- Al inicio del main, modifique el programa para configurar (setup) el convertidor analógico digital, de la misma manera que lo realizó en la Actividad 3. No agregue el suporte de USB. No agregue todavía codigo para realizar conversiones con el ADC.
- En el archivo src/main.c, edite la función task1 y agregue la información necesaria para realizar en esta tarea para realizar la conversión ADC del voltaje en el potenciómetro.
- En esta misma función, utilice los LEDs LD5 y LD6 para indicar si el voltaje de conversión está debajo de la mitad del rango total o por encima. De la siguiente manera:
- LD6 off y LD5 on sí: VADC < VCC/2
- LD6 on y LD5 off sí: VADC >= VCC/2
E: Grabe un video donde se observe que los LEDs LD5 y LD6 reaccionan adecuadamente a estos voltajes. Utilice un osciloscopio para mostrar en el video el voltaje de entrada en el ADC y al mismo tiempo el cambio de luces mientras realiza ajustes al potenciómetro.
E: Debe entregar el archivo main.c con los cambios que implementen este comportamiento.
- En el main, configure el pin PC11 como una salidad GPIO y inicialícelo apagado (cero).
- Agregue a su programa una tarea nueva (task3).
- Dicha tarea debe implementar el control de un motor tipo servo: tiempo total de la tarea: 200ms, Durante los primeros milisegundos (entre 10ms a 20ms) debe mantener en 1 la salida PC11, y el resto del tiempo dicha salida debe mantenerse en 0.
- El tiempo en 1, que varía entre 10ms y 20ms, corresponde a los ángulos mínimos y máximos del servo.
- Conecte un osciloscopio a la salida PC11
- Pruebe su señal de servo con el ángulo mínimo del servo (1 por 10ms).
E: Corrobore y capture con el osciloscopio esta situación.
- Pruebe su señal de servo con el ángulo máximo del servo (1 por 20ms).
E: Corrobore y capture con el osciloscopio esta situación.
Espere corroboración del profesor para asegurarse una ejecución correcta.
- Utilizando una variable global, tome el valor que general el ADC y conviértalo a un valor proporsional de tiempo de tal manera que un valor de 0 en el ADC corresponda a 10ms y un valor de ADC_max corresponda a 20ms. Utilice esta variable global en la tarea task3, para configurar el tiempo en 1 de la señal PC11.
E: Tome un video que corrobore este comportamiento. Debe mostrar la posición del potenciómetro y la señal del osciloscopio correspondiente.
E: Entregue el código main.c que implementa esta funcionalidad
P: Puede la función pdMS_TO_TICKS producir una espera de 0.5ms?
- Cambie las prioridades para que la tarea 3 tenga la mayor prioridad, la segunda la tarea de captura del ADC, y la tercera la tarea task2.
E: Incluya el código con los cambios de prioridad
https://www.freertos.org/Documentation/01-FreeRTOS-quick-start/01-Beginners-guide/00-Overview
https://gitlab.com/arcoslab/stm32f429i-disc1-freertos