Autor Tema: Requiero ayuda para entender este código  (Leído 2944 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Requiero ayuda para entender este código
« en: 24 de Marzo de 2020, 09:53:35 »
Cordial saludo, algo que siempre me ha parecido complicado es la conversión de tiempos , estoy implementando un control pwm en arduino atmega 328, el cual tiene unos pines para escribir como analogWrite,  trae por defecto 490 Hz y en otros 980Hz, pero si necesito hacerlo para una frecuencia especifica hay que jugar con los timmer para lograr por ejemplo 25khz.
he encontrado un código que quisiera entender en especial la linea "const int T=4000;" (de donde sale 25khz)no se, si lo que estén asignado sean microsegundos o milisegundos y/o otra medida, pero en general quisiera saber como trabaja el código que dejo a continuación.
Agradezco su ayuda
Código: [Seleccionar]
const int analogPin = A0; // Entrada señal analogica
const int pwmPIN = 9;     // Salida digital señal PWM
      int pot=512; // almacena la lectura analógica raw del potenciometro
      int percent; // posicion del potenciometro en tanto por ciento
const int T=4000;  // 25 KHz => Periodo = 40 microsegundos
int Wpulse = T/20; // Ancho del pulso
int last_Wpulse;


void setup() {
    Serial.begin(9600);
    Serial.println("################################");   
    Serial.println("####### Generador PWM ##########");   
    Serial.println("################################"); 
    pinMode(pwmPIN, OUTPUT); 
}

 
void loop() {

   pot = analogRead(analogPin); // lectura analógica raw (0-1023)
   percent = map(pot, 0, 1023, 0, 100); // convertir a porcentaje (0-100)
   Wpulse = T * percent/100;    // Ajusta el ancho del pulso segun valor resistencia
 
   if (Wpulse!=last_Wpulse) {  // Si se ha modificado el potenciometro
       last_Wpulse = Wpulse;
       serial();               // imprime cambios
   }else{
       digitalWrite(pwmPIN, HIGH);  // pin ON
       delayMicroseconds(Wpulse);   // mantiene el valor alto el tiempo Wpulse
       digitalWrite(pwmPIN, LOW);   // pin OFF
       delayMicroseconds(T-Wpulse); // valor bajo durante T-Wpulse   
   }
}


void serial() {
   Serial.print ("Potenciometro = ");
   Serial.print (percent, DEC);
   Serial.print ("% (");
   Serial.print (pot);        // valor raw entrada analogica 0-1023
   Serial.print (") -> "); 
   Serial.print (Wpulse);
   Serial.println(" microsegundos "); 
}
« Última modificación: 24 de Marzo de 2020, 09:55:48 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Requiero ayuda para entender este código
« Respuesta #1 en: 24 de Marzo de 2020, 12:28:13 »
Código: C
  1. delayMicroseconds(T-Wpulse); // valor bajo durante T-Wpulse

El codigo te lo dice... microsegundos. Observa que la T se usa en le delay

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Requiero ayuda para entender este código
« Respuesta #2 en: 24 de Marzo de 2020, 13:09:50 »
KILLERJC
Gracias tu siempre presto a ayudarnos...
super bien eso me queda claro, solo me falta entender la siguiente linea,
Citar
const int T=40000;  // 25 KHz => Periodo = 40 microsegundos
« Última modificación: 24 de Marzo de 2020, 13:19:22 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Requiero ayuda para entender este código
« Respuesta #3 en: 24 de Marzo de 2020, 13:17:01 »
si hago la conversion de 40uS me da 25khz pero no logro verlo con T=4000 (cargando 4000 de donde saca 25khz,)
1 / 40Us = 0,025 esto por 1.000.000 = 25.000 hz (25khz)
pero con T=4000
1 / 4000 = 0.00025 esto por 1.000.000 = 250?
gracias mil..
« Última modificación: 24 de Marzo de 2020, 13:22:12 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Requiero ayuda para entender este código
« Respuesta #4 en: 24 de Marzo de 2020, 16:26:46 »
No entendía que estabas buscando hacer o preguntar, ahora un poco detenido viendo el programa me doy cuenta. Y mas luego de leer tu respuesta.

Tu explicación es clara, y es claro que hay un error.

Actualmente esta intentando generar una demora de 4k microsegundos en total, lo cual es una locura, ya que eso da 250Hz.

Correctamente yo no utilizaria Delays para realizar esto, usaria el Timer1/2 que ya vienen preparado para funcionar como Fast PWM. Ya que la frecuencia es relativamente "alta" como para manejarlo por software. Y tambien podes controlar el duty con solo actualizar un valor.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Requiero ayuda para entender este código
« Respuesta #5 en: 24 de Marzo de 2020, 17:24:07 »
KILLERJC
saludos, si ,,
me puse a investigar el porque eso no me daba y es que por allá encontré una nota de que se podía cambiar la frecuencia buscando mejorar la relación del silbido que produce en los motores el pwm, lo que asumo es que realizo el cambio el 40 por un 4000 ( y no puso 250hz en vez de 25khz) siendo la variable T= 4000;  250hz; como bien dices...


Gracias por vuestra ayuda..
« Última modificación: 25 de Marzo de 2020, 10:54:26 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Requiero ayuda para entender este código
« Respuesta #6 en: 25 de Marzo de 2020, 11:01:34 »
por ultimo,,
es posible escribir con decimales los uS (microsegundos ) en los que voy a tener en on la salida?
algo asi..
Wpulse = 154; así  esta
Wpulse = 154.5; y/o
Wpulse = 154,5; y/o

obviamente declarando la variable como float con , y/o . ?(coma o punto)
y que mas debería cambiar si los decimales fueran posibles.
 :?
Si algo parece complicado... es por que esta mal explicado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Requiero ayuda para entender este código
« Respuesta #7 en: 25 de Marzo de 2020, 11:12:12 »
https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/

No... :

Citar
us: the number of microseconds to pause. Allowed data types: unsigned int.

Incluso hay otra limitación:

Citar
This function works very accurately in the range 3 microseconds and up. We cannot assure that delayMicroseconds will perform precisely for smaller delay-times.

Ya que depende mucho del microcontrolador que tengas y la frecuencia en el que se maneje.