Bucle for y while (salir y entrar al mismo bucle) Lenguaje C "Pic c compile

Cerrado
Jair_117 Mensajes enviados 3 Fecha de inscripción viernes, 24 de enero de 2020 Estatus Miembro Última intervención lunes, 18 de enero de 2021 - 16 ene 2021 a las 06:00
aaronmera Mensajes enviados 3 Fecha de inscripción sábado, 16 de enero de 2021 Estatus Miembro Última intervención sábado, 16 de enero de 2021 - 16 ene 2021 a las 17:40
"CODIGO EN PIC C"

ESPERO QUE PUEDAN AYUDARME, PUSE MUCHOS COMENTARIOS AL CODIGO PARA QUE SEPAN DE QUE HACE CADA COSA.

Necesito su ayuda con los bucles mencionados en el titulo.
Estoy haciendo un programa para tomar lectura de un sensor de temperatura y realice ciertas acciones. Al llegar a una temperatura mayor o igual a 36 °C aumentara la velocidad de un motor hasta llegar al máximo (1023) y cuando sea menor la temperatura, bajara la velocidad del motor de 1023 a 511 que es la velocidad media del motor.

Utilizo el bucle for para aumentar y disminuir la velocidad del motor.

La pregunta es ¿Cómo puedo hacer que el motor se quede girando al nivel máximo (temperatura>=36) y se quede a velocidad media (temperatura <36) y a la vez se pueda seguir ciclando infinitamente la lectura del sensor ?

¿Se puede salir y entrar a un ciclo cuantas veces quiera?

Les mostrare el código que tengo, en este código se sigue aumentando/disminuyendo la velocidad cada ves que se repite el bucle while.

Este es mi código:
 void main()
{
   WHILE (true)
   {
      DHT11_read_data (&humedad,&temperatura);           //Toma lectura del sensor
      lcd_clear ();                                      //Limpia el LCD
      lcd_gotoxy (1, 1) ;                            // Posición de escritura LCD
      printf (lcd_putc, "Hum = %0.1f%%", humedad);        //Muestra la lectura de la humedad LCD
      lcd_gotoxy (1, 2) ;                         //Posición de escritura LCD
      printf (lcd_putc, "Tem = %0.1fC", temperatura);       //Muestra la lectura de la temperatura LCD

      printf ("Hum = %0.1f%%\r\n", humedad);              //Muestra la lectura de la humedad
      printf ("Tem = %0.1fC\r\n\r\n", temperatura);       //Muestra la lectura de la temperatura
      delay_ms (200);                                   //Toma la lectura del sensor cada 200 ms

      IF (temperatura >= 36)
      {
        // 511 -> velocidad media | 1023 -> velocidad maxima
         //Aumentar a la velocidad máxima el motor
         FOR (DutyCycle = 511; DutyCycle < 1023; DutyCycle++)
         {
            set_pwm1_duty (DutyCycle);                     //Manda la velocidad actual al motor
            delay_us (300);                             // incremento rápido de velocidad
         }

         IF (DutyCycle == 1023)                             // sí llego a la velocidad máxima
         {
            set_pwm1_duty (1023);                         // se mantendrá a esa velocidad el motor
         }
      }
     else                        // Mismo código que el de arriba, solo que para que disminuya la velocidad
      {
         //Regresa el motor a velocidad media
         for (DutyCycle = 1023; DutyCycle > 511; DutyCycle--)
         {
            set_pwm1_duty (DutyCycle) ;
            delay_us (300);
         }

         if (DutyCycle == 511)                   // sí llego a la velocidad máxima
         {
            set_pwm1_duty (511);                // se mantendrá a esa velocidad el motor
         }
      }
   }
}
Consulta también:

2 respuestas

aaronmera Mensajes enviados 3 Fecha de inscripción sábado, 16 de enero de 2021 Estatus Miembro Última intervención sábado, 16 de enero de 2021
16 ene 2021 a las 06:19
hola yo una vez hice algo similar, lo que debes hacer es crear un método o una sub clase que tenga los valores máximos de velocidad para el motor, y llamarlo cada vez que se cumpla esa condición.

Para salir de los bucles se usa la sentencia break y para volver a entrar debes crearlo dentro una sub clase o método para que solo lo llames.

Al parecer estas intentado hacer PWM esto se hace en pines específicos del pic, un ejemplo es el ventilador de la laptop que cuando esta a su máxima temperatura su checkpoint hara que llegue al máximo o que disminuya gradualmente.

Espero te ayude, saludos
0
Jair_117 Mensajes enviados 3 Fecha de inscripción viernes, 24 de enero de 2020 Estatus Miembro Última intervención lunes, 18 de enero de 2021
16 ene 2021 a las 07:03
hola, estan en lo correcto, estoy incrementando la velocidad con el pwm del pic y este esta en el correspondiente pin, pero no logro hacer que se mantenga la velocidad y no se como aplicar los metodos y solo he salido de un bucle con ayuda de la bandera.
0
aaronmera Mensajes enviados 3 Fecha de inscripción sábado, 16 de enero de 2021 Estatus Miembro Última intervención sábado, 16 de enero de 2021
16 ene 2021 a las 17:40
Lo qué pasa es que el pwm no va a mantener la velocidad constante a menos que el checkpoint sea constante, si el checkpoint baja un poco ya altera la velocidad, yo lo que haría es crear un método entero para cuando llegue a ese chechkpoint llame a este método que sea solo con los valores más altos, me parece que también puedes alterar los valores de pwm para que se quede siempre al máximo, si recordamos la teoría del pwm son pulsos a máxima velocidad, intenta hacerlo al estilo on y Off espero haber sido un poco claro, coméntame cómo te va.
Saludos
0