Bueno no se en que esta fallando mi codigo, ya lo voy a tener que simular y ver realmente que es.
Por ahora continuo..
Calculando los valores correctosComo dije estamos tratando de crear una recta que pasa por 2 puntos bien definidos. Una recta para la izquierda y otra para la derecha del centro. Esta ecuacion de la recta va a transformar nuestra entrada ( x o cursor ) en un valor de salida (y o duty)
Entonces primero debemos encontrarla, para esto tu programa debe de calcular esa recta.
Entonces buscamos un poco de informacion
https://es.wikipedia.org/wiki/RectaY encontramos que la ecuacion de nuestra recta que pasa por los puntos (x1,y1) y (x2,y2) esta dado por la ecuacion:
Para dar un ejemplo voy a usar los valores que dio Chaly en el post que te explico,
Sabemos que cuando sea minimo ( es decir cursor=x=205 , nos tiene que dar como resultado 0 ) , o es lo mismo que decir (205,0) x1=205 e y1=0
Por otra parte sabemos que cuando llegue a su maximo 818, tiene que llegar a 1023 es decir (818,1023) o x2=818 e y2=1023.
Si reemplazamos esos valores nos va a dar una formula asi:
1.6688 *
X - 342.11
( yo me ayude con una pagina )
https://www.wolframalpha.com/input/?i=line+through+%28205%2C0%29+and+%28818%2C1023%29Es decir si yo tengo una X con un valor de 205 a 818 de ahi sale 0 a 1023 , la mitad en caso que sea igual para ambos lados (205+818)/2 = 516
Con ese valor y la perdida de algunos valores luego de la coma me da como salida 519 casi casi cerca de la mitad. Si tomara exactamente todos los digitos daria 511.5 exacto ( es decir 1023/2 )
Ahora como dije si movemos el centro y queremos que en todo el recorrido ya sea izquierda o derecha vaya variando de forma lineal, necesitamos de 2 rectas.
Una del minimo al centro, y la otra del centro al maximo. Yo agregue que solo cuando pasa por el centro ya me de el valor 511
Es decir los puntos serian:
una de (min,0) a (centro,511)
Y otra de (centro,511) a (max,1023)
si es igual a centro(511) se obtiene 511 directamente de las rectas, pero para evitar que posible falta de precision no llegue al valor de 511 como salida, hago que cuando cursor sea igual a centro, salga un 511. (511.5 seria lo exacto pero no admite coma el duty)
reemplazando los valores en la ecuacion de la recta tenemos:
Yizq = 511 / (centro-min)
X - ((511*min) / (centro-min))
Yder = 512 / (max-centro)
X + 511 - ((512*min) / (max-centro))
Finalmente tenemos las 2 formulas, el calculo es complejo asi que mientras menos se haga mejor, por que lleva mucho tiempo.
Segun el valor de cursor, si esta por debajo de centro se va a usar Yizq (salida de 0-510), si esta por encima se va a usar Yder(salida de 512 a 1023), si es igual a centro entonces es igual a 511
Vamos a hacer unos ejemplos.....
min = 100
max = 1000
centro = 400
2 lineas de
(100,0) a (399,510) =>
y=510/299
x - 51000/299 ,
https://www.wolframalpha.com/input/?i=line+through+%28100%2C0%29+and+%28399%2C510%29(401,512) a (1000,1023) =>
y=511/599
x + 101777/599 ,
https://www.wolframalpha.com/input/?i=line+through+%28401%2C512%29+and+%281000%2C1023%291 punto:
(400,511)
Y una grafica de las 2 rectas
http://m.wolframalpha.com/input/?i=plot+%28510%2F299%29*x+-+51000%2F299%2C+%28511%2F599%29*x+%2B+101777%2F599%2C+x%3D0+to+1000&x=0&y=0
Se puede ver como una comienza en x=100 y equivale a Y=0 a medida que aumenta se cruzan en aproximadamente 400 que es el centro y de ahi en adelante se usa la otra linea, que cuando llega a 1000 es 1023.
Ecuacion de la recta:
Y = A
x + B
Fijate en las formulas que A y B son numeros. Esos numeros los vas a tener que calcular cada ves que modifiques los valores de derecha,izquierda y centro.
Toma de datos del ADCCon una sola toma de datos del ADC es mas que suficiente, pero es muy comun que siempre esten variando los ultimos bits, entonces para eliminar esto recurrimos a un promedio, usamos un multiplo de 2^n para que sea mas simple para el micro
for(i=0;i<8;i++)
{
cursor += read_adc ();
}
cursor/=8;
Es decir sumo 8 resultados y luego lo divido por 8, con 8 siendo el maximo de 1023 es de 8184 (8*1023) asi que no va a superar los 16bits de mi variable.
Por ultimo y mas importante EL USUARIO!!!Si ese que mete la pata en los mejores momentos y hacen que el programa funcione mal, por su ineptitud o descuido. Entonces hay que tomar ciertos "cuidados", siempre desconfia del usuario, incluso aunque seas vos mismo.
Por ejemplo teniendo estos valores:
min = 200
max = 800
y alguien le cambia el centro a el valor 100.. No hay nada que lo evite.
Otra cosa, imaginate ahora que le ponga un valor de 201. Tambien otro comportamiento "no previsto".
Entonces te tenes que asegurar de algunas cosas.. Dejar un espacio minimo entre min y max, asi no se juntan demasiado, tambien definir un espacio minimo entre min-centro y centro-max. Y que se cumpla que min < centro < max
Esto evitaria todas esas clases de problemas, si alguno mete la manito, o un dia te levantaste mal y presionaste sin querer algo por lo menos no va a andar tan mal.
PD: tal ves me fui un poco en la matematica pero es para que entiendas de donde calcular los valores de la formula. Que luego queres implementar en tu programa.