Autor Tema: control velocidad motor dc con poteciometro y sensor hall como implementarlo?  (Leído 5770 veces)

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

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
cordial saludo,
He tratado de hacer un control de velocidad para un motor DC de escobillas, lo he puesto a trabajar correctamente con valores fijos incluso con potencionetro para regular las rpm, el problemas es que para estabilizar la lectura del pot, tomo 10 muestras y las promedio para asignarlas al tiempo pwm pero al tratar de tomar la velocidad con el sensor hall (requiero velocidad estable),se me ralentiza la frecuencia pwm y obviamente las revoluciones.
Creo que los tiempos de muestreo del adc y del contador para el sensor hall me causan el conflicto.
He utilizado los timmer pero aun así al momento de las interrupciones todo se vuelve un caos.
Que debería hacer o en que orden para lograr el propósito?

gracias de antemano...
Si algo parece complicado... es por que esta mal explicado.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #1 en: 29 de Marzo de 2020, 20:14:42 »
Hola, no veo que hayas publicado parte del código ni ningún tipo de esquema sobre cómo has hecho las conexiones.
Habrá que adivinar?

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #2 en: 29 de Marzo de 2020, 21:53:47 »
Hola, no veo que hayas publicado parte del código ni ningún tipo de esquema sobre cómo has hecho las conexiones.
Habrá que adivinar?
gracias por tu respuesta, aquí dejo tal cual me trabaja necesitaría implementar la retroalimentacion hall.
Código: [Seleccionar]
// Variables
int Sensor = A0; //
int MOSFET = 9; //
int datoSensor = 0; // Variable para el valor del sensor

void setup()
{
Serial.begin(9600); // open the serial port at 9600 bps:
pinMode(MOSFET, OUTPUT); // Asigna el pin del led como salida

}
void loop() {
datoSensor = analogRead(Sensor); //Leemos el dato del sensor y lo guardamos en la variable
datoSensor=map(datoSensor,0,1023,5,350);
analogWrite(MOSFET, datoSensor / 4); //Valor analogico para la salida

delay(25); //Detenemos el programa 25 milisegundos

Serial.print(datoSensor);
Serial.print('\n');

}
Si algo parece complicado... es por que esta mal explicado.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #3 en: 29 de Marzo de 2020, 23:38:45 »
Deberás quitar el Serial.print, esa función altera el ciclo de programa.
Nunca use la función analogWrite.
Prefiero accionar una salida PWM mediante interrupción.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #4 en: 31 de Marzo de 2020, 17:43:12 »
Deberás quitar el Serial.print, esa función altera el ciclo de programa.
Nunca use la función analogWrite.
Prefiero accionar una salida PWM mediante interrupción.
cordial saludo, también lo he realizado con interrupción y "digitalwrite" el problema que tengo es que si llega la interrupción en el momento en que el mosfet esta conduciendo no me apagaría el mosfet hasta salir de ella, es  mi problema porque debo medir el potenciometro compararlo con la señal de retro-alimentacion del sensor hall para fijar la velocidad y luego encender el mosfet..
Si algo parece complicado... es por que esta mal explicado.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #5 en: 31 de Marzo de 2020, 20:36:55 »
los arduino llevan módulos pwm dedicados, ¿por que no los usas?

 En tu programa yo desarrollaria el bucle principal con arreglo a lo siguiente:

    void loop () {

  - Lee el potenciometro ponderando varias mediciones para estabilizar.
  -Adapta el valor del adc del potenciometro 0-1023 y relaciónalo a las rpm. Entiendo que el potenciometro es para elegir las rpm, y conocerás el máximo y el mínimo de rpm.
  - Activa el pwm al mínimo ancho de pulso que permita al motor comenzar a girar.
  - usa un timer de 16 bits para medir el periodo del sensor hall y así determinar las rpm a las que está girando el motor.   
  Sabiendo las rpm que te da el hall y las que quieres (valor del potenciometro) es muy fácil hacer un algoritmo de comparación que incremente o decremente el ancho de pulso hasta que el motor gire a las rpm elegidas.  Lo puedes hacer desde el método más fácil:

If (rpm es menor) sube dutty; else baja dutty;

  Pasando por calcular la diferencia (error) con los valores actuales y sabiendo las relaciones aplicar regla de tres y modificar de forma más directa el dutty cicle o, por último complicarte un poco más pero hacerlo del todo bien implementando un control PID completo.

  -Por ultimo enviar lo que quieras por la USART
 
  }

  Es la única forma de hacerlo seguro y eficiente. Hacerlo por fuerza bruta manejando manualmente el pin que genera el pulso es ineficiente y siempre te va a ser inestable.


