Autor Tema: Optimizacion UART  (Leído 3606 veces)

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

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Optimizacion UART
« en: 16 de Abril de 2009, 20:43:59 »
Hola yo de nuevo  :lol:...

Mi duda ahora es como calcular el porcentaje de error de la UART. para asi poder reducirlo al maximo ajustando el oscilador interno.

Ahorita estoy trabajando con el oscilador interno con PLL:
Código: [Seleccionar]
OSCTUN=0;Por lo tanto la frecuencia es de 7.37 Mhz
Código: [Seleccionar]
CLKDIVbits.PLLPRE=4;Por lo tanto la frecuencia se divide entre 6 y da 1.228 Mhz (dentro del rango correcto de 0.8 a 8 Mhz)
Código: [Seleccionar]
PLLFBD=128;Por lo tanto la frecuencia se multiplica por 130 y da 159.683 Mhz (dentro del rango correcto de 100 a 200 Mhz)
Código: [Seleccionar]
CLKDIVbits.PLLPOST=0;Por lo tanto la frecuencia se divide entre 2 y da 79.841 (dentro del rango correcto de 12.5 a 80 Mhz)

Código: [Seleccionar]
Fosc = 79841666.6 Hertz
Fcy=Fosc/2 = 39920833.33 Hertz
Ahora segun tengo entendido "y no se por que (así me la encontré)", la formula para obtener el valor del UxBRG Baud Rate Generator Prescaler, del que por cierto prácticamente no encontré información en la hoja de datos, es:

Código: [Seleccionar]
((FCY/BAUDRATE)/16)-1
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
En mi caso empece probando con 9600 baudios y con los valores previos del oscilador me dio: 258.9012587
Casi perfecto, uno que otro error, pero casi ninguno, bastante bien.

Despues fui aumentando y probe con 57600 y me dio: 42.31687645
Todavía rescatable, aunque el porcentaje de error ya se hace notorio como 2% aprox

Luego probe con 115200 y la formula me dio: 20.65843822
Se me hizo raro por que el cambio fue rotundo, bastante mal podría decir 85 o 90 % de error, quizás mas

Para el proyecto final, quiero que vaya a 230400 y la formula me da: 9.829219112
Casi ningún valor de los que manda son los que llegan, muchísimo error. Igual o peor que con 115200.
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Como pueden ver hice varias pruebas pero no encuentro alguna relación ni nada, para poder basarme y ajustar los valores para reducir el error, de hecho no se ni como calcularlo.

Alguna sugerencia de que puede ser lo que esta pasando...¿?¿?
Lo que tengo en mente es trabajar con los 230400 baudios con una tasa de error menor al 4% (no tan exigente)

Espero que me ayuden, gracias

______

Estoy usando un dsPIC33FJ12MC202 y un MAX232
« Última modificación: 16 de Abril de 2009, 20:47:39 por FlyingVector »

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: Optimizacion UART
« Respuesta #1 en: 17 de Abril de 2009, 14:10:30 »

Hola.

Jeje, me contesto yo solo  :lol:.

Bueno pues les comento que ya encontré la información que necesitaba, esta la vi en el dsPIC33F Family Reference Manual Sección 17. UART...

Pues siguiendo con mis pruebas encontré una formula para calcular el error, aclaro que ahora puse el U1MODEbits.BRGH = 1; (1 = BRG generates 4 clocks per bit period (4x baud clock, High-Speed mode)), la formula que encontre para el BRG en 1 es:

Error = (Calculated Baud Rate - Desired Baud Rate)/Desired Baud Rate

Trabajo con:
    CLKDIVbits.PLLPRE=4;                 //Divisor PLL_1 = PLLPRE+2  = 6
    CLKDIVbits.PLLPOST=0;                 //Divisor PLL_2 = PLLPOST+2 = 2
    PLLFBD=127;                  //Multiplicador PLL = PLLFDB+2 = 129
    OSCTUN=58;                  //Frecuencia del FRC 7.206912 MHz: Frecuencia central 7.3728 Mhz: +- 0.375%

Ahora mis cálculos son:
Fosc= 77474304
Fcy =  38737152
BaudRate = 230400
UxBRG = 41 (de 41.0325)
BaudRate Calculado = Fcy/(4*(UxBRG+1)) = 38737152/(4*(41+1)) = 230578.2857

Error = (230578.2857 - 230400)/230400 = 0.00077381
Error% = 0.077380952

Ahora, la comunicación ah mejorado bastante, de mandar pura basura ahora el error es menor, cambie el BRGH a alta velocidad y todos los cálculos ahora son mas precisos, con 115200 el error es poco, pero con 230400 (que es el valor que utilice en los calculos) todavia es considerable, aunque ah mejorado bastante desde el ultimo mensaje, todavía el error es considerable, visualmente después de ciclar el programa mandando el mismo carácter podria decir que el error es como de un 20% a 230400, pero como pueden ver el error en la formula deveria ser menor....

Espero que le den una revisada, quizás me este equivocando en algo... o que me recomiendan?


Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Optimizacion UART
« Respuesta #2 en: 17 de Abril de 2009, 16:40:45 »
yo no me fijaba en el % de error, esta expriencia tuya me ayudará a aprender al respecto. arigato cosaimas  :-)

si señor.
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: Optimizacion UART
« Respuesta #3 en: 17 de Abril de 2009, 18:42:49 »
Bueno siguiendo con mis pruebas, estuve leyendo en la hoja de datos del dsPIC y al parecer la precicion del reloj interno no es tan buena como me gustaria que fuese, por eso opte por pararme a usar un cristal, le puse un cristal de 16 MHz con el oscilador primario HS (cristales de 10 a 20 Mhz) con PLL:

Se supone que esta corriendo a 40 MIPS exactos, si calculo el error para 230400 baudios con FCY de 40 MIPS me da un error de .9% al parecer mas alto que cuando lo calculaba con el reloj interno, pero ya que el cristal es mas preciso la comunicación para mi sorpresa estaba bastante decente, aunque desde mi punto de vista, observando la pantalla de la terminal, no podría decirse que es perfecta ya que aparte de los .9% de error que calcule, se le añade un pequeño error al cristal(.005%), ruido de la fuente, el cable (uso un convertidor USB-232) y otras cosas mas.... por lo tanto mi percepción visual me dice que el error es como de un 3% aproximadamente....

Espero poder reducir el error un poco mas... :mrgreen: :mrgreen: :mrgreen:

Desconectado FlyingVector

  • PIC10
  • *
  • Mensajes: 46
Re: Optimizacion UART
« Respuesta #4 en: 17 de Abril de 2009, 19:11:01 »
...Solo unos pocos minutos del post anterior... :D :D :D :D :D

Les cuento que ajuste la frecuencia a 36MIPS para reducir el error de .9% al .16% y al parecer me fue mejor de lo que esperaba deje correr el micro mandando un solo carácter por un pequeño lapso de tiempo y calcule 50 000 (muy aproximado) caracteres mandado por el micro....  de los 50 000 caracteres hubo cero errores  8)  ... (mejor de lo que tenia en mente)

Gracias, jeje aunque prácticamente me respondí solo, pero igual por que yo se que me hubieran ayudado como lo han hecho en otros post's...
 :-/ :-/ :-/




 

anything