Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
logLinea(micros());
noInterrupts();
tmp2 = motor2PulsosActuales;
interrupts();
logLinea(micros());
void subMenuPantalla() {
actualizarLCD = true;
boolean salirSubMenu = false;
//TIEMPO DE REFRESCO
lcd.clear();
lcd.print(F("Screen setting"));
lcd.setCursor(0, 1);
lcd.print(F("refresh time (ms):"));
lcd.setCursor(0, 3);
lcd.print(F("f1:exit"));
lcd.setCursor(13, 3);
lcd.print(F("f2:save"));
while (salirSubMenu == false) {
if (actualizarLCD == true) {
actualizarLCD = false;
lcd.setCursor(0, 2);
lcd.print(String(tiempoRefrescoLCD / 1000) + " ");
}
//lectura de botones
btnEste.read();
btnOeste.read();
btnF1.read();
btnF2.read();
//si se pulsa f1, se sale
if (btnF1.wasPressed()) {
salirMenu = true;
mostrarMenu();
break;
}
//si se presiona este, aumenta 100ms
if (btnEste.isPressed()) {
if (tiempoRefrescoLCD < 1000000UL) {
tiempoRefrescoLCD = tiempoRefrescoLCD + 100000UL;
actualizarLCD = true;
}
}
//si se presiona oeste, disminuye 100ms
if (btnOeste.isPressed()) {
if (tiempoRefrescoLCD > 100000UL) {
tiempoRefrescoLCD = tiempoRefrescoLCD - 100000UL;
actualizarLCD = true;
}
}
//si se prsiona f2, guarda los cambios
if (btnF2.wasPressed()) {
guardarConfig();
lcd.clear();
lcd.print(F("Config saved"));
delay(1000);
salirSubMenu = true;
actualizarLCD = true;
break;
}
//anti rebote botonera
delay(100);
}
}
Me acabo de dar cuenta de que la explicación del buffer fifo del Arduino ya estaba en este mismo hilo, y más amplia... Osea que el "código bloqueante" debe de ser de marca, lo mismo inhibe interrupciones y se queda en un while.El buffer del Arduino tiene 32 bytes de entrada y 32 de salida , a priori no deberías de perder nada...
Por otro lado tú mismo te has contestado para este u otros casos. No programes nada con "códigos bloqueantes" que ya ves lo que pasa.
Timer1_Initialize();
//el timer 1 afecta al PWM de los pines 11 y 12
Timer1_SetFrequency(1200); //frecuencia en HZ
Serial.println(F("frecuencia timer1:")); //deberia de estar a la frecuencia configurada
Serial.println(Timer1_GetFrequency());
Serial.println(Timer1_GetResolution());
pwmWrite(uint8_t pin, uint8_t duty) 8-bit, 0 - 255
pwmWriteHR(uint8_t pin, uint16_t duty) 16-bit, 0 - 65535
Me huele a problema mecánico.
Según cómo esté el actuador, es probable que necesites más par en ciertas zonas... Tendrías que hacer una curva de duttys según en qué momento se encuentre el posicionador.
Por ejemplo, suponiendo un actuador en el que el par pasa uniforme, cuando el telescopio está horizontal, si no está contrapesado necesitas mucho más par que cuando está casi vertical, que sería casi cero. Si el actuador es lineal y hace palanca la curva del par necesario no es en absoluto lineal.
En principio, la frecuencia no influye en absoluto en el resultado.
¿En esa zona funciona bien al revés? Es decir, "bajando" en lugar de "subiendo"
Por las dudas aclaro nuevamente porque no entendí.Vale, pensaba que era subiendo y bajando.
En principio necesitas otro actuador...o
.
Pues estás muy lejos del punto muerto según se ve. En cualquier caso ese montaje no da una relación lineal actuador-ángulo dará la ecuación de una catenaria o algo así.
Se me ocurren varias cosas.
Cambiar el actuador
Hacer un control "dinámico" como el que he contado que para que arranque le pongas más dutty un segundo, o el tiempo adecuado y luego bajes
Poner un freno eléctrico para que pare antes cuando estás usando duttys altos, eso se conseguiría cortocircuitando los bornes del motor cuando se desconecta., Con un pin del Arduino mandas el pwm y con otro cortocircuitas los bornes inmediatamente después de parar el pwm.
O una mezcla de todo eso