« Última modificación: 01 de Abril de 2020, 07:11:44 por remi04 »

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #6 en: 03 de Abril de 2020, 19:50:36 »
los arduino llevan módulos pwm dedicados, ¿por que no los usas?

 En tu programa yo desarrollaria el bucle principal con arreglo a lo siguiente:

    void loop () {

  - Lee el potenciometro ponderando varias mediciones para estabilizar.
  -Adapta el valor del adc del potenciometro 0-1023 y relaciónalo a las rpm. Entiendo que el potenciometro es para elegir las rpm, y conocerás el máximo y el mínimo de rpm.
.....
  Es la única forma de hacerlo seguro y eficiente. Hacerlo por fuerza bruta manejando manualmente el pin que genera el pulso es ineficiente y siempre te va a ser inestable.

gracias por tus respuesta..
Entiendo lo que me explicas pero no he podido encontrar un ejemplo con los timmer para leer el sensor hall.
realice el siguiente código pero el motor me arranca o se mueve por pulsos muy cortos, asumo que es por la interrupción.( en el código aun no relaciono las mediciones del sensor con el potenciometro, ya que trato de visualizar primero las lecturas antes de seguir adelante)
Código: [Seleccionar]
volatile int contador = 0;   // Variable entera que se almacena en la RAM del Micro
volatile int suma = 0;

int pwm = 9; // asigna el pin 12 a la variable pwm
int led = 10;
int pot = A0; // asigna la entrada analógica A0 a la variable pot
int t1 = 0; // declara la variable t1
int t2 = 0; // declara variable t2
void setup () // setup loop
{
  Serial.begin(9600);
  attachInterrupt(0,interrupcion0,RISING);  // Interrupcion 0 (pin2)
  pinMode (pwm, OUTPUT); // declara el pin 12 como salida
  pinMode (pot, INPUT); // declara el pin A0 como entrada
}
void loop ()
{

delay(999);               // retardo de casi 1 segundo
  for (int i=0; i<20;i++)
{
 suma = contador +suma;
 Serial.println(suma);
}
  suma=suma/20; 
 // Serial.print(suma); // Como son dos interrupciones por vuelta (contador * (60/2))
 // Serial.println(" RPM");    //  El numero 2 depende del numero aspas de la helise del motor en prueba
  contador = 0;
  suma = 0;
 
  t2 = analogRead (pot); // lee el voltaje en A0 y guarda en t2
  t2=map(t2,0,1023,1500,3000);
   
  digitalWrite (pwm, HIGH); // establece el pin 12 HIGH
  digitalWrite (led, HIGH);
  delayMicroseconds (t2); // espera t1 uS (hora alta)
  digitalWrite (pwm, LOW); // establece el pin 12 BAJO
  digitalWrite (led, LOW);
  delayMicroseconds (t1); // espera t2 uS (poco tiempo)
  delay(20); //Detenemos el programa 25 milisegundos
  //Serial.println(t1);
 //Serial.println(t2);
}

   void interrupcion0()    // Funcion que se ejecuta durante cada interrupion
{
  contador++;           // Se incrementa en uno el contador
}
« Última modificación: 03 de Abril de 2020, 19:54:13 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #7 en: 03 de Abril de 2020, 20:13:58 »
delay de casi 1 segundo, y uso del puerto serial en el loop, es la causa de todos tus problemas. + PWM software.
« Última modificación: 03 de Abril de 2020, 20:18:36 por KILLERJC »

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #8 en: 03 de Abril de 2020, 20:27:29 »
delay de casi 1 segundo, y uso del puerto serial en el loop, es la causa de todos tus problemas. + PWM software.
gracias por tu respuesta..

pero entonces como puedo ver  las "RPM" si no las puedo visualizar en el puerto serie?
 y el delay de un segundo es para capturar las muestras ..
que debo hacer entonces?
saludos..
Si algo parece complicado... es por que esta mal explicado.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #9 en: 03 de Abril de 2020, 21:07:30 »
El delay vos decis que es para capturar las muestras, pero el problema que ese delay, te retrasa el PWM (porque esta realizado por software) , y tambien el puerto serie, que es una funcion bloqueante, es decir hasta que no envia todo NO sale de la funcion, tambien te retrasa el PWM.

Por lo que ese PWM es de todo menos un PWM. Ya que un PWM exige que tengas una frecuencia fija y varies el duty.
Lo correcto es utilizar el PWM por hardware, Con analog write si te sirve la frecuencia.

Una vez que hiciste el PWM por hardware, quedan 2 opciones

1-
Podes hacer una interrupcion de un Timer cada X segundos para tomar la cantidad de cuentas que van. Y asi luego tenerlo para calcular las RPM. Esta es la situacion ideal debido a que te dejaria enteramente el loop para la comunicacion Serie, y eso implica que no te afecte en el tiempo de tomar las muestras ni nada por el estilo.


2
Usando la funcion milis esperar X tiempo. Asi calcular tus RPM.
El milis te permite que no te quedes encerrado en la funcion como el delay.
En este caso podrias llegar a tener un poco de error debido ya que al cumplirse el tiempo, podria estar encerrado en la funcion de envio por serie, y eso hacer que tengas un error en las RPM, pero va a depender de que tan exacto queres que sea.


Otro tema....
Como estas intentando crear un control de velocidad, es un control de velocidad a lazo abierto o cerrado?
« Última modificación: 03 de Abril de 2020, 21:20:07 por KILLERJC »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #10 en: 04 de Abril de 2020, 07:23:26 »
los arduino llevan módulos pwm dedicados, ¿por que no los usas?

 En tu programa yo desarrollaria el bucle principal con arreglo a lo siguiente:

    void loop () {

  - Lee el potenciometro ponderando varias mediciones para estabilizar.
  -Adapta el valor del adc del potenciometro 0-1023 y relaciónalo a las rpm. Entiendo que el potenciometro es para elegir las rpm, y conocerás el máximo y el mínimo de rpm.
.....
  Es la única forma de hacerlo seguro y eficiente. Hacerlo por fuerza bruta manejando manualmente el pin que genera el pulso es ineficiente y siempre te va a ser inestable.

gracias por tus respuesta..
Entiendo lo que me explicas pero no he podido encontrar un ejemplo con los timmer para leer el sensor hall.
realice el siguiente código pero el motor me arranca o se mueve por pulsos muy cortos, asumo que es por la interrupción.( en el código aun no relaciono las mediciones del sensor con el potenciometro, ya que trato de visualizar primero las lecturas antes de seguir adelante)
Código: [Seleccionar]
volatile int contador = 0;   // Variable entera que se almacena en la RAM del Micro
volatile int suma = 0;

int pwm = 9; // asigna el pin 12 a la variable pwm
int led = 10;
int pot = A0; // asigna la entrada analógica A0 a la variable pot
int t1 = 0; // declara la variable t1
int t2 = 0; // declara variable t2
void setup () // setup loop
{
  Serial.begin(9600);
  attachInterrupt(0,interrupcion0,RISING);  // Interrupcion 0 (pin2)
  pinMode (pwm, OUTPUT); // declara el pin 12 como salida
  pinMode (pot, INPUT); // declara el pin A0 como entrada
}
void loop ()
{

delay(999);               // retardo de casi 1 segundo
  for (int i=0; i<20;i++)
{
 suma = contador +suma;
 Serial.println(suma);
}
  suma=suma/20; 
 // Serial.print(suma); // Como son dos interrupciones por vuelta (contador * (60/2))
 // Serial.println(" RPM");    //  El numero 2 depende del numero aspas de la helise del motor en prueba
  contador = 0;
  suma = 0;
 
  t2 = analogRead (pot); // lee el voltaje en A0 y guarda en t2
  t2=map(t2,0,1023,1500,3000);
   
  digitalWrite (pwm, HIGH); // establece el pin 12 HIGH
  digitalWrite (led, HIGH);
  delayMicroseconds (t2); // espera t1 uS (hora alta)
  digitalWrite (pwm, LOW); // establece el pin 12 BAJO
  digitalWrite (led, LOW);
  delayMicroseconds (t1); // espera t2 uS (poco tiempo)
  delay(20); //Detenemos el programa 25 milisegundos
  //Serial.println(t1);
 //Serial.println(t2);
}

   void interrupcion0()    // Funcion que se ejecuta durante cada interrupion
{
  contador++;           // Se incrementa en uno el contador
}

  Este código te permite determinar la frecuencia de una señal cuadrada cualquiera. Tú sensor hall sería esa señal cuadrada. 

  Pruébalo aparte tal cual está y luego ve introduciéndolo en tu código como librería o directamente.

   Este código usa el timer1. Debes tenerlo en cuenta por que el pwm hardware también necesita usar un timer, simplemente asegúrate que el pwm no quiera usar el timer1. Por que ese conflicto hará que todo se vaya a la mierda.  Busca un pwm hardware que no use el timer1.

  Ten en cuenta que este código usa 115200 bps de velocidad del puerto serie. 

  Por último, el sensor hall lo tiene que poner en cualquier pin de la tarjeta arduino con interrupción hardware por flanco de subida.  Con resistencia pullup si es un hall de colector abierto, OpenDrain.

  Yo empezaría por ahí. Cuando tengas el motor girando y puedas ver sus revoluciones por segundo (Hz) entonces empiezas con el pwm hardware.

 
 
Código: C
  1. / Frequency timer
  2. // Author: Nick Gammon
  3. // Date: 10th February 2012
  4.  
  5. volatile boolean first;
  6. volatile boolean triggered;
  7. volatile unsigned long overflowCount;
  8. volatile unsigned long startTime;
  9. volatile unsigned long finishTime;
  10.  
  11. // here on rising edge
  12. void isr ()
  13. {
  14.   unsigned int counter = TCNT1;  // quickly save it
  15.  
  16.   // wait until we noticed last one
  17.   if (triggered)
  18.     return;
  19.  
  20.   if (first)
  21.     {
  22.     startTime = (overflowCount << 16) + counter;
  23.     first = false;
  24.     return;  
  25.     }
  26.    
  27.   finishTime = (overflowCount << 16) + counter;
  28.   triggered = true;
  29.   detachInterrupt(0);  
  30. }  // end of isr
  31.  
  32. // timer overflows (every 65536 counts)
  33. ISR (TIMER1_OVF_vect)
  34. {
  35.   overflowCount++;
  36. }  // end of TIMER1_OVF_vect
  37.  
  38.  
  39. void prepareForInterrupts ()
  40.   {
  41.   // get ready for next time
  42.   EIFR = _BV (INTF0);  // clear flag for interrupt 0
  43.   first = true;
  44.   triggered = false;  // re-arm for next time
  45.   attachInterrupt(0, isr, RISING);    
  46.   }  // end of prepareForInterrupts
  47.  
  48.  
  49. void setup () {
  50.   Serial.begin(115200);      
  51.   Serial.println("Frequency Counter");
  52.  
  53.   // reset Timer 1
  54.   TCCR1A = 0;
  55.   TCCR1B = 0;
  56.   // Timer 1 - interrupt on overflow
  57.   TIMSK1 = _BV (TOIE1);   // enable Timer1 Interrupt
  58.   // zero it
  59.   TCNT1 = 0;    
  60.   // start Timer 1
  61.   TCCR1B =  _BV (CS10);  //  no prescaling
  62.  
  63.   // set up for interrupts
  64.   prepareForInterrupts ();  
  65.  
  66. } // end of setup
  67.  
  68. void loop ()
  69.   {
  70.  
  71.   if (!triggered)
  72.     return;
  73.  
  74.   unsigned long elapsedTime = finishTime - startTime;
  75.   float freq = 1.0 / ((float (elapsedTime) * 62.5e-9));  // each tick is 62.5 nS
  76.  
  77.   Serial.print ("Took: ");
  78.   Serial.print (elapsedTime);
  79.   Serial.print (" counts. ");
  80.  
  81.   Serial.print ("Frequency: ");
  82.   Serial.print (freq);
  83.   Serial.println (" Hz. ");
  84.  
  85.   // so we can read it  
  86.   delay (500);
  87.  
  88.   prepareForInterrupts ();  
  89. }   // end of loop

  Las rpm es muy fácil sacarlas a partir de la frecuencia que te dé. Multiplicas por 60 y listo.  Aunque yo no lo haría. Lo trabajaría directamente en hz. Solo multiplicaria para enviar el valor en rpm a la terminal.

Una vez tengas esto, prueba al generar una señal PWM, Debes usar cualquier pin que te dé PWM que usen el timer0 o el timer2. El timer2 tiene una opción mas de preescalador que el timer0 (dividir la freuencia del pwm). Para el timer2 los PWM en el arduino Nano, Uno, mini y Mega serían los PWM 3 y 11. Cualquiera de los dos te vale (Localiza en tu placa arduino cual es el pin de salida de cada uno de estos dos pwm).

   la siguiente linea te permite activar el pwm en el pin elegido. En "analogOutPin" pones el pin del pwm que elijas de tu placa arduino. En "OutputValue" pones el valor del dutty cicle, de 0 a 255 siendo 0, la señal entera a nivel bajo y 255 la señal entera a nivel alto.  Un valor de 128 por ejemplo te daría una onda cuadrada simétrica.

  En resumen, duty a cero, el motor no anda, y cuando empiezas a subir el dutty el motor girará mas rápido cuanto más subas el dutty.

Código: [Seleccionar]
analogWrite(analogOutPin, outputValue);

Ya con todo esto, conjugandolo en tu sketch creo que podrías implementarlo todo. Solo te queda hacer el feedback si como dice KillerJC quieres un control en lazo cerrado, bien por los metodos mas simples hasta hacerlo por PID como ya te expliqué.

 Un saludo.



« Última modificación: 04 de Abril de 2020, 16:35:41 por remi04 »

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:control velocidad motor dc con poeciometro y sensor hall como implementarlo?
« Respuesta #11 en: 04 de Abril de 2020, 14:38:18 »
remi04 / KILLERJC
Gracias por sus respuestas,,
- cargue el programa de ejemplo y me pareció super preciso.
- si, estoy buscando lazo cerrado para controlar las revoluciones.
- cuando dices dividir *60 creo que lo que trataste de decirme es multiplicarlo * 60.

Siguiendo sus aclaraciones voy a ir implementando el resto del programa a ver con que me encuentro..
saludos..
Si algo parece complicado... es por que esta mal explicado.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:control velocidad motor dc con poeciometro y sensor hall como implementarlo?
« Respuesta #12 en: 04 de Abril de 2020, 16:30:19 »
remi04 / KILLERJC
Gracias por sus respuestas,,
- cargue el programa de ejemplo y me pareció super preciso.
- si, estoy buscando lazo cerrado para controlar las revoluciones.
- cuando dices dividir *60 creo que lo que trataste de decirme es multiplicarlo * 60.

Siguiendo sus aclaraciones voy a ir implementando el resto del programa a ver con que me encuentro..
saludos..

  Correcto, multiplicas  :x

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #13 en: 04 de Abril de 2020, 17:26:32 »
Agradezco la paciencia y disponibilidad para ayudarme,
bueno parece que va bien la cosa...
tres dudas...
cual es el propósito de desplazar los datos a la izquierda para que queden como mas significativos, que razón tiene esto?
Código: C
  1. if (first)
  2.     {
  3.     startTime = (overflowCount << 16) + counter;
  4.     first = false;
  5.     return;  
  6.     }
  7.    
  8.   finishTime = (overflowCount << 16) + counter;
  9.   triggered = true;
  10.   detachInterrupt(0);  
  11. }  // end of isr

y en  esta parte es para ajustar la medida? ( 62.5e-9)
Código: C
  1. unsigned long elapsedTime = finishTime - startTime;
  2.   float freq = 1.0 / ((float (elapsedTime) * 62.5e-9));  // each tick is 62.5 nS

encontré la siguiente explicación pero sigo sin entender..

Código: C
  1. Bueno el problema es mas simple de lo que uno imagina.
  2. Serial.print con los float redondea a 2 decimales, entonces un resultado como 0.016 bien calculado se redondea a 0.02 seg
  3. La solución es que en lugar de calcular T = 1/freq; hagas esto
  4.  
  5. T = float(tiempo_transcurrido * 62.5e-6); // expresado en mseg

 y por ultimo ( _BV) esto es una variable o que significa no la veo por ninguna parte.
Código: C
  1. TIMSK1 = _BV (TOIE1);   // enable Timer1 Interrupt
« Última modificación: 04 de Abril de 2020, 17:55:18 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:control velocidad motor dc con poteciometro y sensor hall como implementarlo?
« Respuesta #14 en: 04 de Abril de 2020, 20:07:36 »
Por partes:

Código: C
  1. if (first)
  2.     {
  3.     startTime = (overflowCount << 16) + counter;
  4.     first = false;
  5.     return;  
  6.     }
  7.    
  8.   finishTime = (overflowCount << 16) + counter;
  9.   triggered = true;
  10.   detachInterrupt(0);  
  11. }  // end of isr

 Este método utiliza un timer de 16 bits. Puede contar de 0 a 65535.  En la interrupción por timer_overflow cuenta cuantas veces ha desbordado el Timer y lo carga en la variable de 32 bits StartTime, luego lo desplaza al MSB por que esa cifra está representando (65535 * número de veces que ha desbordado el Timer ) y luego le suma el valor por donde va el timer actualmente y se queda en el LSB.

  Es lo mismo que hacer (65535 * overflowcount) + counter;

 Marca la primera lectura con el boolean First, y luego al siguiente flanco de subida vuelve a hacer lo mismo pero lo carga en la variable endtime.

   Si le restas a endtime lo que hay en starttime ya tienes un periodo, “elapseTime”

   Como sabes la velocidad del oscilador y el prescalador que le hayas configurado al timer sabes cuanto tiempo tarda el Timer en incrementarse una vez.  En este caso 62,5 ns.
 62 * 10 elevado a -9 . Eso es el: 62,5e-9, el tiempo exacto que tarda el Timer en incrementarse.

