Arduino - Los pulsos se vuelven inestables al actualizar el ciclo de trabajo de PWM

1

Estoy tratando de obtener trenes de pulso estables al ajustar los ciclos de trabajo con una placa Arduino Uno. En mi proyecto real, necesito usar 4 pines de salida PWM ajustables a una frecuencia fija de 25 kHz para controlar cuatro motores de CC controlados por pwm.

Pero para señalar el problema con mayor facilidad, quiero hacer mi pregunta con una configuración fácil y un código corto fácil.

Digamos que el objetivo es variar el ciclo de trabajo de PWM de los pulsos con una frecuencia fija. Se puede usar un potenciómetro para variar el voltaje de entrada en el pin A3 que se ajusta al ciclo de trabajo del pin 9 de PWM. La configuración simple se ilustra a continuación:

Paraexplicarelproblemadeunamaneraclara,megustaríamostrarleunpardecódigossimplesygrabacionescortasdevideodesdelapantalladealcance.

AquíestáelcódigoqueajustalosciclosdetrabajodelaslecturasdelpotencímetroenA3:

voidsetup(){pinMode(9,OUTPUT);}voidloop(){intval=analogRead(A3);//readthevaluefromthepotentiometerfloatvolt=(5.0*val)/1023;//convertthevaluetovoltageval=255*(volt/5);//scalethevoltageforpwmduty-cycleanalogWrite(9,val);}

YconestecódigocargadoenlauC,acontinuaciónsemuestraelregistrodevideoparalasalida:

enlace

Como se ve en el alcance, los pulsos parpadean. No son estables. Por cierto, el problema no está relacionado con la salida de poti, ya que también probé una salida fija de 3.3V con un int int. Me parece que sucede cada vez que se actualiza analogWrite.

Y aquí hay otro código donde las funciones analogRead y analogWrite están todavía continuamente activas en el bucle. La única diferencia esta vez, el analogWrite tiene un valor fijo aquí como 24:

void setup()
{    
pinMode(9, OUTPUT);
}

void loop()
{     
  int val = analogRead(A3); //read the value from the potentiometer
  float volt =(5.0 * val) / 1023; //convert the value to voltage
  val = 255 * (volt / 5); //scale the voltage for pwm duty-cycle
  analogWrite(9, 24);  

}

Y ahora con este subido, a continuación se muestra el registro de video para la nueva salida:

enlace

Como se ve en el alcance, los pulsos son extremadamente estables.

Necesito controlar los motores de CC con una alta precisión. Antes de esto, hice un circuito analógico simple con 555 y un comparador, pero para algunas funciones adicionales necesitaba usar un uC.

Pero ahora me di cuenta de este problema y pasé demasiadas horas para ver si otras bibliotecas tendrían una mejor solución. No pude encontrar ninguna. Encontré el siguiente video de un chico que escribió una biblioteca: enlace pero el mismo problema ocurre con su biblioteca también .

¿Se trata de un problema conocido y hay una solución? Y me alegraría mucho encontrar una solución o alguna sugerencia.

Editar:

El problema fue que el Arduino se suministra con la salida USB de la computadora portátil. Revisé el potenciómetro y los pines de 3.3 V con acoplamiento de CA y esto es lo que obtuve:

Arduino ADC es de 10 bits, que es 5000/1024 = 4.8mV. Lo que significa que es sensible para cada 4.5mV. En mi caso, la fluctuación de potencia causó a veces una diferencia de alrededor de 15 mV.

Lo intenté con una fuente de alimentación no USB de 9V del conector de barril de potencia de Arduino, el problema se resolvió. Gracias a Anklon por su intuición.

    
pregunta user16307

2 respuestas

1

Podría ser porque su variable 'val' obtiene valores diferentes. Porque generalmente cuando tienes un sistema de circuito cerrado, el LSB cambia a pesar de que el valor final se estabiliza. Incluso si el tuyo no es un sistema de circuito cerrado, creo que solo al registrar 'val' primero y verificar los valores debe dar una pista. Porque si 'val' cambia, entonces es correcto que su deber también cambie con él.

Porque en tu segundo caso tienes el mismo código pero no tiembla, lo que significa que las operaciones aritméticas no causan jitter. Por lo tanto, creo que si registra los datos (imprima los datos continuamente y vea el valor de 'val') sería útil o, al menos, dirigirlo para encontrar la solución adecuada.

    
respondido por el Bhuvanesh Narayanan
-1

Creo que el problema está relacionado con la forma en que administras los números enteros y flotantes en tu aplicación. val = 255 * (volt / 5) aquí se divide voltio (float) con el entero 5, entonces se convierte en entero val ??? %código%; Aquí multiplicas y divides enteros y esperas obtener flotar ??

    
respondido por el Marko Buršič

Lea otras preguntas en las etiquetas