La inversa de un periodo es la frecuencia. Aquí estás calculando la inversa del tiempo total del periodo.

Código: C
  1. unsigned long elapsedTime = finishTime - startTime;
  2.   float freq = 1.0 / ((float (elapsedTime) * 62.5e-9));  // each tick is 62.5 nS

Por último, _bv(); es una macro. Lo que hace es poner un valor booleano en un bit concreto de un registro o variable.

Por ejemplo:

 MyRegistro8bits = 0;
 MyRegistro8bits = _bv(2);  // pone a 1 el bit 2 de la variable MyRegistro8bits
 
 La variable MyRegistro8bits ahora vale: 0b00000100

   Cuando pones TIMSK1 = _bv(T0IE1);  lo que estás haciendo es poner a 1 el bit t0IE1 del registro TIMSK1

  Para comprender esto mejor hay que ir al datasheet del micro que lleva tu placa arduino. Ahí ya estás manejando directamente los registros del micro.

 Arduino tiene de bueno que es como un c++ con bastante alto nivel. Todos se acostumbran a hacer todo mediante librerías y métodos ya hechos y está bien. Pero cuando toca bucear un poco hacia en fondo donde está la cpu para manejar registros y timers y demás ya más de uno empieza a ahogarse. lol:
« Última modificación: 10 de Abril de 2020, 07:44:56 por remi04 »