TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: Picuino en 14 de Mayo de 2017, 15:11:02

Título: Mis experiencias con Teensy 3.6
Publicado por: Picuino en 14 de Mayo de 2017, 15:11:02
Voy a ir publicando mis experiencias con la placa Teensy 3.6. (https://www.pjrc.com/store/teensy36.html)

Esta placa nace de un proyecto lanzado en Kickstarter (https://www.kickstarter.com/projects/paulstoffregen/teensy-35-and-36) en octubre de 2016 que mejora modelos anteriores. El modelo Teensy 3.6 es el más potente que existe en la actualidad. Contiene un microcontrolador ARM Cortex M4F de NXP/Freescale a 180MHz y tiene un formato adecuado para hacer pruebas en protoboard:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=47700.0;attach=27975;image)

La placa está preparada para ser programada desde el entorno Arduino, por lo que es muy sencillo comenzar a programarla desde cero. Esto no significa que sea un procesador sencillo, por lo que tendré que ir desentrañando sus registros internos a medida que vaya avanzando. En este tema iré publicando los progresos, junto a programas de ejemplo que sean útiles para comprender su funcionamiento interno.


Documentación:
Procesador ARM Cortex M4F de NXP modelo K66FX1M0VMD18
  Datasheet (http://www.nxp.com/assets/documents/data/en/data-sheets/K66P144M180SF5V2.pdf)
  Reference Manual (http://www.nxp.com/assets/documents/data/en/reference-manuals/K66P144M180SF5RMV2.pdf)
  Kinetis SDK v.1.3 API Reference Manual (http://www.nxp.com/assets/documents/data/en/reference-manuals/KSDK13APIRM.pdf)

Pinout:
 - Tienes que ingresar para ver archivos adjuntos -


Un saludo.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 14 de Mayo de 2017, 15:11:45
INDICE:

Programa: Encender y apagar led a máxima velocidad (http://www.todopic.com.ar/foros/index.php?topic=47700.msg397537#msg397537)
Compilar en línea de comandos (http://www.todopic.com.ar/foros/index.php?topic=47700.msg397570#msg397570)
Código de la función digitalWrite() (http://www.todopic.com.ar/foros/index.php?topic=47700.msg397606#msg397606)
Generar onda senoidal con DAC y DMA (http://www.todopic.com.ar/foros/index.php?topic=47700.msg397633#msg397633)
Conversor ADC con funciones Arduino (http://www.todopic.com.ar/foros/index.php?topic=47700.msg397667#msg397667)
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 14 de Mayo de 2017, 15:12:15
Mensaje reservado
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 14 de Mayo de 2017, 15:34:37
Activar led a máxima velocidad
El primer programa está destinado a conocer la velocidad de la placa y a manejar las entradas y salidas sin las librerías de Arduino, para comprobar la velocidad que se puede conseguir.

Activar led con librerías estandar:
Código: C
  1. int const ledPin = 13;
  2.  
  3. void setup() {                
  4.   pinMode(ledPin, OUTPUT);    
  5.   while(1) {
  6.     digitalWrite(ledPin, HIGH);   // turn the LED on (HIGH is the voltage level)
  7.     digitalWrite(ledPin, LOW);    // turn the LED off by making the voltage LOW
  8.   }
  9. }
  10.  
  11. void loop() {}

El periodo medido en el pin 13 es de 339ns (unos 61 ciclos de reloj a 180MHz)


Activar led con escritura directa a la salida:
Código: C
  1. const int ledPin = 13;
  2.  
  3. void setup() {
  4.   pinMode(ledPin, OUTPUT);
  5.   while(1) {
  6.     *portSetRegister(ledPin) = 1;
  7.     *portClearRegister(ledPin) = 1;
  8.   }
  9. }
  10.  
  11. void loop() {}

Ahora el periodo medido en el pin 13 es de solo 44.4ns (8 ciclos de reloj a 180MHz)

Un saludo.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 14 de Mayo de 2017, 16:33:58
El overhead the C++?
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: manwenwe en 14 de Mayo de 2017, 17:58:28
Qué hacen la teensy en concreto? He leído algo de que es compatible con el IDE de Arduino pero no lo acabo de comprender. Disculpas si la pregunta es obvia para la mayoría :(
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 14 de Mayo de 2017, 19:04:19
manwenwe:
No entiendo bien la pregunta. Teensy es una serie de placas.
La Teensy 3.6, que es la que estoy probando, tiene un ARM Cortex M4F.
Aquí te explica más su autor: https://www.kickstarter.com/projects/paulstoffregen/teensy-35-and-36

elgarbe:
No sé porqué oscila tan despacio. No es por el C++. He probado a escribir directamente en la memoria y pasa lo mismo. Yo esperaba que el tiempo total fuese de 4 ciclos (2 para escribir set y 2 para reset).

Este programa escribe directamente en memoria y funciona también con un periodo de 8 ciclos de reloj:
Código: C
  1. #define GPIO_PTR(reg, bit, offset) *(volatile uint8_t *)((((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) + offset * 4)
  2. #define PIN13_SET   GPIO_PTR(CORE_PIN13_PORTREG, CORE_PIN13_BIT, 32)
  3. #define PIN13_RESET   GPIO_PTR(CORE_PIN13_PORTREG, CORE_PIN13_BIT, 64)
  4.  
  5. void setup() {
  6.   pinMode(13, OUTPUT);
  7.   while(1) {
  8.     PIN13_SET = 1;
  9.     PIN13_RESET = 1;
  10.   }
  11. }
  12.  
  13. void loop() {}

Un saludo.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: KILLERJC en 14 de Mayo de 2017, 19:22:41
Pasa el dissasembly
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 14 de Mayo de 2017, 19:48:11
8 no es ilógico.
61 tiene que ser por todo el imbrincado sistema de funciones que debe usar hasta que escribe el registro.
Hasta donde sabía, en ARM no es como en PIC, por mas que parezca que va a tardar 2 ciclos puede tardar más, ARM tiene prefech y un monton de cosas más que te pueden cambiar un poco las cosas.
En algo tan simple no sé.

sds.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: planeta9999 en 14 de Mayo de 2017, 19:53:32
.

Prueba con DMA.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: KILLERJC en 14 de Mayo de 2017, 20:49:14
Hasta donde sabía, en ARM no es como en PIC, por mas que parezca que va a tardar 2 ciclos puede tardar más, ARM tiene prefech y un monton de cosas más que te pueden cambiar un poco las

Exacto, por eso le dije que pase el disassembly. Respecto al prefetch por ser el loop tan pequeño deberia cargarse completamente y no necesitar hacer otro, ya que estaria guardado por completo en la memoria esa.

Ademas por como se debe llamar a la funcion:

Código: C
  1. *portSetRegister(ledPin) = 1;
  2.     *portClearRegister(ledPin) = 1;

Imagino que ademas hace una AND o algo asi... Sino no tiene sentido pasarle el 1 y el ledPin, si fuera directo al registro, que muchos poseen registros de Set y registros de Reset, deberia ser algo asi:

Código: C
  1. *RegistroSET = ledPin;
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 15 de Mayo de 2017, 04:17:38
Intentaré pasar a línea de comandos para ver el disassembly.
portClearRegister(pin) es una macro que devuelve la dirección de memoria donde se apaga el pin al escribir 1. Cada bit tiene varias direcciones de memoria asociadas para activarle, desactivarle, etc. escribiendo directamente en un byte. Así no hace falta usar instrucciones de tipo bit ni operaciones lógicas.
Un saludo.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: manwenwe en 15 de Mayo de 2017, 04:41:24
manwenwe:
No entiendo bien la pregunta. Teensy es una serie de placas.
La Teensy 3.6, que es la que estoy probando, tiene un ARM Cortex M4F.
Aquí te explica más su autor: https://www.kickstarter.com/projects/paulstoffregen/teensy-35-and-36

Justo a esto que comenta el autor me refería:

The Arduino IDE is the primary method used to program Teensy.  Like prior models, my goal for Teensy is the best possibility compatibility with all Arduino functions and widely used libraries.

Aunque el micro es carete el precio de la placa no se justificaría sólo con eso sino que debe haber algo más por detrás. Y parece que ese algo es que se puede usar el IDE y las librerías de Arduino con un micro más potente de Freescale (se me hace raro decir NXP :-) ). ¿es eso no?. Parece muy buena idea pero sigo sin entenderlo del todo bien: ¿qué han cambiado del IDE de Arduino para que funcione con esa placa? ¿las librerías de más bajo nivel y ya está?. Es que desconocía que eso se pudiese hacer...

Saludos!
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 15 de Mayo de 2017, 10:08:57
Arduino es un Fork de Wiring (https://es.wikipedia.org/wiki/Wiring), que a su vez está basado en Processing (https://es.wikipedia.org/wiki/Processing). Son proyectos de código abierto y por lo tanto es sencillo realizar modificaciones, versiones o añadir módulos.

En este caso han diseñado un módulo para el entorno Arduino, llamado Teensyduino, que añade un compilador GCC para ARM, algunas opciones más en los menús del IDE Arduino y librerías de hardware y de usuario.
Las librerías de hardware hacen que la misma instrucción funcione igual en todos los micros. Por ejemplo digitalWrite(pin, level) escribe un pin de salida. Los pines se nombran con números naturales (no se dividen en puertos) y la función realiza todas las operaciones necesarias para abstraer al usuario de la capa de hardware. En ese sentido las librerías de hardware son como pequeñas HAL.

Además, el módulo Teensyduino añade librerías de usuario para trabajar con audio y muchas más funciones.

Es esa integración con Arduino y ese conjunto de herramientas de audio y librerías las que hacen que Teensy tenga un valor y un precio añadido.

En mi caso en seguida me meto en el código máquina y en los registros, pero prefiero tener un punto de partida de nivel 0 del que partir.

De todas formas no resulta difícil pasar las librerías a Eclipse o a otro entorno y trabajar fuera de Arduino.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: manwenwe en 15 de Mayo de 2017, 10:36:17
Gracias Picuino. Lo desconocía. Está chulo el concepto. He visto un montón de placas ARM tipo RPI con un micro auxiliar como el de Arduino. Lo que creo que estaría muy chulo, si no existe ya, es que adaptaran el IDE de arduino a algún procesador de los que llevan un Cortex M4 o M7 auxiliar para tiempo real. Sería la caña poder pasarle mensajes al procesador desde el microcontrolador para que haga cosas y así ahorrarte parte de desarrollo bajo Linux. Sólo pienso en alto jeje

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 15 de Mayo de 2017, 13:59:41
He conseguido compilar desde línea de comandos.

Sólo hay que seguir los siguientes pasos:
1. Copiar en otra dirección todo el contenido del directorio "Arduino/hardware/teensy/avr/cores/teensy3"
    Es necesario copiar el directorio en otra dirección para no corromper los archivos que utiliza Arduino.
2. Entrar en el directorio y modificar el Makefile para actualizar las rutas (paths) correctos
    Compilador: Arduino/hardware/tools/arm/bin
    Librerias: Arduino/hardware/teensy/avr/libraries
3. Modificar el archivo main.cpp para incluir el programa de usuario
4. Compilar con make
5. Cargar el programa en Teensy con teensy_loader_cli:
    https://www.pjrc.com/teensy/loader_cli.html
    https://github.com/PaulStoffregen/teensy_loader_cli

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 15 de Mayo de 2017, 14:04:31
No he sido capaz de generar el código ensamblador.
He probado con la opción -S y da error.
La opción -fverbose-asm tampoco genera ensamblador.

¿Alguna idea?

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: KILLERJC en 15 de Mayo de 2017, 14:10:40
si utiliza los arm-none-eabi-* creo que podrias usar el arm-none-eabi-objdump, para hacer el dissasembly del .o generado.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 15 de Mayo de 2017, 17:30:05
Este es el bucle que enciende y apaga el led:
Código: ASM
  1. ldr     r3, .L4
  2.         ldr     r3, [r3, #104]
  3.         movs    r2, #1
  4. .L2:
  5.         strb    r2, [r3, #128]
  6.         strb    r2, [r3, #256]
  7.         b       .L2

Parece que todo está bien. Estoy pensando que quizás tarda tanto porque hay retardo en la escritura a memoria.

Un saludo.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Carl47D en 15 de Mayo de 2017, 19:12:56
Gracias por compartir los avances que vas teniendo :).

Con respecto a la frecuencia que alcanzan los pines, en algunos micros la frecuencia a la cual pueden "togglear" esta limitado por el mismo periferico, no conozco los Kinetis pero en un micro que tengo lo maximo a lo que pueden cambiar de estado es ~ 20MHz, tal vez llegaste en ese limite ( al limite del micro que tienes en la Teensy ) y por eso no pueden in más rápido.

Ese dato debe de estar en el datasheet, pero entre los tantos que tienen para cada familia de micros no sabria en cual mirar.

Saludos
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: KILLERJC en 15 de Mayo de 2017, 19:45:23
Código: C
  1. .L2:
  2.         strb    r2, [r3, #128]
  3.         strb    r2, [r3, #256]
  4.         b       .L2

El loop es ese. Y es lo minimo que puede haber... Ya con los valores precargados y luego ejecutar las instrucciones, Los store creo que ocupan 2 ciclos cada uno, pero luego el branch ocupa de 2 a 4 ciclos segun si debe limpiar todo el pipeline. Y ahi deberia tener tus 8, pero seria mas corto el pulso en alto.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 15 de Mayo de 2017, 22:54:20
Y el assemby usando las instrucciones de Arduino?
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 03:22:56
En el datasheet no he encontrado el dato de máxima velocidad de los pines de salida:
http://www.nxp.com/assets/documents/data/en/data-sheets/K66P144M180SF5V2.pdf
Pero en el DSPI dicen que la velocidad máxima es de 30MHz.

El loop (branch) no tarda nada. Lo he probado con el osciloscopio. Si repito dentro del bucle varias veces las instrucciones de subir y bajar nivel, siempre tarda 4 ciclos cada una. El branch no añade ningún ciclo extra. Al ser tan pequeño el código debe almacenarlo todo en el prefetch con predicción de salto.

Para elgarbe: las instrucciones de Arduino son C.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 16 de Mayo de 2017, 07:33:42
Pero que assemby te genera?, porque si tarda mucho más debe haber algo más.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 08:36:19
Lo que he puesto es el assembly generado desde línea de comandos. En principio debe ser el mismo que el generado por el IDE de Arduino (he utilizado el mismo makefile) pero lo voy a comprobar enviando al Teensy el archivo compilado desde línea de comandos.
También voy a probar a meter assembler en Arduino, pero el paso de parámetros me resulta complicado en GCC.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 16 de Mayo de 2017, 09:10:45
Me parece que es evidente que el assembly generado por el primer programa que pusiste no es igual al generado por el segundo ya que los tiempos sin distintos. En el primero usas librería de c++ y en el segundo macros.
Mi teoría es que el código generado usando las librerías de wiring? Arduino? C++? O como se llame lo del primer ejemplo agrega un montón de código innecesario y es lo que creo se llama overhead de c++.

Sds.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 11:18:07
En el primer caso hacía uso de una función c de Arduino que hace de enlace con el hardware de cada placa:

digitalWrite(pin, level)

No utiliza C++ ni tiene overhead. Tarda más en ejecutarse porque tiene un código c que realiza ciertas simplificaciones y comprobaciones antes de escribir el pin.
La función está definida en el archivo Arduino/hardware/teensy/avr/cores/teensy3/pins_teensy.c (https://github.com/PaulStoffregen/cores/blob/master/teensy3/pins_teensy.c):
Código: C
  1. void digitalWrite(uint8_t pin, uint8_t val)
  2. {
  3.         if (pin >= CORE_NUM_DIGITAL) return;
  4.  
  5.         if (*portModeRegister(pin)) {
  6.                 if (val) {
  7.                         *portSetRegister(pin) = 1;
  8.                 } else {
  9.                         *portClearRegister(pin) = 1;
  10.                 }
  11.         } else {
  12.                 volatile uint32_t *config = portConfigRegister(pin);
  13.                 if (val) {
  14.                         *config |= (PORT_PCR_PE | PORT_PCR_PS);
  15.                 } else {
  16.                         *config &= ~(PORT_PCR_PE);
  17.                 }
  18.         }
  19. }


La función digitalWrite() a su vez utiliza para escribir en los pines, una macro basada en una tabla de punteros.
La macro portSetRegister(pin) está definida en el archivo Arduino/hardware/teensy/avr/cores/teensy3/pins_arduino.h (https://github.com/PaulStoffregen/cores/blob/master/teensy3/pins_arduino.h):
Código: C
  1. #define portSetRegister(pin)    ((volatile uint8_t *)(digital_pin_to_info_PGM[(pin)].reg + 32))
  2. #define portClearRegister(pin)  ((volatile uint8_t *)(digital_pin_to_info_PGM[(pin)].reg + 64))
  3. #define portToggleRegister(pin) ((volatile uint8_t *)(digital_pin_to_info_PGM[(pin)].reg + 96))

La macro está basada en una tabla constante de punteros digital_pin_to_info_PGM[] que está definida en el archivo Arduino/hardware/teensy/avr/cores/teensy3/pins_teensy.c

Código: C
  1. #if defined(KINETISK)
  2. #define GPIO_BITBAND_ADDR(reg, bit) (((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000)
  3. #define GPIO_BITBAND_PTR(reg, bit) ((uint32_t *)GPIO_BITBAND_ADDR((reg), (bit)))
  4. const struct digital_pin_bitband_and_config_table_struct digital_pin_to_info_PGM[] = {
  5.         {GPIO_BITBAND_PTR(CORE_PIN0_PORTREG, CORE_PIN0_BIT), &CORE_PIN0_CONFIG},
  6.         {GPIO_BITBAND_PTR(CORE_PIN1_PORTREG, CORE_PIN1_BIT), &CORE_PIN1_CONFIG},
  7.         {GPIO_BITBAND_PTR(CORE_PIN2_PORTREG, CORE_PIN2_BIT), &CORE_PIN2_CONFIG},
  8.         {GPIO_BITBAND_PTR(CORE_PIN3_PORTREG, CORE_PIN3_BIT), &CORE_PIN3_CONFIG},
  9.         {GPIO_BITBAND_PTR(CORE_PIN4_PORTREG, CORE_PIN4_BIT), &CORE_PIN4_CONFIG},
  10.         {GPIO_BITBAND_PTR(CORE_PIN5_PORTREG, CORE_PIN5_BIT), &CORE_PIN5_CONFIG},
  11.         {GPIO_BITBAND_PTR(CORE_PIN6_PORTREG, CORE_PIN6_BIT), &CORE_PIN6_CONFIG},
  12.         {GPIO_BITBAND_PTR(CORE_PIN7_PORTREG, CORE_PIN7_BIT), &CORE_PIN7_CONFIG},
  13.         {GPIO_BITBAND_PTR(CORE_PIN8_PORTREG, CORE_PIN8_BIT), &CORE_PIN8_CONFIG},
  14.         {GPIO_BITBAND_PTR(CORE_PIN9_PORTREG, CORE_PIN9_BIT), &CORE_PIN9_CONFIG},
  15.         {GPIO_BITBAND_PTR(CORE_PIN10_PORTREG, CORE_PIN10_BIT), &CORE_PIN10_CONFIG},
  16.         {GPIO_BITBAND_PTR(CORE_PIN11_PORTREG, CORE_PIN11_BIT), &CORE_PIN11_CONFIG},
  17.         {GPIO_BITBAND_PTR(CORE_PIN12_PORTREG, CORE_PIN12_BIT), &CORE_PIN12_CONFIG},
  18.         {GPIO_BITBAND_PTR(CORE_PIN13_PORTREG, CORE_PIN13_BIT), &CORE_PIN13_CONFIG},
  19.         {GPIO_BITBAND_PTR(CORE_PIN14_PORTREG, CORE_PIN14_BIT), &CORE_PIN14_CONFIG},
  20.         {GPIO_BITBAND_PTR(CORE_PIN15_PORTREG, CORE_PIN15_BIT), &CORE_PIN15_CONFIG},
  21.         {GPIO_BITBAND_PTR(CORE_PIN16_PORTREG, CORE_PIN16_BIT), &CORE_PIN16_CONFIG},
  22.         {GPIO_BITBAND_PTR(CORE_PIN17_PORTREG, CORE_PIN17_BIT), &CORE_PIN17_CONFIG},
  23.         {GPIO_BITBAND_PTR(CORE_PIN18_PORTREG, CORE_PIN18_BIT), &CORE_PIN18_CONFIG},
  24.         {GPIO_BITBAND_PTR(CORE_PIN19_PORTREG, CORE_PIN19_BIT), &CORE_PIN19_CONFIG},
  25.         {GPIO_BITBAND_PTR(CORE_PIN20_PORTREG, CORE_PIN20_BIT), &CORE_PIN20_CONFIG},
  26.         {GPIO_BITBAND_PTR(CORE_PIN21_PORTREG, CORE_PIN21_BIT), &CORE_PIN21_CONFIG},
  27.         {GPIO_BITBAND_PTR(CORE_PIN22_PORTREG, CORE_PIN22_BIT), &CORE_PIN22_CONFIG},
  28.         {GPIO_BITBAND_PTR(CORE_PIN23_PORTREG, CORE_PIN23_BIT), &CORE_PIN23_CONFIG},
  29.         {GPIO_BITBAND_PTR(CORE_PIN24_PORTREG, CORE_PIN24_BIT), &CORE_PIN24_CONFIG},
  30.         {GPIO_BITBAND_PTR(CORE_PIN25_PORTREG, CORE_PIN25_BIT), &CORE_PIN25_CONFIG},
  31.         {GPIO_BITBAND_PTR(CORE_PIN26_PORTREG, CORE_PIN26_BIT), &CORE_PIN26_CONFIG},
  32.         {GPIO_BITBAND_PTR(CORE_PIN27_PORTREG, CORE_PIN27_BIT), &CORE_PIN27_CONFIG},
  33.         {GPIO_BITBAND_PTR(CORE_PIN28_PORTREG, CORE_PIN28_BIT), &CORE_PIN28_CONFIG},
  34.         {GPIO_BITBAND_PTR(CORE_PIN29_PORTREG, CORE_PIN29_BIT), &CORE_PIN29_CONFIG},
  35.         {GPIO_BITBAND_PTR(CORE_PIN30_PORTREG, CORE_PIN30_BIT), &CORE_PIN30_CONFIG},
  36.         {GPIO_BITBAND_PTR(CORE_PIN31_PORTREG, CORE_PIN31_BIT), &CORE_PIN31_CONFIG},
  37.         {GPIO_BITBAND_PTR(CORE_PIN32_PORTREG, CORE_PIN32_BIT), &CORE_PIN32_CONFIG},
  38.         {GPIO_BITBAND_PTR(CORE_PIN33_PORTREG, CORE_PIN33_BIT), &CORE_PIN33_CONFIG},
  39. };

Este código extra de llamada a función y de comprobación del rango del pin es lo que hace que la función sea más lenta que la escritura directa a memoria. La ventaja obvia es que simplifica bastante la tarea de activar un pin.


En el segundo programa hice uso directamente de la macro portSetRegister(pin) para escribir en el pin de salida.

Un saludo.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 16 de Mayo de 2017, 11:22:53
Excelente!
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 11:35:41
El osciloscopio me marca 169ns para la llamada a la función digitalWrite(), que a 180MHz significan:
  169ns / 5.555ns = 30 ciclos de reloj

Lo que no termino de entender es porqué no tarda solo 2 ciclos de reloj la instrucción  "*portSetRegister(13) = 1"
que en ensamblador se traduce en una simple instrucción "strb    r2, [r3, #128]"

A ver si escribiendo directamente en ensamblador funciona bien.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 12:35:06
Bien, el problema definitivamente no está en el programa.
El retardo se produce en la escritura a la memoria de activación o borrado de pin.

Este es el programa que he probado:

Código: C
  1. void setup() {
  2.   pinMode(13, OUTPUT);
  3.  
  4.   __asm__ volatile (
  5.     " ldr     r3, =digital_pin_to_info_PGM"  "\n"
  6.     " ldr     r3, [r3, #104]"  "\n"
  7.     " movs    r2, #1"          "\n"
  8.     ".repeat_label:"           "\n"
  9.     " strb    r2, [r3, #128]"  "\n"
  10.     " strb    r2, [r3, #256]"  "\n"
  11.     " b       .repeat_label"   "\n"
  12.     :  // Outputs
  13.     :  // Inputs
  14.     : "r2", "r3" // Clobbers
  15.   );
  16.  
  17. }
  18.  
  19. void loop() {}

El bucle principal está compuesto por dos instrucciones assembler "strb" y por un salto incondicional o branch. Cada una de las instrucciones "strb" tarda 4 ciclos de reloj en vez de los 2 ciclos declarados en el datasheet y el branch no tarda nada en ejecutarse.

Las constantes están sacadas directamente del código desensamblado anteriormente.
En concreto:
#104 es la posición 13 (pin13) de la tabla de punteros digital_pin_to_info_PGM donde cada una de las posiciones ocupa 8 bytes (13*8 = 104)
#128 es el offset en bytes correspondiente a la dirección de SetPin
#128 es el offset en bytes correspondiente a la dirección de ClearPin

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 16 de Mayo de 2017, 12:54:45
Que frecuencia de trabajo posee tu osciloscopio?

Sds.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 13:19:54
50MHz con 1GSa/s. La sonda está en modo 10x que permite ver esas frecuencias.

La frecuencia de salida del pin 13 es de 22.48MHz (Hay un pequeño error de 600ppm debido al oscilador del Teensy que no es muy exacto)

El osciloscopio puede ver frecuencias digitales mayores de 50MHz, de hecho he llegado a ver sin problema 100MHz, pero con atenuación.

En este caso puedo ver la señal entre 0 y 3.3V con un tiempo de subida de 13ns y un tiempo de bajada de 13ns del 10% al 90%
De hecho coincide con el datasheet (página 18 y 19) en el que aparece un tiempo de subida y bajada de 15ns.

En el datashee (http://www.nxp.com/assets/documents/data/en/data-sheets/K66P144M180SF5V2.pdf)t también indica que hay un modo de funcionamiento "Slew disabled" con el que los tiempos de subida y bajada pasan a ser de 7ns. Voy a intentar activar ese modo.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 16 de Mayo de 2017, 13:57:31
Si bien no es la respuesta, evidentemente es algo conocido el límete de la velocidad en el GPIO:

http://www.kerrywong.com/2014/09/21/on-arduino-due-pwm-frequency/

sds.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: KILLERJC en 16 de Mayo de 2017, 14:01:31
El tema es que aca no hay relacion fija de ciclos de instruccion vs ciclos de reloj
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 16:23:21
Creo que este tema ya ha dado por ahora mucho de sí. Me apunto para más adelante investigar sobre la configuración de slew en el GPIO.

DAC, PDB Y DMA
Ahora voy a pasar al conversor DAC y al DMA para generar señales analógicas a partir de una tabla de datos.

Este microcontrolador tiene dos DAC de 4096 puntos (12 bits) con las siguientes características de velocidad y rango:
(Página 50 en adelante del datasheet (http://www.nxp.com/assets/documents/data/en/data-sheets/K66P144M180SF5V2.pdf))

12-bit DAC operating requirements
V_DDA   Supply voltage  3.6V
V_DACR   Reference voltage  1.13V - 3.6V
C_L  Output load capacitance  100pF
I_L   Output load current  1mA

Full-scale settling time (0x080 to 0xF7F) (high-power mode) 15us
Code-to-code settling time (0xBF8 to 0xC08)  0.7us
Slew rate -80h→ F7Fh→ 80h (high-power mode) 1.7V/us
3dB bandwidth (high-power mode)  550kHz

Es importante señalar que el DAC tiene dos modos de funcionamiento, uno rápido que consume más y otro lento que consume menos. En los datos anteriores sólo he copiado los datos del modo rápido o high-power.

El programa para generar una señal senoidal es el siguiente:

Código: C
  1. /*
  2.    DAC with DMA
  3.    https://gist.github.com/samyk/6273cf9a45d63a50c38c8b50a39a8f52
  4. */
  5.  
  6. #include <DMAChannel.h>
  7. #include <math.h>
  8. #include "pdb.h"
  9.  
  10.  
  11. #define FUNC_TABLE_SIZE 3600
  12. #define DOTS_PER_CYCLE  15
  13. #define FUNC_AMPLITUDE  0.80
  14. #define DAC_MAXVALUE    4096
  15. #define DAC0_DAT16 *(volatile uint16_t *)&(DAC0_DAT0L)
  16. #define DAC1_DAT16 *(volatile uint16_t *)&(DAC1_DAT0L)
  17.  
  18. DMAChannel dma0(false);
  19.  
  20.  
  21. void fill_sin(volatile uint16_t *table, uint16_t table_size, uint16_t wave_dots) {
  22.   // Fill sine function
  23.   for (int i=0; i<table_size; i++) {
  24.      table[i] = DAC_MAXVALUE * (0.50 + 0.50 * FUNC_AMPLITUDE * cos(i * (2.0 / wave_dots) * 3.1415927));
  25.   }
  26. }
  27.  
  28.  
  29. void DAC_setup(void) {
  30.   SIM_SCGC2 |= SIM_SCGC2_DAC0; // enable DAC clock
  31.   DAC0_C0 = DAC_C0_DACEN | DAC_C0_DACRFS; // enable the DAC module, 3.3V reference
  32.   DAC0_DAT16 = DAC_MAXVALUE/2;  // Set DAC DC voltage
  33. }
  34.  
  35.  
  36. void PDB_setup(uint16_t period) {
  37.   // set the programmable delay block to trigger DMA requests
  38.   SIM_SCGC6 |= SIM_SCGC6_PDB; // Enable PDB clock
  39.   PDB0_IDLY = 0;              // Interrupt delay register
  40.   period = (period<8) ? 7 : (period>60000) ? 60000 : period - 1;
  41.   PDB0_MOD = period;          // PDB_PERIOD; // modulus register, sets period
  42.   PDB0_SC = PDB_CONFIG | PDB_SC_LDOK;   // load registers from buffers
  43.   PDB0_SC = PDB_CONFIG | PDB_SC_SWTRIG; // reset and restart
  44.   PDB0_CH0C1 = 0x0101; // channel n control register?
  45. }
  46.  
  47.  
  48. void DMA_setup(DMAChannel& dma, volatile uint16_t buff[], int tam, volatile uint16_t *dest) {
  49.   dma.begin(true);  // allocate the DMA channel first
  50.   dma.sourceBuffer(buff, tam);
  51.   dma.destination(*dest);
  52.   dma.triggerAtHardwareEvent(DMAMUX_SOURCE_PDB);
  53.   dma.enable();
  54. }
  55.  
  56.  
  57. void setup()
  58. {
  59.   Serial.begin(9600);
  60.  
  61.   // DAC and table setup
  62.   static volatile uint16_t func_table[FUNC_TABLE_SIZE];
  63.   fill_sin(func_table, FUNC_TABLE_SIZE, DOTS_PER_CYCLE);
  64.   DAC_setup();
  65.  
  66.   // PDB Setup
  67.   PDB_setup(10);
  68.  
  69.   // DMA Setup
  70.   DMA_setup(dma0, func_table, FUNC_TABLE_SIZE * sizeof(func_table[0]), &DAC0_DAT16);
  71. }
  72.  
  73.  
  74. void loop() {
  75.   int i;
  76.   while(1) {
  77.     // Change PDB speed
  78.     i = Serial.parseInt();
  79.     if (i == 0) continue;
  80.     Serial.println(i);
  81.     PDB_setup(i);
  82.   }
  83. }

Hay que acompañarle del archivo "pdb.h" de la librería Audio:
Código: C
  1. /* Audio Library for Teensy 3.X
  2.  * Copyright (c) 2014, Paul Stoffregen, paul@pjrc.com
  3.  *
  4.  * Development of this audio library was funded by PJRC.COM, LLC by sales of
  5.  * Teensy and Audio Adaptor boards.  Please support PJRC's efforts to develop
  6.  * open source software by purchasing Teensy or other PJRC products.
  7.  *
  8.  * Permission is hereby granted, free of charge, to any person obtaining a copy
  9.  * of this software and associated documentation files (the "Software"), to deal
  10.  * in the Software without restriction, including without limitation the rights
  11.  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12.  * copies of the Software, and to permit persons to whom the Software is
  13.  * furnished to do so, subject to the following conditions:
  14.  *
  15.  * The above copyright notice, development funding notice, and this permission
  16.  * notice shall be included in all copies or substantial portions of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21.  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23.  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24.  * THE SOFTWARE.
  25.  */
  26.  
  27. #ifndef pdb_h_
  28. #define pdb_h_
  29.  
  30. #include "kinetis.h"
  31.  
  32. // Multiple input & output objects use the Programmable Delay Block
  33. // to set their sample rate.  They must all configure the same
  34. // period to avoid chaos.
  35.  
  36. #define PDB_CONFIG (PDB_SC_TRGSEL(15) | PDB_SC_PDBEN | PDB_SC_CONT | PDB_SC_PDBIE | PDB_SC_DMAEN)
  37.  
  38.  
  39. #if F_BUS == 120000000
  40.   #define PDB_PERIOD (2720-1)
  41. #elif F_BUS == 108000000
  42.   #define PDB_PERIOD (2448-1)
  43. #elif F_BUS == 96000000
  44.   #define PDB_PERIOD (2176-1)
  45. #elif F_BUS == 90000000
  46.   #define PDB_PERIOD (2040-1)
  47. #elif F_BUS == 80000000
  48.   #define PDB_PERIOD (1813-1)  // small ?? error
  49. #elif F_BUS == 72000000
  50.   #define PDB_PERIOD (1632-1)
  51. #elif F_BUS == 64000000
  52.   #define PDB_PERIOD (1451-1)  // small ?? error
  53. #elif F_BUS == 60000000
  54.   #define PDB_PERIOD (1360-1)
  55. #elif F_BUS == 56000000
  56.   #define PDB_PERIOD (1269-1)  // 0.026% error
  57. #elif F_BUS == 54000000
  58.   #define PDB_PERIOD (1224-1)
  59. #elif F_BUS == 48000000
  60.   #define PDB_PERIOD (1088-1)
  61. #elif F_BUS == 40000000
  62.   #define PDB_PERIOD (907-1)  // small ?? error
  63. #elif F_BUS == 36000000
  64.   #define PDB_PERIOD (816-1)
  65. #elif F_BUS == 24000000
  66.   #define PDB_PERIOD (544-1)
  67. #elif F_BUS == 16000000
  68.   #define PDB_PERIOD (363-1)  // 0.092% error
  69. #else
  70.   #error "Unsupported F_BUS speed"
  71. #endif
  72.  
  73. #endif

La señal producida es una onda senoidal de 500kHz y 15 puntos por ciclo.
Esta frecuencia y número de puntos se pueden cambiar fácilmente con los valores que contiene el programa en las definiciones.
El periodo del PDB (reloj del DMA) se alimenta de una señal de 60MHz y envía un pulso al DMA cada cierto periodo para que se actualice el DAC. El periodo mínimo es de 8 ciclos (60Mhz/8 = 7.5MHz) y el periodo máximo es de 60000 ciclos (60Mhz/60000 = 1kHz)
Este periodo establece cuántas veces por segundo se actualizará el DAC.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 16:29:14
Algunas gráficas.
El número de puntos es siempre de 15 puntos por ciclo. La señal enviada al DAC es siempre la misma y sólo cambia el periodo de escritura de datos en el DAC.

Con un periodo de 8 ciclos (7.5MHz o una escritura al DAC cada 133ns)
 - Tienes que ingresar para ver archivos adjuntos -

Con un periodo de 60 ciclos (1MHz o una escritura al DAC cada 1us)
 - Tienes que ingresar para ver archivos adjuntos -

Con un periodo de 600 ciclos (100kHz o una escritura al DAC cada 10us)
 - Tienes que ingresar para ver archivos adjuntos -

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: planeta9999 en 16 de Mayo de 2017, 17:17:27
.

Interesante. ¿ Que vas a hacer un generador de funciones ?.

Estaba buscando aplicación a los samples en BGA del MK66 que recibí de NXP, y podría hacerme un generador de funciones programable. Hace tiempo quería comprar uno, pero mejor hacerlo y de paso hago mi primer diseño con BGA.


(http://www.todopic.com.ar/foros/imgtiny/154vi3m.jpg)

Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 16 de Mayo de 2017, 17:24:35
Si quieres puedes hacerte uno, pero el chip no da mucha frecuencia (500kHz) y la salida tiene un rango limitado (3.3V que yo he dejado en 2.8V para conseguir mejor velocidad y que la carga no afecte a la precisión cerca de los rail).

En realidad quiero conseguir un analizador de impedancia. Por un lado inyecto una señal senoidal y por otro leo la salida con un ADC. Luego correlaciono ambas señales para calcular ganancia y desfase. Con estas dos magnitudes puedes calcular, por ejemplo, la capacidad y la ESR de un condensador.

Calculando estas dos magnitudes para muchos puntos de frecuencia puedes graficar un bode completo de un filtro, de una fuente de alimentación, etc.


Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: planeta9999 en 16 de Mayo de 2017, 18:37:26
Si quieres puedes hacerte uno, pero el chip no da mucha frecuencia (500kHz) y la salida tiene un rango limitado (3.3V que yo he dejado en 2.8V para conseguir mejor velocidad y que la carga no afecte a la precisión cerca de los rail).

Es más por hacer algo con BGA con los samples que he recibido de NXP, la aplicación casi que me da igual. También puedo hacer una plaquita de evaluación, parecida al Teensy, pero sin bootloader y con acceso SWD para programar y hacer Debug con GDB.

O puedo montar una placa para controlar paneles Led RGB de 64x32 con las librerías Smartmatrix. De todas formas creo que voy a dejar los Kinetis, son caros comparados con los STM32, y mucho mejor trabajar con los SAM S70 de Atmel, más potentes y casi a mitad de precio.

Si vas a trabajar el Teensy, también puedes hacerlo desde Atmel Studio, hay un plugin gratuito para abrir proyectos Arduino.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 17 de Mayo de 2017, 13:25:49
Yo haría una placa de pruebas que se pueda conectar luego a otra placa de aplicación (como las stm32 nucleo).

Tendré en cuenta lo del Atmel Studio o Eclipse.  Ahora que he conseguido compilar desde línea de comandos no es difícil pasar el proyecto a cualquier IDE.

Conversor Analógico Digital ADC
Continúo haciendo pruebas con los módulos de Teensy 3.6. En este caso pruebo el ADC con las librerías estandar de Arduino.

Código: C
  1. /*
  2.    ADC with analogRead();
  3. */
  4. const int ledPin = 13;
  5.  
  6. void setup() {
  7.   pinMode(ledPin, OUTPUT);
  8.   pinMode(A20, INPUT);
  9.  
  10.   while(1) {
  11.    *portSetRegister(ledPin) = 1;
  12.    analogRead(A20);
  13.    *portClearRegister(ledPin) = 1;
  14.   }
  15. }
  16.  
  17. void loop() {}

El código anterior consigue realizar una conversión analógico-digital cada 7us (a 142kHz). Por ahora no es mucho para este microcontrolador. Parece que tendré que modificar directamente los registros.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 17 de Mayo de 2017, 14:30:31
Solo un comentario por si no lo viste ya.
Cada periférico o grupo de perifericos tienen Fclk independientes con prescalers configurables. Quizá tu ADC estña lento porque por defecto el clk que le llega es bajo.

Saludos!
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 17 de Mayo de 2017, 15:39:04
Si lo sé. Por eso tendré que escribir directamente en los registros de configuración para conseguir cambiar el reloj, el tiempo de adquisición, el número de bits convertidos, etc. Un poco rollo, pero no hay otra forma de optimizar la conversión.
Después tendré que asociar un generador de pulsos para que el inicio de la conversión del ADC se realice en tiempos deterministas y los dos ADC comiencen a la vez.
La idea es samplear a la vez dos señales con frecuencia y tiempos idénticos de manera que luego se pueda comparar el desfase entre las dos señales. Además, cuanto mayor sea la frecuencia, mejor.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 17 de Mayo de 2017, 18:17:17
Bueno, objetivo conseguido.
Con el siguiente programa, se configura el reloj del ADC a partir del reloj del bus (60MHz) dividido entre cuatro, es decir, 15MHz.
La conversión es de 12bits sin signo

El resultado final es de una conversión cada 1.9us (unos 500kHz). La conversión tarda aproximadamente 28 ciclos de reloj de 15MHz. Casi coincide con el datasheet que indica 26 ciclos de reloj para esta configuración.

Código: C
  1. /*
  2.    Fast ADC
  3.    Writing config registers
  4. */
  5.  
  6. void ADC0_init(void);
  7. uint16_t ADC0_read(char channel);
  8.  
  9. void setup() {
  10.   Serial.begin(9600);
  11.  
  12.   // Config pins
  13.   pinMode(13, OUTPUT);
  14.   pinMode(A20, INPUT);
  15.  
  16.   // Inits ADC and read
  17.   ADC0_init();
  18.   for(;;) {  
  19.      ADC0_read(20);
  20.   }
  21. }
  22.  
  23. void loop() {}
  24.  
  25. // Init ADC
  26. // https://forum.pjrc.com/threads/31286-Analog-Conversion-Complete-Interrupt
  27. //
  28. void ADC0_init(void) {
  29.   uint32_t ADC_CFG1, ADC_CFG2;
  30.  
  31.   ADC_CFG1 =
  32.     //+ ADC_CFG1_ADLPC      // Low-power configuration
  33.     + ADC_CFG1_ADIV(1)    // Clock divide, 0=direct, 1=div2, 2=div4, 3=div8
  34.     //+ ADC_CFG1_ADLSMP     // Sample Time config, 0=short, 1=long
  35.     + ADC_CFG1_MODE(1)    // 0=8bit, 1=12bit, 2=10bit, 3=16bit
  36.     + ADC_CFG1_ADICLK(1); // input clock, 0=bus, 1=bus/2, 2= , 3=async
  37.   ADC0_CFG1 = ADC_CFG1;
  38.  
  39.   ADC_CFG2 =
  40.     //+ ADC_CFG2_MUXSEL
  41.     + ADC_CFG2_ADACKEN    // Async clock enable
  42.     + ADC_CFG2_ADHSC      // High speed enable
  43.     + ADC_CFG2_ADLSTS(3); // extra clocks for long conversion (0=24,1=12,2=6,3=4)
  44.   ADC0_CFG2 = ADC_CFG2;
  45.    
  46.   ADC0_SC1A =
  47.     //+ ADC_SC1_COCO  // Conversion Complete
  48.     //+ ADC_AIEN   // Interrupt Enable
  49.     //+ ADC_DIFF   // Differential Mode Enable
  50.     + 20;        // Input channel select
  51.  
  52.   ADC0_SC2 =
  53.     //+ ADC_SC2_ADACT      // Conversion active
  54.     //+ ADC_SC2_ADTRG      // Conversion Trigger 0=Software, 1=Hardware
  55.     //+ ADC_SC2_ACFE       // Compare Function Enable
  56.     //+ ADC_SC2_ACFGT      // Compare Function Greater Than Enable
  57.     //+ ADC_SC2_ACREN      // Compare Function Range Enable
  58.     //+ ADC_SC2_DMAEN      // DMA Enable
  59.     + ADC_SC2_REFSEL(0); // Voltage Reference 0=Ext pins, 1=Alternate Ext. pins
  60.    
  61.   ADC0_SC3 =
  62.     //+ ADC_SC3_CAL     // Init Calibration
  63.     //+ ADC_SC3_CALF    // Calibration Failed
  64.     //+ ADC_SC3_ADCO    // Continuous conversion Enable
  65.     //+ ADC_SC3_AVGE    // Hardware average enable
  66.     //+ ADC_SC3_AVGS(3) // Hardware average 0=4 sampl, 1=8 sampl, 2=16 sampl, 3=32 sampl
  67.     +0;
  68.  
  69.   // Start Calibration
  70.   ADC0_SC3 |= ADC_SC3_CAL;
  71.   while ((ADC0_SC3 & ADC_SC3_CAL)) {
  72.     if (ADC0_SC3 & ADC_SC3_CALF) {
  73.       Serial.println("Calibration error");
  74.       return;
  75.     }
  76.   }
  77.   Serial.println ("ADC0 Calibrated");        
  78.   ADC0_CFG1 = ADC_CFG1;
  79.   ADC0_CFG2 = ADC_CFG2;
  80.   ADC0_SC3 = 0;  
  81. }
  82.  
  83. // Read ADC
  84. uint16_t ADC0_read(char channel) {
  85.   ADC0_SC1A = channel & 0x1F; // Init conversion
  86.   *portSetRegister(13) = 1;
  87.   while ((ADC0_SC1A & ADC_SC1_COCO)==0);
  88.   *portClearRegister(13) = 1;
  89.   return ADC0_RA;
  90. }

Investigaré un poco para saber si se pueden arañar dos ciclos menos de reloj. De todas formas considero que esta velocidad es lenta. Para conseguir mayores velocidades (el datasheet declara un máximo de 1.2Msamples/s) será necesario bajar a una conversión de 8bit y aumentar la velocidad de reloj.

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 17 de Mayo de 2017, 18:26:43
El datasheet indica una velocidad máxima de reloj de 24MHz para conversiones menores de 14bits.
El caso es que no puedo conseguir esta velocidad a partir de una velocidad de bus de 60MHz. Puedo conseguir 15MHz, que es lento, y 30MHz, que es demasiado rápido y puede distorsionar las medidas.
Tendré que hacer pruebas a 30MHz y 8 bit a ver si el error es suficientemente bajo como para poder utilizar esa frecuencia.

Por ahora esa configuración (ADC=8bit sin signo, f_ADCK=30MHz) consigue realizar conversiones en 864ns (1.16Msamples/segundo).

Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 18 de Mayo de 2017, 13:45:53
Este otro programa hace trabajar al ADC en modo "continuous sampling" de manera que la siguiente conversión del ADC se inicia nada más terminar la anterior.
El reloj del ADC está configurado a 15MHz. Aunque el ADC puede funcionar más rápido, en el datasheet (página 47) aparece una gráfica en la que se puede ver que el ENOB decrece por encima de los 7-8MHz y llega a unos 12bits a 15MHz (hay que extrapolar la gráfica).
 - Tienes que ingresar para ver archivos adjuntos -

El programa consigue tiempos de conversión de 20 ciclos a 15Mhz (750ksamples/s = 1.3333us/sample) que no está del todo mal.

Código: C
  1. /*
  2.    Fast ADC
  3. */
  4.  
  5. void ADC0_init(char channel);
  6. uint16_t ADC0_read(void);
  7.  
  8. void setup() {
  9.   Serial.begin(9600);
  10.  
  11.   // Config pins
  12.   pinMode(13, OUTPUT);
  13.   pinMode(A20, INPUT);
  14.  
  15.   // Inits ADC and read
  16.   ADC0_init(20);
  17.   for(;;) {  
  18.      ADC0_read();
  19.   }
  20. }
  21.  
  22. void loop() {}
  23.  
  24. // Init ADC
  25. // https://forum.pjrc.com/threads/31286-Analog-Conversion-Complete-Interrupt
  26. void ADC0_init(char channel) {
  27.   uint32_t ADC_CFG1, ADC_CFG2;
  28.  
  29.   ADC_CFG1 =
  30.     //+ ADC_CFG1_ADLPC     // Low-power configuration
  31.     //+ ADC_CFG1_ADLSMP    // Long Sample Time
  32.     + ADC_CFG1_MODE(1)   // 0=8bit, 1=12bit, 2=10bit, 3=16bit
  33.     + ADC_CFG1_ADIV(1)   // Clock divide, 0=direct, 1=div2, 2=div4, 3=div8
  34.     + ADC_CFG1_ADICLK(1) // Input clock, 0=bus, 1=bus/2, 2= , 3=async
  35.     + 0;
  36.   ADC0_CFG1 = ADC_CFG1;
  37.  
  38.   ADC_CFG2 =
  39.     //+ ADC_CFG2_MUXSEL     // Selects ADxxB channels instead ADxxA channels
  40.     //+ ADC_CFG2_ADACKEN    // Async clock enable
  41.     //+ ADC_CFG2_ADHSC      // Add 2 extra clocks to conversion (for high speed clocks)
  42.     //+ ADC_CFG2_ADLSTS(3) // Extra clocks for long conversion (ADLSMP=1) (0=24,1=12,2=6,3=4)
  43.     + 0;
  44.   ADC0_CFG2 = ADC_CFG2;
  45.    
  46.   ADC0_SC1A =
  47.     //+ ADC_SC1_COCO // Conversion Complete
  48.     //+ ADC_AIEN     // Interrupt Enable
  49.     //+ ADC_DIFF     // Differential Mode Enable
  50.     + 0;           // Input channel select
  51.  
  52.   ADC0_SC2 =
  53.     //+ ADC_SC2_ADACT      // Conversion active
  54.     //+ ADC_SC2_ADTRG      // Conversion Trigger 0=Software, 1=Hardware
  55.     //+ ADC_SC2_ACFE       // Compare Function Enable
  56.     //+ ADC_SC2_ACFGT      // Compare Function Greater Than Enable
  57.     //+ ADC_SC2_ACREN      // Compare Function Range Enable
  58.     //+ ADC_SC2_DMAEN      // DMA Enable
  59.     + ADC_SC2_REFSEL(0); // Voltage Reference 0=Ext pins, 1=Alternate Ext. pins
  60.    
  61.   ADC0_SC3 =
  62.     //+ ADC_SC3_CAL     // Init Calibration
  63.     //+ ADC_SC3_CALF    // Calibration Failed
  64.     + ADC_SC3_ADCO    // Continuous conversion Enable
  65.     //+ ADC_SC3_AVGE    // Hardware average enable
  66.     //+ ADC_SC3_AVGS(3) // Hardware average 0=4 sampl, 1=8 sampl, 2=16 sampl, 3=32 sampl
  67.     +0;
  68.  
  69.   // Start Calibration
  70.   ADC0_SC3 |= ADC_SC3_CAL;
  71.   while ((ADC0_SC3 & ADC_SC3_CAL)) {
  72.     if (ADC0_SC3 & ADC_SC3_CALF) {
  73.       Serial.println("Calibration error");
  74.       return;
  75.     }
  76.   }
  77.   ADC0_SC3 &= ~ADC_SC3_CAL;
  78.   Serial.println ("ADC0 Calibrated");
  79.   ADC0_CFG1 = ADC_CFG1;
  80.   ADC0_CFG2 = ADC_CFG2;
  81.  
  82.   // Conversion init
  83.   ADC0_SC1A = channel & 0x1F; // Init conversion
  84. }
  85.  
  86. // Read ADC
  87. uint16_t ADC0_read(void) {
  88.   while ((ADC0_SC1A & ADC_SC1_COCO)==0);
  89.   *portSetRegister(13) = 1;
  90.   *portClearRegister(13) = 1;
  91.   return ADC0_RA;
  92. }

Un saludo.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 18 de Mayo de 2017, 15:22:27
La siguiente prueba ha sido realizar una comparación entre el DAC y el ADC para comprobar el error que existe entre ambos en modo de 12 bits.
Para conseguirlo primero he conectado con un cable el pin de salida del DAC con un pin de entrada del ADC.
A continuación un programa escribe un valor en el DAC y lee el valor de tensión de salida con el ADC. Estos dos valores se comparan para medir su error.
Este proceso se repite para el 96% de los valores del rango del DAC y del ADC (he eliminado un 2% en los extremos, donde puede existir más error).
Por último se realiza un cálculo estadístico de los valores de error máximo, mínimo,  medio y desviación estandar.

El programa es el siguiente:
Código: C
  1. /*
  2.    ADC - DAC correlation
  3. */
  4.  
  5. #define VREF            3.6
  6. #define VREF_MARGIN     0.05
  7. #define DAC_RESOLUTION  4096.0
  8. #define DAC_RANGE_INIT  (DAC_RESOLUTION * VREF_MARGIN)
  9. #define DAC_RANGE       (DAC_RESOLUTION - 2.0 * DAC_RANGE_INIT)
  10.  
  11. void setup() {
  12.   // Configuration
  13.   Serial.begin(9600);
  14.   pinMode(13, OUTPUT);
  15.   pinMode(A20, INPUT);
  16.   analogWriteResolution(12);
  17.   analogReadRes(12);
  18. }
  19.  
  20. void loop() {
  21.   // Declare variables
  22.   int volts_read, volts_write;
  23.   int err_max, err_min;
  24.   double error, mean, desv;
  25.  
  26.   // Measure correlation error between DAC and ADC
  27.   mean = desv = err_max = err_min = 0;
  28.   for(int i=0; i<DAC_RANGE; i++) {
  29.     volts_write = DAC_RANGE_INIT + i;
  30.     analogWrite(A21, volts_write);
  31.     delayMicroseconds(10);
  32.     volts_read = analogRead(A20); // ADC0_read();
  33.     error = volts_write - volts_read;
  34.     Serial.println(error);
  35.     if (error > err_max) err_max = error;
  36.     if (error < err_min) err_min = error;
  37.     mean += error;
  38.     desv += error*error;
  39.   }
  40.   mean = mean * 1.0 / DAC_RANGE;
  41.   desv = sqrt( desv * 1.0 / DAC_RANGE - mean*mean);
  42.  
  43.   // Print out results
  44.   Serial.print("Max Error = ");
  45.   Serial.println(err_max);
  46.   Serial.print("Min Error = ");
  47.   Serial.println(err_min);
  48.   Serial.print("Mean Error = ");
  49.   Serial.println(mean);
  50.   Serial.print("Standard Deviation Error = ");
  51.   Serial.println(desv);
  52.   Serial.println();
  53.  
  54.   // Wait for serial signal
  55.   while(Serial.read() < 0);
  56. }

Los resultados son:

Max Error = 1
Min Error = -8
Mean Error = -3.26
Standard Deviation Error = 1.46

La serie completa de errores (valor DAC - valor ADC) es:
Código: ASM
  1. 0
  2. 0
  3. 0
  4. -1
  5. -2
  6. 0
  7. -1
  8. -1
  9. -1
  10. 0
  11. 0
  12. 0
  13. 0
  14. -1
  15. 0
  16. 0
  17. -1
  18. 0
  19. 0
  20. 1
  21. 0
  22. 0
  23. -1
  24. 0
  25. 0
  26. 1
  27. 0
  28. 0
  29. -1
  30. -1
  31. -1
  32. 0
  33. 0
  34. 0
  35. -1
  36. 0
  37. 0
  38. 0
  39. -2
  40. -1
  41. 0
  42. 0
  43. 0
  44. 0
  45. -1
  46. -1
  47. 0
  48. 0
  49. 0
  50. 0
  51. -1
  52. 0
  53. 0
  54. 0
  55. 0
  56. -1
  57. 0
  58. 0
  59. -1
  60. 0
  61. 0
  62. 0
  63. 0
  64. -1
  65. -2
  66. -1
  67. 0
  68. -1
  69. 0
  70. -1
  71. -1
  72. -1
  73. -1
  74. -1
  75. -1
  76. 0
  77. 0
  78. -1
  79. -1
  80. -1
  81. -1
  82. -1
  83. 0
  84. -1
  85. 0
  86. -1
  87. 0
  88. 0
  89. 0
  90. -1
  91. 0
  92. -2
  93. -1
  94. 0
  95. -1
  96. -1
  97. 0
  98. 0
  99. -1
  100. -1
  101. 0
  102. 0
  103. 0
  104. 0
  105. -1
  106. 0
  107. -1
  108. -1
  109. -1
  110. 0
  111. -2
  112. 0
  113. -1
  114. -1
  115. -1
  116. 0
  117. 1
  118. -2
  119. -1
  120. 0
  121. 0
  122. 0
  123. 0
  124. -1
  125. -1
  126. 0
  127. -1
  128. -1
  129. -1
  130. -1
  131. -1
  132. -1
  133. 0
  134. 0
  135. -1
  136. -1
  137. -1
  138. -1
  139. -1
  140. -1
  141. -2
  142. 0
  143. -1
  144. -1
  145. 0
  146. -1
  147. -1
  148. -2
  149. -2
  150. -1
  151. -2
  152. -1
  153. -1
  154. -1
  155. -1
  156. 0
  157. -1
  158. -1
  159. 0
  160. -1
  161. -1
  162. -2
  163. 0
  164. 1
  165. -1
  166. 0
  167. 0
  168. -1
  169. -1
  170. -1
  171. -1
  172. -1
  173. -1
  174. -1
  175. -2
  176. -1
  177. -1
  178. -1
  179. -1
  180. -2
  181. -1
  182. 0
  183. -2
  184. -1
  185. -2
  186. -1
  187. -1
  188. -1
  189. 0
  190. -1
  191. 0
  192. -1
  193. -1
  194. -2
  195. 0
  196. -1
  197. -1
  198. -2
  199. -1
  200. -2
  201. -1
  202. -1
  203. -2
  204. -1
  205. -1
  206. -1
  207. -1
  208. -2
  209. -1
  210. -1
  211. -1
  212. -1
  213. -1
  214. -1
  215. -2
  216. -1
  217. -1
  218. 0
  219. -1
  220. -2
  221. -2
  222. -1
  223. -2
  224. -1
  225. -1
  226. -1
  227. -1
  228. -1
  229. -1
  230. -2
  231. -1
  232. -1
  233. -1
  234. -1
  235. -2
  236. 0
  237. -2
  238. 0
  239. 0
  240. -1
  241. -1
  242. -1
  243. -1
  244. 0
  245. -1
  246. -1
  247. -1
  248. -2
  249. -1
  250. -2
  251. -1
  252. -1
  253. -1
  254. -1
  255. -1
  256. -1
  257. -1
  258. -1
  259. -2
  260. -1
  261. 0
  262. -1
  263. -1
  264. -1
  265. -2
  266. -1
  267. -1
  268. -1
  269. -1
  270. -1
  271. -1
  272. 0
  273. 0
  274. -1
  275. -1
  276. -1
  277. -1
  278. 0
  279. -1
  280. -1
  281. -2
  282. -2
  283. -2
  284. -1
  285. 0
  286. -1
  287. -1
  288. -1
  289. -1
  290. -2
  291. -1
  292. -1
  293. -1
  294. -1
  295. 0
  296. -1
  297. -1
  298. -1
  299. -1
  300. 0
  301. -1
  302. -1
  303. -1
  304. -2
  305. -1
  306. -1
  307. -2
  308. -1
  309. -1
  310. -2
  311. -1
  312. -1
  313. -1
  314. 0
  315. -3
  316. -2
  317. -2
  318. -1
  319. -1
  320. 0
  321. -1
  322. -1
  323. -2
  324. -3
  325. -1
  326. -1
  327. -1
  328. 0
  329. -1
  330. -2
  331. -2
  332. -2
  333. -1
  334. 0
  335. -2
  336. -1
  337. -1
  338. -1
  339. 0
  340. 0
  341. -1
  342. -1
  343. -1
  344. -2
  345. 0
  346. -1
  347. -2
  348. -1
  349. -1
  350. -1
  351. -1
  352. -2
  353. 0
  354. -1
  355. -1
  356. -2
  357. -2
  358. -2
  359. 0
  360. -1
  361. 0
  362. -1
  363. -1
  364. -1
  365. -1
  366. 0
  367. 0
  368. -1
  369. 0
  370. -1
  371. -1
  372. -1
  373. 0
  374. 0
  375. -1
  376. 0
  377. -1
  378. -1
  379. -1
  380. -1
  381. -1
  382. -1
  383. -1
  384. 0
  385. -2
  386. -1
  387. 0
  388. 0
  389. 0
  390. 0
  391. -1
  392. 0
  393. 1
  394. 0
  395. -1
  396. 0
  397. -1
  398. -1
  399. -1
  400. -1
  401. -1
  402. 0
  403. -1
  404. -1
  405. -1
  406. -2
  407. -1
  408. 0
  409. -1
  410. -1
  411. -1
  412. 0
  413. 0
  414. -1
  415. -1
  416. -2
  417. -1
  418. -1
  419. -1
  420. -2
  421. 0
  422. 0
  423. 0
  424. -1
  425. -1
  426. -2
  427. -2
  428. -2
  429. -1
  430. -1
  431. -1
  432. -1
  433. -2
  434. -1
  435. -2
  436. -2
  437. -1
  438. -2
  439. -2
  440. -2
  441. -1
  442. -2
  443. 0
  444. -2
  445. -2
  446. -1
  447. -1
  448. -2
  449. -1
  450. -1
  451. -2
  452. -1
  453. -1
  454. -1
  455. -1
  456. -1
  457. -2
  458. -1
  459. -1
  460. -1
  461. -2
  462. -1
  463. -1
  464. -1
  465. -2
  466. -2
  467. -2
  468. -1
  469. -2
  470. -2
  471. -1
  472. -2
  473. -1
  474. -2
  475. -1
  476. -1
  477. 0
  478. -1
  479. -2
  480. -1
  481. -1
  482. -1
  483. -1
  484. -1
  485. -2
  486. -1
  487. -2
  488. -2
  489. -1
  490. -1
  491. -1
  492. -1
  493. -1
  494. -1
  495. -1
  496. -1
  497. -1
  498. -2
  499. -2
  500. -1
  501. -1
  502. -1
  503. -1
  504. -1
  505. -2
  506. -1
  507. -1
  508. -1
  509. 0
  510. -1
  511. -1
  512. 0
  513. -1
  514. -2
  515. -1
  516. -2
  517. -1
  518. -1
  519. -1
  520. -1
  521. -1
  522. 0
  523. -1
  524. -1
  525. 0
  526. -1
  527. -2
  528. -1
  529. -1
  530. -1
  531. 0
  532. -2
  533. -1
  534. -1
  535. -1
  536. -1
  537. 0
  538. -1
  539. -2
  540. -2
  541. -1
  542. -2
  543. -1
  544. -1
  545. -2
  546. 0
  547. -1
  548. -1
  549. -1
  550. -1
  551. 0
  552. 0
  553. -1
  554. -1
  555. 0
  556. -1
  557. -1
  558. 0
  559. -1
  560. -1
  561. -2
  562. -1
  563. -1
  564. -1
  565. -1
  566. -1
  567. -2
  568. -1
  569. -1
  570. 0
  571. 0
  572. -1
  573. -1
  574. -1
  575. 0
  576. -1
  577. -1
  578. -1
  579. -2
  580. -1
  581. -1
  582. -2
  583. -2
  584. -1
  585. 0
  586. -1
  587. -1
  588. -1
  589. -1
  590. -1
  591. -1
  592. 0
  593. -1
  594. -2
  595. -1
  596. -2
  597. -1
  598. -1
  599. -2
  600. -1
  601. -2
  602. -2
  603. -1
  604. -1
  605. -1
  606. -2
  607. -2
  608. -1
  609. -1
  610. -1
  611. -1
  612. -1
  613. -2
  614. -1
  615. -2
  616. -1
  617. -2
  618. -1
  619. -1
  620. -1
  621. 0
  622. -1
  623. 0
  624. -1
  625. -1
  626. 0
  627. -1
  628. -1
  629. -1
  630. -1
  631. -2
  632. -2
  633. -1
  634. -1
  635. -2
  636. -1
  637. -2
  638. -1
  639. -1
  640. -2
  641. -1
  642. 0
  643. -1
  644. -1
  645. -1
  646. -1
  647. -2
  648. -2
  649. -1
  650. -1
  651. -1
  652. -1
  653. -1
  654. -1
  655. -1
  656. -2
  657. -2
  658. -1
  659. -2
  660. -2
  661. -1
  662. -2
  663. 0
  664. -2
  665. -2
  666. -1
  667. -2
  668. -2
  669. -2
  670. -2
  671. -2
  672. -1
  673. -1
  674. -1
  675. -1
  676. -2
  677. -2
  678. -2
  679. -2
  680. -1
  681. -3
  682. -2
  683. -2
  684. -2
  685. -2
  686. -1
  687. -2
  688. -2
  689. -2
  690. -2
  691. -3
  692. -2
  693. -1
  694. -2
  695. -1
  696. -3
  697. -2
  698. -2
  699. -2
  700. -1
  701. -2
  702. -2
  703. -3
  704. -3
  705. -2
  706. -2
  707. -1
  708. -1
  709. -2
  710. -2
  711. -2
  712. -3
  713. -2
  714. -2
  715. -2
  716. -2
  717. -2
  718. -2
  719. -1
  720. -2
  721. -1
  722. -2
  723. -2
  724. -2
  725. -3
  726. -2
  727. -1
  728. -2
  729. -2
  730. -2
  731. -2
  732. -2
  733. 0
  734. -2
  735. -2
  736. -2
  737. -2
  738. -2
  739. -2
  740. -2
  741. -2
  742. -2
  743. -2
  744. -2
  745. -2
  746. -3
  747. -2
  748. -2
  749. -1
  750. -2
  751. -2
  752. -2
  753. -3
  754. -2
  755. -2
  756. -2
  757. -2
  758. -2
  759. -3
  760. -2
  761. -2
  762. -2
  763. -2
  764. -3
  765. -2
  766. -3
  767. -2
  768. -2
  769. -2
  770. -2
  771. -2
  772. -2
  773. -2
  774. -2
  775. -2
  776. -3
  777. -3
  778. -3
  779. -2
  780. -2
  781. -2
  782. -2
  783. -2
  784. -3
  785. -2
  786. -2
  787. -2
  788. -2
  789. -2
  790. -2
  791. -2
  792. -2
  793. -2
  794. -2
  795. -1
  796. -3
  797. -2
  798. -3
  799. -2
  800. -2
  801. -2
  802. -2
  803. -2
  804. -3
  805. -3
  806. -2
  807. -2
  808. -1
  809. -3
  810. -2
  811. -3
  812. -2
  813. -2
  814. -2
  815. -2
  816. -1
  817. -2
  818. -3
  819. -2
  820. -2
  821. -2
  822. -3
  823. -2
  824. -2
  825. -2
  826. -2
  827. -2
  828. -2
  829. -4
  830. -2
  831. -2
  832. -3
  833. -3
  834. -2
  835. -3
  836. -2
  837. -2
  838. -2
  839. -3
  840. -2
  841. -2
  842. -2
  843. -3
  844. -2
  845. -2
  846. -2
  847. -2
  848. -2
  849. -2
  850. -3
  851. -2
  852. -2
  853. -2
  854. -3
  855. -3
  856. -2
  857. -3
  858. -3
  859. -3
  860. -3
  861. -3
  862. -2
  863. -2
  864. -2
  865. -2
  866. -3
  867. -3
  868. -3
  869. -2
  870. -2
  871. -2
  872. -2
  873. -3
  874. -2
  875. -3
  876. -2
  877. -2
  878. -3
  879. -2
  880. -1
  881. -2
  882. -2
  883. -2
  884. -2
  885. -3
  886. -3
  887. -3
  888. -2
  889. -4
  890. -2
  891. -1
  892. -3
  893. -2
  894. -3
  895. -2
  896. -1
  897. -2
  898. -2
  899. -2
  900. -2
  901. -2
  902. -3
  903. -2
  904. -2
  905. -3
  906. -2
  907. -2
  908. -2
  909. -3
  910. -3
  911. -3
  912. -2
  913. -3
  914. -2
  915. -3
  916. -2
  917. -2
  918. -4
  919. -4
  920. -3
  921. -3
  922. -3
  923. -3
  924. -3
  925. -3
  926. -3
  927. -3
  928. -2
  929. -3
  930. -3
  931. -3
  932. -3
  933. -2
  934. -3
  935. -4
  936. -3
  937. -3
  938. -3
  939. -3
  940. -3
  941. -3
  942. -3
  943. -3
  944. -3
  945. -4
  946. -4
  947. -2
  948. -3
  949. -4
  950. -3
  951. -3
  952. -3
  953. -2
  954. -3
  955. -3
  956. -3
  957. -2
  958. -3
  959. -3
  960. -3
  961. -3
  962. -2
  963. -2
  964. -3
  965. -3
  966. -2
  967. -4
  968. -3
  969. -3
  970. -2
  971. -3
  972. -4
  973. -3
  974. -3
  975. -3
  976. -2
  977. -2
  978. -3
  979. -2
  980. -3
  981. -4
  982. -3
  983. -3
  984. -2
  985. -4
  986. -3
  987. -2
  988. -3
  989. -3
  990. -2
  991. -3
  992. -2
  993. -3
  994. -3
  995. -2
  996. -2
  997. -3
  998. -2
  999. -2
  1000. -3
  1001. -4
  1002. -3
  1003. -2
  1004. -3
  1005. -3
  1006. -3
  1007. -3
  1008. -3
  1009. -2
  1010. -3
  1011. -2
  1012. -2
  1013. -3
  1014. -3
  1015. -3
  1016. -2
  1017. -3
  1018. -3
  1019. -4
  1020. -3
  1021. -3
  1022. -2
  1023. -3
  1024. -3
  1025. -3
  1026. -2
  1027. -3
  1028. -2
  1029. -3
  1030. -2
  1031. -3
  1032. -2
  1033. -3
  1034. -3
  1035. -3
  1036. -3
  1037. -2
  1038. -3
  1039. -2
  1040. -3
  1041. -2
  1042. -3
  1043. -3
  1044. -2
  1045. -3
  1046. -2
  1047. -3
  1048. -2
  1049. -4
  1050. -3
  1051. -3
  1052. -2
  1053. -2
  1054. -3
  1055. -4
  1056. -3
  1057. -3
  1058. -3
  1059. -3
  1060. -3
  1061. -4
  1062. -3
  1063. -2
  1064. -2
  1065. -4
  1066. -3
  1067. -3
  1068. -3
  1069. -2
  1070. -2
  1071. -3
  1072. -2
  1073. -3
  1074. -3
  1075. -3
  1076. -3
  1077. -3
  1078. -3
  1079. -3
  1080. -2
  1081. -3
  1082. -3
  1083. -3
  1084. -3
  1085. -2
  1086. -4
  1087. -3
  1088. -2
  1089. -3
  1090. -3
  1091. -2
  1092. -3
  1093. -3
  1094. -2
  1095. -2
  1096. -2
  1097. -3
  1098. -2
  1099. -2
  1100. -2
  1101. -3
  1102. -3
  1103. -4
  1104. -3
  1105. -1
  1106. -2
  1107. -3
  1108. -2
  1109. -3
  1110. -2
  1111. -2
  1112. -3
  1113. -3
  1114. -2
  1115. -3
  1116. -3
  1117. -2
  1118. -2
  1119. -3
  1120. -3
  1121. -2
  1122. -3
  1123. -3
  1124. -3
  1125. -3
  1126. -3
  1127. -2
  1128. -3
  1129. -4
  1130. -3
  1131. -3
  1132. -1
  1133. -2
  1134. -3
  1135. -3
  1136. -3
  1137. -3
  1138. -3
  1139. -3
  1140. -2
  1141. -3
  1142. -3
  1143. -3
  1144. -3
  1145. -3
  1146. -3
  1147. -3
  1148. -3
  1149. -3
  1150. -2
  1151. -3
  1152. -3
  1153. -2
  1154. -2
  1155. -3
  1156. -3
  1157. -2
  1158. -2
  1159. -2
  1160. -3
  1161. -4
  1162. -3
  1163. -3
  1164. -3
  1165. -2
  1166. -3
  1167. -3
  1168. -3
  1169. -3
  1170. -2
  1171. -3
  1172. -2
  1173. -2
  1174. -3
  1175. -3
  1176. -3
  1177. -4
  1178. -3
  1179. -3
  1180. -3
  1181. -3
  1182. -3
  1183. -4
  1184. -3
  1185. -3
  1186. -3
  1187. -3
  1188. -4
  1189. -3
  1190. -3
  1191. -3
  1192. -3
  1193. -4
  1194. -3
  1195. -4
  1196. -3
  1197. -3
  1198. -2
  1199. -2
  1200. -3
  1201. -4
  1202. -3
  1203. -3
  1204. -3
  1205. -3
  1206. -4
  1207. -4
  1208. -3
  1209. -4
  1210. -4
  1211. -3
  1212. -3
  1213. -3
  1214. -3
  1215. -3
  1216. -3
  1217. -3
  1218. -4
  1219. -3
  1220. -3
  1221. -4
  1222. -3
  1223. -4
  1224. -3
  1225. -4
  1226. -3
  1227. -3
  1228. -4
  1229. -4
  1230. -4
  1231. -3
  1232. -3
  1233. -3
  1234. -3
  1235. -4
  1236. -3
  1237. -3
  1238. -3
  1239. -3
  1240. -2
  1241. -2
  1242. -3
  1243. -3
  1244. -4
  1245. -3
  1246. -4
  1247. -3
  1248. -2
  1249. -3
  1250. -4
  1251. -3
  1252. -3
  1253. -2
  1254. -3
  1255. -4
  1256. -2
  1257. -3
  1258. -4
  1259. -3
  1260. -2
  1261. -3
  1262. -3
  1263. -3
  1264. -2
  1265. -3
  1266. -3
  1267. -3
  1268. -3
  1269. -3
  1270. -3
  1271. -4
  1272. -2
  1273. -3
  1274. -3
  1275. -2
  1276. -4
  1277. -3
  1278. -3
  1279. -3
  1280. -3
  1281. -3
  1282. -3
  1283. -2
  1284. -3
  1285. -4
  1286. -2
  1287. -3
  1288. -3
  1289. -4
  1290. -3
  1291. -4
  1292. -3
  1293. -2
  1294. -2
  1295. -3
  1296. -3
  1297. -3
  1298. -3
  1299. -4
  1300. -3
  1301. -2
  1302. -3
  1303. -3
  1304. -3
  1305. -4
  1306. -2
  1307. -2
  1308. -3
  1309. -2
  1310. -3
  1311. -3
  1312. -2
  1313. -2
  1314. -3
  1315. -2
  1316. -3
  1317. -3
  1318. -3
  1319. -3
  1320. -3
  1321. -3
  1322. -2
  1323. -3
  1324. -3
  1325. -3
  1326. -3
  1327. -4
  1328. -3
  1329. -3
  1330. -3
  1331. -3
  1332. -2
  1333. -3
  1334. -3
  1335. -3
  1336. -2
  1337. -4
  1338. -3
  1339. -3
  1340. -4
  1341. -2
  1342. -3
  1343. -3
  1344. -2
  1345. -3
  1346. -3
  1347. -3
  1348. -3
  1349. -3
  1350. -2
  1351. -3
  1352. -2
  1353. -3
  1354. -2
  1355. -2
  1356. -3
  1357. -3
  1358. -2
  1359. -3
  1360. -3
  1361. -3
  1362. -2
  1363. -3
  1364. -2
  1365. -3
  1366. -3
  1367. -2
  1368. -2
  1369. -3
  1370. -3
  1371. -3
  1372. -3
  1373. -3
  1374. -3
  1375. -2
  1376. -2
  1377. -2
  1378. -3
  1379. -1
  1380. -2
  1381. -2
  1382. -3
  1383. -3
  1384. -2
  1385. -4
  1386. -3
  1387. -2
  1388. -4
  1389. -2
  1390. -2
  1391. -2
  1392. -2
  1393. -3
  1394. -3
  1395. -3
  1396. -2
  1397. -2
  1398. -2
  1399. -2
  1400. -2
  1401. -3
  1402. -2
  1403. -3
  1404. -3
  1405. -3
  1406. -3
  1407. -3
  1408. -2
  1409. -3
  1410. -3
  1411. -3
  1412. -3
  1413. -3
  1414. -3
  1415. -2
  1416. -3
  1417. -3
  1418. -3
  1419. -3
  1420. -4
  1421. -4
  1422. -2
  1423. -3
  1424. -3
  1425. -3
  1426. -3
  1427. -3
  1428. -3
  1429. -3
  1430. -4
  1431. -4
  1432. -3
  1433. -4
  1434. -4
  1435. -3
  1436. -3
  1437. -3
  1438. -3
  1439. -4
  1440. -4
  1441. -3
  1442. -2
  1443. -3
  1444. -3
  1445. -3
  1446. -3
  1447. -3
  1448. -3
  1449. -3
  1450. -3
  1451. -2
  1452. -3
  1453. -3
  1454. -3
  1455. -3
  1456. -3
  1457. -3
  1458. -4
  1459. -3
  1460. -2
  1461. -3
  1462. -3
  1463. -2
  1464. -4
  1465. -4
  1466. -4
  1467. -3
  1468. -2
  1469. -2
  1470. -2
  1471. -3
  1472. -3
  1473. -3
  1474. -3
  1475. -3
  1476. -2
  1477. -2
  1478. -3
  1479. -3
  1480. -3
  1481. -2
  1482. -3
  1483. -3
  1484. -3
  1485. -3
  1486. -3
  1487. -2
  1488. -3
  1489. -2
  1490. -2
  1491. -4
  1492. -3
  1493. -3
  1494. -3
  1495. -3
  1496. -2
  1497. -3
  1498. -3
  1499. -3
  1500. -3
  1501. -3
  1502. -3
  1503. -3
  1504. -2
  1505. -3
  1506. -3
  1507. -3
  1508. -3
  1509. -2
  1510. -3
  1511. -3
  1512. -4
  1513. -3
  1514. -4
  1515. -3
  1516. -3
  1517. -3
  1518. -3
  1519. -2
  1520. -2
  1521. -2
  1522. -3
  1523. -4
  1524. -3
  1525. -4
  1526. -3
  1527. -4
  1528. -4
  1529. -3
  1530. -2
  1531. -2
  1532. -4
  1533. -3
  1534. -3
  1535. -3
  1536. -2
  1537. -3
  1538. -3
  1539. -3
  1540. -3
  1541. -4
  1542. -3
  1543. -2
  1544. -2
  1545. -3
  1546. -3
  1547. -4
  1548. -3
  1549. -3
  1550. -4
  1551. -2
  1552. -4
  1553. -2
  1554. -4
  1555. -3
  1556. -3
  1557. -3
  1558. -2
  1559. -2
  1560. -2
  1561. -4
  1562. -3
  1563. -2
  1564. -3
  1565. -2
  1566. -3
  1567. -3
  1568. -2
  1569. -3
  1570. -3
  1571. -4
  1572. -3
  1573. -4
  1574. -2
  1575. -3
  1576. -3
  1577. -3
  1578. -2
  1579. -3
  1580. -3
  1581. -2
  1582. -3
  1583. -3
  1584. -3
  1585. -3
  1586. -4
  1587. -2
  1588. -3
  1589. -3
  1590. -3
  1591. -2
  1592. -3
  1593. -3
  1594. -3
  1595. -3
  1596. -3
  1597. -2
  1598. -2
  1599. -3
  1600. -3
  1601. -3
  1602. -3
  1603. -3
  1604. -1
  1605. -2
  1606. -3
  1607. -3
  1608. -2
  1609. -3
  1610. -3
  1611. -2
  1612. -4
  1613. -2
  1614. -3
  1615. -4
  1616. -3
  1617. -3
  1618. -2
  1619. -2
  1620. -3
  1621. -3
  1622. -4
  1623. -3
  1624. -2
  1625. -4
  1626. -2
  1627. -4
  1628. -3
  1629. -3
  1630. -3
  1631. -2
  1632. -3
  1633. -3
  1634. -2
  1635. -2
  1636. -3
  1637. -4
  1638. -3
  1639. -2
  1640. -2
  1641. -4
  1642. -3
  1643. -4
  1644. -3
  1645. -2
  1646. -3
  1647. -2
  1648. -3
  1649. -4
  1650. -2
  1651. -3
  1652. -3
  1653. -3
  1654. -3
  1655. -3
  1656. -3
  1657. -4
  1658. -2
  1659. -2
  1660. -3
  1661. -3
  1662. -2
  1663. -3
  1664. -3
  1665. -3
  1666. -2
  1667. -3
  1668. -2
  1669. -3
  1670. -3
  1671. -4
  1672. -2
  1673. -3
  1674. -3
  1675. -3
  1676. -3
  1677. -3
  1678. -2
  1679. -3
  1680. -3
  1681. -4
  1682. -3
  1683. -3
  1684. -2
  1685. -2
  1686. -3
  1687. -3
  1688. -2
  1689. -3
  1690. -3
  1691. -2
  1692. -2
  1693. -3
  1694. -4
  1695. -4
  1696. -4
  1697. -3
  1698. -2
  1699. -4
  1700. -2
  1701. -3
  1702. -2
  1703. -3
  1704. -2
  1705. -4
  1706. -2
  1707. -4
  1708. -3
  1709. -3
  1710. -2
  1711. -2
  1712. -2
  1713. -2
  1714. -4
  1715. -3
  1716. -3
  1717. -3
  1718. -2
  1719. -2
  1720. -3
  1721. -3
  1722. -2
  1723. -3
  1724. -3
  1725. -3
  1726. -2
  1727. -2
  1728. -3
  1729. -3
  1730. -4
  1731. -3
  1732. -3
  1733. -2
  1734. -2
  1735. -3
  1736. -4
  1737. -5
  1738. -2
  1739. -2
  1740. -2
  1741. -3
  1742. -3
  1743. -3
  1744. -3
  1745. -2
  1746. -3
  1747. -3
  1748. -3
  1749. -4
  1750. -3
  1751. -3
  1752. -3
  1753. -5
  1754. -3
  1755. -2
  1756. -4
  1757. -3
  1758. -3
  1759. -3
  1760. -3
  1761. -3
  1762. -3
  1763. -3
  1764. -3
  1765. -3
  1766. -3
  1767. -3
  1768. -3
  1769. -4
  1770. -3
  1771. -3
  1772. -3
  1773. -3
  1774. -3
  1775. -3
  1776. -4
  1777. -4
  1778. -2
  1779. -4
  1780. -3
  1781. -3
  1782. -3
  1783. -3
  1784. -3
  1785. -5
  1786. -3
  1787. -3
  1788. -3
  1789. -4
  1790. -3
  1791. -3
  1792. -2
  1793. -3
  1794. -3
  1795. -2
  1796. -2
  1797. -3
  1798. -4
  1799. -4
  1800. -3
  1801. -3
  1802. -3
  1803. -4
  1804. -3
  1805. -3
  1806. -2
  1807. -3
  1808. -4
  1809. -3
  1810. -3
  1811. -3
  1812. -3
  1813. -3
  1814. -3
  1815. -3
  1816. -3
  1817. -3
  1818. -3
  1819. -4
  1820. -2
  1821. -3
  1822. -4
  1823. -3
  1824. -3
  1825. -4
  1826. -4
  1827. -4
  1828. -4
  1829. -3
  1830. -4
  1831. -3
  1832. -3
  1833. -3
  1834. -3
  1835. -5
  1836. -3
  1837. -4
  1838. -4
  1839. -3
  1840. -2
  1841. -3
  1842. -3
  1843. -2
  1844. -3
  1845. -3
  1846. -3
  1847. -1
  1848. -2
  1849. -5
  1850. -4
  1851. -4
  1852. -4
  1853. -3
  1854. -3
  1855. -4
  1856. -3
  1857. -4
  1858. -4
  1859. -3
  1860. -3
  1861. -3
  1862. -3
  1863. -4
  1864. -3
  1865. -5
  1866. -3
  1867. -2
  1868. -2
  1869. -3
  1870. -3
  1871. -4
  1872. -3
  1873. -3
  1874. -3
  1875. -2
  1876. -3
  1877. -4
  1878. -4
  1879. -3
  1880. -3
  1881. -4
  1882. -2
  1883. -3
  1884. -3
  1885. -3
  1886. -3
  1887. -2
  1888. -2
  1889. -3
  1890. -4
  1891. -4
  1892. -4
  1893. -3
  1894. -4
  1895. -3
  1896. -2
  1897. -5
  1898. -3
  1899. -3
  1900. -3
  1901. -3
  1902. -3
  1903. -3
  1904. -3
  1905. -3
  1906. -3
  1907. -3
  1908. -4
  1909. -2
  1910. -4
  1911. -4
  1912. -3
  1913. -4
  1914. -2
  1915. -4
  1916. -4
  1917. -4
  1918. -5
  1919. -4
  1920. -4
  1921. -4
  1922. -3
  1923. -4
  1924. -5
  1925. -4
  1926. -4
  1927. -4
  1928. -4
  1929. -4
  1930. -5
  1931. -5
  1932. -4
  1933. -4
  1934. -4
  1935. -3
  1936. -4
  1937. -4
  1938. -5
  1939. -4
  1940. -4
  1941. -4
  1942. -3
  1943. -4
  1944. -5
  1945. -3
  1946. -5
  1947. -4
  1948. -5
  1949. -5
  1950. -4
  1951. -4
  1952. -5
  1953. -4
  1954. -6
  1955. -4
  1956. -6
  1957. -5
  1958. -5
  1959. -4
  1960. -4
  1961. -6
  1962. -4
  1963. -4
  1964. -3
  1965. -4
  1966. -4
  1967. -4
  1968. -5
  1969. -4
  1970. -3
  1971. -4
  1972. -4
  1973. -4
  1974. -4
  1975. -4
  1976. -4
  1977. -4
  1978. -3
  1979. -4
  1980. -4
  1981. -4
  1982. -4
  1983. -5
  1984. -4
  1985. -3
  1986. -5
  1987. -5
  1988. -5
  1989. -4
  1990. -5
  1991. -4
  1992. -5
  1993. -6
  1994. -4
  1995. -3
  1996. -4
  1997. -5
  1998. -4
  1999. -5
  2000. -4
  2001. -4
  2002. -4
  2003. -4
  2004. -4
  2005. -4
  2006. -4
  2007. -4
  2008. -4
  2009. -5
  2010. -3
  2011. -3
  2012. -3
  2013. -4
  2014. -4
  2015. -4
  2016. -4
  2017. -3
  2018. -5
  2019. -4
  2020. -5
  2021. -4
  2022. -3
  2023. -4
  2024. -3
  2025. -6
  2026. -4
  2027. -4
  2028. -3
  2029. -4
  2030. -5
  2031. -4
  2032. -4
  2033. -4
  2034. -5
  2035. -4
  2036. -4
  2037. -4
  2038. -5
  2039. -4
  2040. -4
  2041. -5
  2042. -4
  2043. -4
  2044. -3
  2045. -4
  2046. -4
  2047. -5
  2048. -4
  2049. -4
  2050. -3
  2051. -5
  2052. -4
  2053. -4
  2054. -5
  2055. -4
  2056. -2
  2057. -4
  2058. -4
  2059. -5
  2060. -4
  2061. -5
  2062. -5
  2063. -4
  2064. -5
  2065. -4
  2066. -4
  2067. -5
  2068. -5
  2069. -4
  2070. -4
  2071. -4
  2072. -5
  2073. -4
  2074. -4
  2075. -4
  2076. -4
  2077. -3
  2078. -4
  2079. -5
  2080. -4
  2081. -4
  2082. -4
  2083. -3
  2084. -5
  2085. -5
  2086. -4
  2087. -4
  2088. -4
  2089. -5
  2090. -4
  2091. -4
  2092. -3
  2093. -5
  2094. -5
  2095. -3
  2096. -3
  2097. -4
  2098. -4
  2099. -4
  2100. -4
  2101. -4
  2102. -4
  2103. -4
  2104. -3
  2105. -5
  2106. -4
  2107. -4
  2108. -3
  2109. -4
  2110. -3
  2111. -3
  2112. -4
  2113. -4
  2114. -3
  2115. -4
  2116. -4
  2117. -3
  2118. -4
  2119. -4
  2120. -4
  2121. -5
  2122. -4
  2123. -2
  2124. -3
  2125. -4
  2126. -3
  2127. -3
  2128. -3
  2129. -3
  2130. -3
  2131. -3
  2132. -4
  2133. -3
  2134. -3
  2135. -2
  2136. -4
  2137. -5
  2138. -4
  2139. -4
  2140. -4
  2141. -3
  2142. -4
  2143. -4
  2144. -4
  2145. -4
  2146. -4
  2147. -4
  2148. -4
  2149. -4
  2150. -4
  2151. -4
  2152. -3
  2153. -4
  2154. -3
  2155. -4
  2156. -3
  2157. -4
  2158. -3
  2159. -3
  2160. -4
  2161. -3
  2162. -5
  2163. -4
  2164. -4
  2165. -4
  2166. -3
  2167. -4
  2168. -4
  2169. -6
  2170. -3
  2171. -4
  2172. -4
  2173. -5
  2174. -5
  2175. -4
  2176. -4
  2177. -4
  2178. -4
  2179. -5
  2180. -5
  2181. -5
  2182. -4
  2183. -4
  2184. -5
  2185. -5
  2186. -3
  2187. -5
  2188. -4
  2189. -4
  2190. -5
  2191. -4
  2192. -4
  2193. -4
  2194. -4
  2195. -4
  2196. -4
  2197. -4
  2198. -4
  2199. -4
  2200. -4
  2201. -4
  2202. -5
  2203. -4
  2204. -5
  2205. -4
  2206. -4
  2207. -4
  2208. -4
  2209. -5
  2210. -5
  2211. -3
  2212. -4
  2213. -4
  2214. -6
  2215. -5
  2216. -4
  2217. -6
  2218. -4
  2219. -4
  2220. -6
  2221. -5
  2222. -5
  2223. -5
  2224. -5
  2225. -4
  2226. -4
  2227. -4
  2228. -5
  2229. -5
  2230. -5
  2231. -4
  2232. -4
  2233. -4
  2234. -4
  2235. -3
  2236. -4
  2237. -5
  2238. -3
  2239. -3
  2240. -4
  2241. -4
  2242. -3
  2243. -4
  2244. -3
  2245. -3
  2246. -4
  2247. -4
  2248. -4
  2249. -4
  2250. -4
  2251. -4
  2252. -4
  2253. -4
  2254. -4
  2255. -4
  2256. -4
  2257. -4
  2258. -4
  2259. -4
  2260. -4
  2261. -5
  2262. -5
  2263. -5
  2264. -6
  2265. -4
  2266. -4
  2267. -4
  2268. -4
  2269. -5
  2270. -4
  2271. -4
  2272. -4
  2273. -3
  2274. -4
  2275. -5
  2276. -4
  2277. -5
  2278. -3
  2279. -4
  2280. -4
  2281. -4
  2282. -5
  2283. -4
  2284. -4
  2285. -4
  2286. -4
  2287. -4
  2288. -3
  2289. -4
  2290. -6
  2291. -4
  2292. -3
  2293. -4
  2294. -5
  2295. -4
  2296. -5
  2297. -4
  2298. -4
  2299. -4
  2300. -5
  2301. -5
  2302. -4
  2303. -4
  2304. -4
  2305. -5
  2306. -4
  2307. -5
  2308. -4
  2309. -4
  2310. -5
  2311. -5
  2312. -4
  2313. -4
  2314. -4
  2315. -4
  2316. -4
  2317. -5
  2318. -5
  2319. -4
  2320. -4
  2321. -4
  2322. -4
  2323. -4
  2324. -4
  2325. -5
  2326. -5
  2327. -4
  2328. -4
  2329. -6
  2330. -6
  2331. -5
  2332. -5
  2333. -4
  2334. -3
  2335. -5
  2336. -5
  2337. -5
  2338. -5
  2339. -4
  2340. -4
  2341. -5
  2342. -5
  2343. -5
  2344. -4
  2345. -6
  2346. -5
  2347. -3
  2348. -5
  2349. -4
  2350. -5
  2351. -4
  2352. -4
  2353. -4
  2354. -3
  2355. -5
  2356. -4
  2357. -4
  2358. -5
  2359. -4
  2360. -4
  2361. -7
  2362. -3
  2363. -4
  2364. -4
  2365. -4
  2366. -4
  2367. -4
  2368. -5
  2369. -3
  2370. -3
  2371. -4
  2372. -5
  2373. -4
  2374. -3
  2375. -5
  2376. -3
  2377. -5
  2378. -3
  2379. -3
  2380. -4
  2381. -3
  2382. -4
  2383. -4
  2384. -4
  2385. -4
  2386. -5
  2387. -4
  2388. -4
  2389. -4
  2390. -4
  2391. -5
  2392. -4
  2393. -4
  2394. -3
  2395. -4
  2396. -3
  2397. -4
  2398. -4
  2399. -4
  2400. -4
  2401. -3
  2402. -4
  2403. -3
  2404. -4
  2405. -4
  2406. -4
  2407. -3
  2408. -2
  2409. -4
  2410. -4
  2411. -3
  2412. -4
  2413. -4
  2414. -5
  2415. -5
  2416. -5
  2417. -4
  2418. -5
  2419. -5
  2420. -4
  2421. -5
  2422. -5
  2423. -4
  2424. -4
  2425. -7
  2426. -4
  2427. -4
  2428. -5
  2429. -4
  2430. -5
  2431. -5
  2432. -4
  2433. -5
  2434. -5
  2435. -5
  2436. -5
  2437. -5
  2438. -5
  2439. -5
  2440. -4
  2441. -7
  2442. -5
  2443. -4
  2444. -5
  2445. -4
  2446. -4
  2447. -5
  2448. -4
  2449. -4
  2450. -4
  2451. -5
  2452. -5
  2453. -4
  2454. -4
  2455. -4
  2456. -3
  2457. -6
  2458. -4
  2459. -5
  2460. -5
  2461. -4
  2462. -4
  2463. -4
  2464. -4
  2465. -4
  2466. -4
  2467. -4
  2468. -4
  2469. -4
  2470. -4
  2471. -4
  2472. -5
  2473. -6
  2474. -3
  2475. -4
  2476. -3
  2477. -4
  2478. -5
  2479. -4
  2480. -4
  2481. -3
  2482. -4
  2483. -5
  2484. -5
  2485. -4
  2486. -5
  2487. -6
  2488. -3
  2489. -4
  2490. -4
  2491. -4
  2492. -4
  2493. -4
  2494. -5
  2495. -4
  2496. -4
  2497. -5
  2498. -4
  2499. -4
  2500. -5
  2501. -5
  2502. -4
  2503. -4
  2504. -5
  2505. -4
  2506. -5
  2507. -4
  2508. -3
  2509. -3
  2510. -5
  2511. -5
  2512. -5
  2513. -4
  2514. -4
  2515. -4
  2516. -4
  2517. -4
  2518. -4
  2519. -4
  2520. -5
  2521. -4
  2522. -4
  2523. -4
  2524. -4
  2525. -5
  2526. -5
  2527. -4
  2528. -4
  2529. -3
  2530. -4
  2531. -5
  2532. -4
  2533. -5
  2534. -4
  2535. -3
  2536. -4
  2537. -6
  2538. -4
  2539. -5
  2540. -4
  2541. -3
  2542. -4
  2543. -3
  2544. -5
  2545. -5
  2546. -4
  2547. -5
  2548. -5
  2549. -4
  2550. -4
  2551. -5
  2552. -4
  2553. -6
  2554. -4
  2555. -5
  2556. -4
  2557. -4
  2558. -4
  2559. -4
  2560. -4
  2561. -4
  2562. -4
  2563. -4
  2564. -3
  2565. -5
  2566. -5
  2567. -4
  2568. -4
  2569. -7
  2570. -4
  2571. -4
  2572. -4
  2573. -5
  2574. -5
  2575. -4
  2576. -4
  2577. -4
  2578. -5
  2579. -4
  2580. -4
  2581. -4
  2582. -4
  2583. -4
  2584. -5
  2585. -4
  2586. -3
  2587. -4
  2588. -4
  2589. -5
  2590. -4
  2591. -4
  2592. -4
  2593. -5
  2594. -3
  2595. -3
  2596. -4
  2597. -4
  2598. -4
  2599. -4
  2600. -4
  2601. -6
  2602. -4
  2603. -4
  2604. -3
  2605. -4
  2606. -3
  2607. -3
  2608. -4
  2609. -4
  2610. -4
  2611. -3
  2612. -4
  2613. -4
  2614. -3
  2615. -3
  2616. -4
  2617. -5
  2618. -3
  2619. -4
  2620. -3
  2621. -4
  2622. -4
  2623. -3
  2624. -4
  2625. -4
  2626. -4
  2627. -3
  2628. -3
  2629. -3
  2630. -4
  2631. -3
  2632. -4
  2633. -4
  2634. -4
  2635. -4
  2636. -3
  2637. -3
  2638. -3
  2639. -3
  2640. -4
  2641. -4
  2642. -3
  2643. -3
  2644. -4
  2645. -4
  2646. -4
  2647. -2
  2648. -3
  2649. -5
  2650. -4
  2651. -3
  2652. -4
  2653. -3
  2654. -4
  2655. -3
  2656. -5
  2657. -4
  2658. -3
  2659. -3
  2660. -5
  2661. -4
  2662. -4
  2663. -4
  2664. -4
  2665. -5
  2666. -3
  2667. -6
  2668. -4
  2669. -3
  2670. -4
  2671. -5
  2672. -3
  2673. -5
  2674. -5
  2675. -5
  2676. -4
  2677. -3
  2678. -4
  2679. -4
  2680. -3
  2681. -5
  2682. -5
  2683. -5
  2684. -3
  2685. -4
  2686. -3
  2687. -4
  2688. -5
  2689. -5
  2690. -5
  2691. -4
  2692. -5
  2693. -4
  2694. -4
  2695. -4
  2696. -4
  2697. -4
  2698. -5
  2699. -5
  2700. -4
  2701. -6
  2702. -4
  2703. -4
  2704. -4
  2705. -4
  2706. -4
  2707. -5
  2708. -4
  2709. -5
  2710. -4
  2711. -3
  2712. -4
  2713. -6
  2714. -4
  2715. -4
  2716. -4
  2717. -5
  2718. -4
  2719. -5
  2720. -4
  2721. -5
  2722. -4
  2723. -5
  2724. -4
  2725. -4
  2726. -4
  2727. -3
  2728. -5
  2729. -6
  2730. -3
  2731. -3
  2732. -4
  2733. -4
  2734. -4
  2735. -4
  2736. -4
  2737. -4
  2738. -4
  2739. -4
  2740. -4
  2741. -4
  2742. -4
  2743. -4
  2744. -3
  2745. -7
  2746. -5
  2747. -3
  2748. -5
  2749. -3
  2750. -4
  2751. -4
  2752. -4
  2753. -5
  2754. -4
  2755. -5
  2756. -4
  2757. -4
  2758. -4
  2759. -4
  2760. -5
  2761. -3
  2762. -4
  2763. -4
  2764. -4
  2765. -4
  2766. -4
  2767. -5
  2768. -4
  2769. -4
  2770. -4
  2771. -4
  2772. -3
  2773. -4
  2774. -5
  2775. -3
  2776. -4
  2777. -5
  2778. -3
  2779. -3
  2780. -4
  2781. -4
  2782. -4
  2783. -5
  2784. -3
  2785. -4
  2786. -4
  2787. -4
  2788. -4
  2789. -3
  2790. -4
  2791. -3
  2792. -4
  2793. -6
  2794. -5
  2795. -4
  2796. -6
  2797. -4
  2798. -4
  2799. -3
  2800. -4
  2801. -4
  2802. -3
  2803. -4
  2804. -5
  2805. -3
  2806. -3
  2807. -4
  2808. -4
  2809. -6
  2810. -5
  2811. -4
  2812. -3
  2813. -5
  2814. -5
  2815. -5
  2816. -5
  2817. -4
  2818. -4
  2819. -4
  2820. -5
  2821. -4
  2822. -4
  2823. -5
  2824. -4
  2825. -4
  2826. -4
  2827. -4
  2828. -4
  2829. -4
  2830. -5
  2831. -4
  2832. -4
  2833. -4
  2834. -4
  2835. -4
  2836. -4
  2837. -5
  2838. -4
  2839. -3
  2840. -3
  2841. -7
  2842. -4
  2843. -5
  2844. -3
  2845. -4
  2846. -4
  2847. -4
  2848. -4
  2849. -4
  2850. -5
  2851. -5
  2852. -3
  2853. -4
  2854. -5
  2855. -6
  2856. -4
  2857. -6
  2858. -4
  2859. -4
  2860. -3
  2861. -4
  2862. -4
  2863. -4
  2864. -4
  2865. -4
  2866. -4
  2867. -4
  2868. -3
  2869. -4
  2870. -4
  2871. -3
  2872. -4
  2873. -6
  2874. -3
  2875. -5
  2876. -4
  2877. -5
  2878. -4
  2879. -4
  2880. -4
  2881. -3
  2882. -4
  2883. -4
  2884. -4
  2885. -4
  2886. -4
  2887. -3
  2888. -3
  2889. -6
  2890. -4
  2891. -5
  2892. -3
  2893. -3
  2894. -5
  2895. -4
  2896. -4
  2897. -4
  2898. -4
  2899. -5
  2900. -4
  2901. -3
  2902. -4
  2903. -4
  2904. -4
  2905. -5
  2906. -4
  2907. -3
  2908. -3
  2909. -4
  2910. -4
  2911. -4
  2912. -4
  2913. -4
  2914. -4
  2915. -4
  2916. -5
  2917. -5
  2918. -5
  2919. -5
  2920. -5
  2921. -5
  2922. -4
  2923. -4
  2924. -5
  2925. -5
  2926. -4
  2927. -5
  2928. -4
  2929. -5
  2930. -5
  2931. -4
  2932. -5
  2933. -4
  2934. -5
  2935. -4
  2936. -5
  2937. -5
  2938. -5
  2939. -5
  2940. -5
  2941. -4
  2942. -5
  2943. -4
  2944. -5
  2945. -4
  2946. -3
  2947. -4
  2948. -4
  2949. -5
  2950. -5
  2951. -5
  2952. -4
  2953. -5
  2954. -4
  2955. -4
  2956. -6
  2957. -5
  2958. -4
  2959. -5
  2960. -4
  2961. -4
  2962. -5
  2963. -5
  2964. -4
  2965. -4
  2966. -4
  2967. -3
  2968. -4
  2969. -8
  2970. -4
  2971. -5
  2972. -5
  2973. -4
  2974. -4
  2975. -4
  2976. -5
  2977. -4
  2978. -5
  2979. -4
  2980. -4
  2981. -4
  2982. -5
  2983. -4
  2984. -3
  2985. -5
  2986. -4
  2987. -4
  2988. -5
  2989. -4
  2990. -5
  2991. -4
  2992. -4
  2993. -3
  2994. -4
  2995. -4
  2996. -5
  2997. -4
  2998. -4
  2999. -4
  3000. -4
  3001. -6
  3002. -4
  3003. -4
  3004. -4
  3005. -4
  3006. -4
  3007. -4
  3008. -5
  3009. -4
  3010. -5
  3011. -4
  3012. -3
  3013. -4
  3014. -4
  3015. -4
  3016. -4
  3017. -5
  3018. -3
  3019. -5
  3020. -5
  3021. -3
  3022. -4
  3023. -3
  3024. -4
  3025. -5
  3026. -4
  3027. -5
  3028. -4
  3029. -4
  3030. -4
  3031. -4
  3032. -4
  3033. -5
  3034. -4
  3035. -4
  3036. -4
  3037. -3
  3038. -4
  3039. -5
  3040. -4
  3041. -4
  3042. -4
  3043. -4
  3044. -4
  3045. -5
  3046. -4
  3047. -5
  3048. -4
  3049. -5
  3050. -4
  3051. -6
  3052. -5
  3053. -4
  3054. -5
  3055. -5
  3056. -5
  3057. -5
  3058. -5
  3059. -4
  3060. -5
  3061. -5
  3062. -4
  3063. -4
  3064. -4
  3065. -5
  3066. -5
  3067. -5
  3068. -5
  3069. -4
  3070. -4
  3071. -4
  3072. -4
  3073. -4
  3074. -3
  3075. -4
  3076. -4
  3077. -4
  3078. -4
  3079. -4
  3080. -4
  3081. -3
  3082. -4
  3083. -4
  3084. -5
  3085. -4
  3086. -4
  3087. -4
  3088. -5
  3089. -4
  3090. -4
  3091. -4
  3092. -4
  3093. -4
  3094. -4
  3095. -4
  3096. -4
  3097. -5
  3098. -4
  3099. -5
  3100. -4
  3101. -5
  3102. -4
  3103. -4
  3104. -4
  3105. -3
  3106. -4
  3107. -5
  3108. -3
  3109. -4
  3110. -3
  3111. -4
  3112. -4
  3113. -6
  3114. -4
  3115. -4
  3116. -4
  3117. -4
  3118. -4
  3119. -4
  3120. -4
  3121. -4
  3122. -4
  3123. -4
  3124. -3
  3125. -3
  3126. -5
  3127. -3
  3128. -3
  3129. -6
  3130. -3
  3131. -4
  3132. -3
  3133. -4
  3134. -4
  3135. -3
  3136. -3
  3137. -4
  3138. -4
  3139. -4
  3140. -4
  3141. -4
  3142. -4
  3143. -3
  3144. -3
  3145. -6
  3146. -5
  3147. -3
  3148. -4
  3149. -4
  3150. -3
  3151. -4
  3152. -4
  3153. -4
  3154. -6
  3155. -3
  3156. -4
  3157. -4
  3158. -4
  3159. -3
  3160. -4
  3161. -6
  3162. -5
  3163. -4
  3164. -4
  3165. -4
  3166. -5
  3167. -6
  3168. -6
  3169. -4
  3170. -4
  3171. -4
  3172. -5
  3173. -3
  3174. -4
  3175. -5
  3176. -5
  3177. -5
  3178. -4
  3179. -5
  3180. -5
  3181. -4
  3182. -4
  3183. -4
  3184. -4
  3185. -3
  3186. -5
  3187. -4
  3188. -4
  3189. -4
  3190. -4
  3191. -5
  3192. -4
  3193. -4
  3194. -4
  3195. -4
  3196. -3
  3197. -4
  3198. -5
  3199. -5
  3200. -5
  3201. -4
  3202. -4
  3203. -4
  3204. -4
  3205. -4
  3206. -3
  3207. -6
  3208. -5
  3209. -6
  3210. -4
  3211. -4
  3212. -4
  3213. -4
  3214. -5
  3215. -4
  3216. -4
  3217. -5
  3218. -4
  3219. -4
  3220. -4
  3221. -5
  3222. -4
  3223. -5
  3224. -4
  3225. -5
  3226. -3
  3227. -3
  3228. -5
  3229. -2
  3230. -4
  3231. -4
  3232. -3
  3233. -4
  3234. -6
  3235. -4
  3236. -5
  3237. -5
  3238. -5
  3239. -5
  3240. -5
  3241. -5
  3242. -6
  3243. -4
  3244. -4
  3245. -4
  3246. -5
  3247. -5
  3248. -5
  3249. -3
  3250. -4
  3251. -4
  3252. -4
  3253. -4
  3254. -4
  3255. -4
  3256. -4
  3257. -5
  3258. -6
  3259. -4
  3260. -4
  3261. -5
  3262. -4
  3263. -4
  3264. -4
  3265. -4
  3266. -3
  3267. -4
  3268. -5
  3269. -5
  3270. -5
  3271. -4
  3272. -3
  3273. -5
  3274. -4
  3275. -4
  3276. -4
  3277. -5
  3278. -5
  3279. -5
  3280. -5
  3281. -4
  3282. -5
  3283. -4
  3284. -5
  3285. -4
  3286. -4
  3287. -3
  3288. -4
  3289. -6
  3290. -3
  3291. -5
  3292. -4
  3293. -3
  3294. -4
  3295. -4
  3296. -4
  3297. -4
  3298. -5
  3299. -4
  3300. -5
  3301. -4
  3302. -5
  3303. -4
  3304. -4
  3305. -5
  3306. -3
  3307. -3
  3308. -4
  3309. -5
  3310. -4
  3311. -4
  3312. -4
  3313. -4
  3314. -4
  3315. -5
  3316. -4
  3317. -3
  3318. -4
  3319. -3
  3320. -4
  3321. -4
  3322. -4
  3323. -5
  3324. -4
  3325. -5
  3326. -4
  3327. -4
  3328. -4
  3329. -5
  3330. -5
  3331. -4
  3332. -3
  3333. -5
  3334. -4
  3335. -5
  3336. -5
  3337. -6
  3338. -5
  3339. -3
  3340. -4
  3341. -4
  3342. -6
  3343. -5
  3344. -4
  3345. -4
  3346. -4
  3347. -4
  3348. -6
  3349. -5
  3350. -5
  3351. -4
  3352. -4
  3353. -5
  3354. -4
  3355. -5
  3356. -3
  3357. -4
  3358. -5
  3359. -4
  3360. -4
  3361. -4
  3362. -5
  3363. -5
  3364. -4
  3365. -4
  3366. -4
  3367. -6
  3368. -4
  3369. -5
  3370. -5
  3371. -5
  3372. -5
  3373. -4
  3374. -4
  3375. -4
  3376. -5
  3377. -4
  3378. -4
  3379. -5
  3380. -4
  3381. -4
  3382. -4
  3383. -5
  3384. -4
  3385. -5
  3386. -3
  3387. -3
  3388. -5
  3389. -5
  3390. -4
  3391. -5
  3392. -4
  3393. -4
  3394. -4
  3395. -5
  3396. -4
  3397. -4
  3398. -4
  3399. -4
  3400. -4
  3401. -4
  3402. -5
  3403. -5
  3404. -4
  3405. -4
  3406. -4
  3407. -3
  3408. -3
  3409. -4
  3410. -5
  3411. -6
  3412. -4
  3413. -5
  3414. -5
  3415. -5
  3416. -5
  3417. -6
  3418. -5
  3419. -4
  3420. -5
  3421. -6
  3422. -5
  3423. -5
  3424. -5
  3425. -5
  3426. -4
  3427. -5
  3428. -4
  3429. -5
  3430. -5
  3431. -5
  3432. -3
  3433. -5
  3434. -4
  3435. -5
  3436. -4
  3437. -5
  3438. -5
  3439. -5
  3440. -4
  3441. -6
  3442. -5
  3443. -5
  3444. -5
  3445. -5
  3446. -4
  3447. -5
  3448. -5
  3449. -6
  3450. -5
  3451. -5
  3452. -5
  3453. -4
  3454. -5
  3455. -4
  3456. -5
  3457. -6
  3458. -3
  3459. -5
  3460. -5
  3461. -6
  3462. -5
  3463. -6
  3464. -5
  3465. -4
  3466. -5
  3467. -5
  3468. -5
  3469. -6
  3470. -5
  3471. -6
  3472. -5
  3473. -5
  3474. -4
  3475. -5
  3476. -6
  3477. -4
  3478. -5
  3479. -4
  3480. -5
  3481. -7
  3482. -5
  3483. -5
  3484. -4
  3485. -5
  3486. -5
  3487. -5
  3488. -4
  3489. -4
  3490. -4
  3491. -5
  3492. -4
  3493. -4
  3494. -4
  3495. -5
  3496. -5
  3497. -6
  3498. -4
  3499. -3
  3500. -4
  3501. -5
  3502. -5
  3503. -5
  3504. -5
  3505. -4
  3506. -4
  3507. -5
  3508. -6
  3509. -4
  3510. -5
  3511. -4
  3512. -5
  3513. -4
  3514. -4
  3515. -5
  3516. -4
  3517. -5
  3518. -5
  3519. -5
  3520. -5
  3521. -5
  3522. -5
  3523. -4
  3524. -5
  3525. -5
  3526. -5
  3527. -4
  3528. -4
  3529. -4
  3530. -4
  3531. -4
  3532. -4
  3533. -3
  3534. -5
  3535. -5
  3536. -4
  3537. -5
  3538. -6
  3539. -5
  3540. -5
  3541. -5
  3542. -4
  3543. -6
  3544. -5
  3545. -5
  3546. -4
  3547. -5
  3548. -5
  3549. -5
  3550. -3
  3551. -5
  3552. -4
  3553. -5
  3554. -4
  3555. -4
  3556. -5
  3557. -4
  3558. -6
  3559. -5
  3560. -4
  3561. -7
  3562. -4
  3563. -4
  3564. -4
  3565. -5
  3566. -4
  3567. -5
  3568. -5
  3569. -3
  3570. -5
  3571. -5
  3572. -4
  3573. -5
  3574. -4
  3575. -5
  3576. -3
  3577. -6
  3578. -5
  3579. -4
  3580. -4
  3581. -4
  3582. -5
  3583. -5
  3584. -4
  3585. -4
  3586. -4
  3587. -5
  3588. -5
  3589. -3
  3590. -5
  3591. -4
  3592. -5
  3593. -5
  3594. -4
  3595. -4
  3596. -5
  3597. -4
  3598. -4
  3599. -5
  3600. -5
  3601. -5
  3602. -5
  3603. -5
  3604. -5
  3605. -4
  3606. -5
  3607. -3
  3608. -4
  3609. -2
  3610. -4
  3611. -5
  3612. -5
  3613. -4
  3614. -4
  3615. -4
  3616. -6
  3617. -4
  3618. -4
  3619. -3
  3620. -3
  3621. -4
  3622. -4
  3623. -5
  3624. -4
  3625. -5
  3626. -3
  3627. -4
  3628. -4
  3629. -5
  3630. -5
  3631. -4
  3632. -5
  3633. -5
  3634. -5
  3635. -5
  3636. -4
  3637. -5
  3638. -4
  3639. -4
  3640. -4
  3641. -7
  3642. -4
  3643. -4
  3644. -5
  3645. -4
  3646. -5
  3647. -5
  3648. -4
  3649. -4
  3650. -4
  3651. -4
  3652. -5
  3653. -4
  3654. -5
  3655. -3
  3656. -5
  3657. -7
  3658. -4
  3659. -4
  3660. -5
  3661. -4
  3662. -4
  3663. -5
  3664. -5
  3665. -5
  3666. -6
  3667. -5
  3668. -5
  3669. -4
  3670. -4
  3671. -5
  3672. -5
  3673. -6
  3674. -5
  3675. -4
  3676. -5
  3677. -4
  3678. -4
  3679. -5
  3680. -5
  3681. -5
  3682. -4
  3683. -5
  3684. -4
  3685. -4
  3686. -5
  3687. -4
  3688. -5
  3689. -6
  3690. -6
  3691. -5
  3692. -6
  3693. -5
  3694. -5
  3695. -5
  3696. -4
  3697. -6
  3698. -5
  3699. -6
  3700. -5
  3701. -5
  3702. -4
  3703. -5
  3704. -6
  3705. -6
  3706. -5
  3707. -5
  3708. -4
  3709. -6
  3710. -4
  3711. -4
  3712. -5
  3713. -5
  3714. -5
  3715. -5
  3716. -5
  3717. -6
  3718. -5
  3719. -6
  3720. -5
  3721. -5
  3722. -6
  3723. -5
  3724. -5
  3725. -5
  3726. -5
  3727. -5
  3728. -5
  3729. -4
  3730. -4
  3731. -5
  3732. -4
  3733. -5
  3734. -5
  3735. -4
  3736. -5
  3737. -5
  3738. -4
  3739. -5
  3740. -4
  3741. -4
  3742. -4
  3743. -5
  3744. -5
  3745. -4
  3746. -5
  3747. -5
  3748. -5
  3749. -5
  3750. -4
  3751. -4
  3752. -5
  3753. -8
  3754. -4
  3755. -4
  3756. -5
  3757. -4
  3758. -5
  3759. -6
  3760. -5
  3761. -5
  3762. -5
  3763. -6
  3764. -5
  3765. -6
  3766. -4
  3767. -5
  3768. -4
  3769. -5
  3770. -4
  3771. -4
  3772. -5
  3773. -4
  3774. -6
  3775. -4
  3776. -4
  3777. -4
  3778. -6
  3779. -6
  3780. -6
  3781. -5
  3782. -6
  3783. -5
  3784. -5
  3785. -4
  3786. -6
  3787. -4
  3788. -5
  3789. -4
  3790. -5
  3791. -4
  3792. -5
  3793. -5
  3794. -5
  3795. -5
  3796. -5
  3797. -4
  3798. -5
  3799. -5
  3800. -5
  3801. -6
  3802. -5
  3803. -5
  3804. -4
  3805. -5
  3806. -5
  3807. -6
  3808. -5
  3809. -5
  3810. -5
  3811. -5
  3812. -5
  3813. -5
  3814. -5
  3815. -5
  3816. -4
  3817. -6
  3818. -5
  3819. -4
  3820. -5
  3821. -5
  3822. -6
  3823. -4
  3824. -5
  3825. -4
  3826. -5
  3827. -6
  3828. -5
  3829. -5
  3830. -5
  3831. -5
  3832. -4
  3833. -5
  3834. -4
  3835. -5
  3836. -4
  3837. -4
  3838. -4
  3839. -4
  3840. -4
  3841. -5
  3842. -5
  3843. -4
  3844. -4
  3845. -5
  3846. -4
  3847. -6
  3848. -5
  3849. -7
  3850. -4
  3851. -4
  3852. -4
  3853. -4
  3854. -4
  3855. -5
  3856. -4
  3857. -5
  3858. -4
  3859. -5
  3860. -5
  3861. -4
  3862. -4
  3863. -5
  3864. -4
  3865. -5
  3866. -4
  3867. -5
  3868. -4
  3869. -5
  3870. -5
  3871. -5
  3872. -5
  3873. -5
  3874. -5
  3875. -6
  3876. -5
  3877. -4
  3878. -5
  3879. -5
  3880. -5
  3881. -7
  3882. -5
  3883. -5
  3884. -5
  3885. -5
  3886. -6
  3887. -5
  3888. -5
  3889. -5
  3890. -5
  3891. -5
  3892. -5
  3893. -6
  3894. -5
  3895. -6
  3896. -5
  3897. -5
  3898. -5
  3899. -5
  3900. -5
  3901. -5
  3902. -5
  3903. -5
  3904. -5
  3905. -6
  3906. -4
  3907. -4
  3908. -5
  3909. -5
  3910. -5
  3911. -5
  3912. -6
  3913. -7
  3914. -5
  3915. -5
  3916. -6
  3917. -5
  3918. -4
  3919. -5
  3920. -6
  3921. -6
  3922. -6
  3923. -5
  3924. -5
  3925. -5
  3926. -5
  3927. -5
  3928. -6
  3929. -6
  3930. -6
  3931. -4
  3932. -6
  3933. -5

Existe un error sistemático (de offset) y cierto ruido no muy grande.

Adjunto una gráfica que representa con puntos el error para cada valor de DAC y el archivo excel:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=47700.0;attach=28009;image)

Un saludo.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 19 de Mayo de 2017, 16:20:12
Continuous Sampling
En este caso he hecho pruebas de error de DAC y ADC con 12 bits de resolución.
He conseguido que el ADC trabaje en modo continuous sampling controlando directamente los registros del ADC.
Con un reloj de 15MHz (60MHz de bus entre 4) se consigue una conversión cada 20 ciclos (una conversión cada 1.333us o 750ksamples/segundo) que no está nada mal.

Los resultados, por alguna razón, tienen más error de linealidad. Quizá sea por la calibración.
El error de ruido está muy bien, con desviaciones estándar máximas de 1.3 (error de +-2 en la lectura), semejantes a los calculados anteriormente para las funciones más lentas de Arduino.

Adjunto programa de Arduino:
Código: C
  1. /*
  2.    Fast ADC
  3.    Continous sampling
  4.    https://github.com/PaulStoffregen/cores/blob/master/teensy3/analog.c
  5. */
  6.  
  7. #define VREF_MARGIN     0.02
  8. #define DAC_RANGE       4096.0
  9. #define DAC_MARGIN      (0.02 * DAC_RANGE)
  10.  
  11. void ADC1_init(uint8_t channel);
  12. uint16_t ADC1_read(uint8_t channel);
  13. const int ledPin = 13;
  14.  
  15.  
  16. void setup() {
  17.   // Config
  18.   Serial.begin(9600);
  19.   pinMode(ledPin, OUTPUT);
  20.   pinMode(A20, INPUT);
  21.  
  22.   // Set 12 bit resolution
  23.   analogWriteResolution(12);
  24.   analogReadResolution(12);
  25.  
  26.   ADC1_init(A20);
  27. }
  28.  
  29.  
  30. void loop() {
  31.   int volts_read, error;
  32.   float mean, desvest;
  33.   int const average_dots = 128;
  34.  
  35.   // DAC range sweep
  36.   for(int volts_write=DAC_MARGIN; volts_write<DAC_RANGE-DAC_MARGIN; volts_write++) {
  37.     // Change DAC output
  38.     analogWrite(A21, volts_write);
  39.     delayMicroseconds(20);
  40.  
  41.     // Compute mean and standard deviation of error
  42.     mean = desvest = 0;
  43.     for(int j=0; j<average_dots; j++) {
  44.       volts_read = analogRead(A20); // ADC1_read(A20);
  45.       *portToggleRegister(ledPin) = 1;        
  46.       error = volts_write - volts_read;
  47.       mean += error;
  48.       desvest += error*error;
  49.     }
  50.     mean = mean * (1.0/average_dots);
  51.     desvest = sqrt(desvest * (1.0/average_dots) - mean*mean);
  52.  
  53.     // Print mean and standard deviation of error
  54.     Serial.print("Volts="); Serial.print(volts_write);
  55.     Serial.print("\tMean="); Serial.print(mean);
  56.     Serial.print("\tDesvest="); Serial.print(desvest);
  57.     Serial.println();
  58.   }
  59.   while(Serial.read() < 0);
  60. }
  61.  
  62.  
  63. /**************************************************************************/
  64.  
  65. // __MK64FX512__ and __MK66FX1M0__ Teensy analog pins definitions
  66. // Numbers below 128 belongs to ADC0. Numbers greater than 128 belongs to ADC1
  67. // Source: https://github.com/PaulStoffregen/cores/blob/master/teensy3/analog.c
  68. static const uint8_t pin2sc1a[] = {
  69.   5, 14, 8, 9, 13, 12, 6, 7, 15, 4, 3, 19+128, 14+128, 15+128, // 0-13 -> A0-A13
  70.   5, 14, 8, 9, 13, 12, 6, 7, 15, 4, // 14-23 are A0-A9
  71.   255, 255, 255, 255, 255, 255, 255, // 24-30 are digital only
  72.   14+128, 15+128, 17, 18, 4+128, 5+128, 6+128, 7+128, 17+128,  // 31-39 are A12-A20
  73.   255, 255, 255, 255, 255, 255, 255, 255, 255,  // 40-48 are digital only
  74.   10+128, 11+128, // 49-50 are A23-A24
  75.   255, 255, 255, 255, 255, 255, 255, // 51-57 are digital only
  76.   255, 255, 255, 255, 255, 255, // 58-63 (sd card pins) are digital only
  77.   3, 19+128, // 64-65 are A10-A11
  78.   23, 23+128,// 66-67 are A21-A22 (DAC pins)
  79.   1, 1+128,  // 68-69 are A25-A26 (unused USB host port on Teensy 3.5)
  80.   26,        // 70 is Temperature Sensor
  81.   18+128     // 71 is Vref
  82. };
  83.  
  84.  
  85. // Init ADC1
  86. void ADC1_init(uint8_t channel) {
  87.   uint32_t ADC_CFG1, ADC_CFG2, ADC_SC1A;
  88.  
  89.   if (channel > sizeof(pin2sc1a)) return;
  90.  
  91.   ADC_CFG1 =
  92.     //+ ADC_CFG1_ADLPC     // Low-power configuration
  93.     //+ ADC_CFG1_ADLSMP    // Long Sample Time
  94.     + ADC_CFG1_MODE(1)   // 0=8bit, 1=12bit, 2=10bit, 3=16bit
  95.     + ADC_CFG1_ADIV(1)   // Clock divide, 0=direct, 1=div2, 2=div4, 3=div8
  96.     + ADC_CFG1_ADICLK(1) // Input clock, 0=bus, 1=bus/2, 2= , 3=async
  97.     + 0;
  98.   ADC1_CFG1 = ADC_CFG1;
  99.  
  100.   ADC_CFG2 =
  101.     //+ ADC_CFG2_MUXSEL     // Selects ADxxB channels instead ADxxA channels
  102.     //+ ADC_CFG2_ADACKEN    // Async clock enable
  103.     //+ ADC_CFG2_ADHSC      // Add 2 extra clocks to conversion (for high speed clocks)
  104.     //+ ADC_CFG2_ADLSTS(3) // Extra clocks for long sample (ADLSMP=1) (0=24,1=12,2=6,3=4)
  105.     + 0;
  106.   ADC1_CFG2 = ADC_CFG2;
  107.    
  108.   ADC_SC1A =
  109.     //+ ADC_SC1_COCO // Conversion Complete
  110.     //+ ADC_AIEN     // Interrupt Enable
  111.     //+ ADC_DIFF     // Differential Mode Enable
  112.     + pin2sc1a[channel];  // Input channel select and conversion init
  113.   ADC1_SC1A = ADC_SC1A;
  114.  
  115.   ADC1_SC2 =
  116.     //+ ADC_SC2_ADACT      // Conversion active
  117.     //+ ADC_SC2_ADTRG      // Conversion Trigger 0=Software, 1=Hardware
  118.     //+ ADC_SC2_ACFE       // Compare Function Enable
  119.     //+ ADC_SC2_ACFGT      // Compare Function Greater Than Enable
  120.     //+ ADC_SC2_ACREN      // Compare Function Range Enable
  121.     //+ ADC_SC2_DMAEN      // DMA Enable
  122.     + ADC_SC2_REFSEL(0); // Voltage Reference 0=Ext pins, 1=Alternate Ext. pins
  123.    
  124.   ADC1_SC3 =
  125.     //+ ADC_SC3_CAL     // Init Calibration
  126.     //+ ADC_SC3_CALF    // Calibration Failed
  127.     + ADC_SC3_ADCO    // Continuous conversion Enable
  128.     //+ ADC_SC3_AVGE    // Hardware average enable
  129.     //+ ADC_SC3_AVGS(3) // Hardware average 0=4 sampl, 1=8 sampl, 2=16 sampl, 3=32 sampl
  130.     +0;
  131.  
  132.   // Start Calibration
  133.   ADC1_SC3 |= ADC_SC3_CAL;
  134.   while ((ADC1_SC3 & ADC_SC3_CAL)) {
  135.     if (ADC1_SC3 & ADC_SC3_CALF) {
  136.       Serial.println("Calibration error");
  137.       return;
  138.     }
  139.   }
  140.   ADC1_SC3 &= ~ADC_SC3_CAL;
  141.   ADC1_CFG1 = ADC_CFG1;
  142.   ADC1_CFG2 = ADC_CFG2;
  143.  
  144.   // Conversion init
  145.   ADC1_SC1A = ADC_SC1A;
  146.   //Serial.println(ADC_SC1A); for(;;);
  147. }
  148.  
  149.  
  150. // Read ADC1
  151. uint16_t ADC1_read(uint8_t channel) {
  152.   // Change channel and init conversion.
  153.   // ADC0_SC1A = (ADC0_SC1A & (~(int)0x1F)) + pin2sc1a[channel & 0x1F]
  154.   while ((ADC1_SC1A & ADC_SC1_COCO) == 0);
  155.   return ADC1_RA;
  156. }


Saludos.
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: elgarbe en 22 de Mayo de 2017, 14:45:32
Picuino, no sé si lo has visto, pero para este tipo de aplicaciones (Mixed signal) ST tiene los M3 con características especiales para el ADC y el DAC:

http://www.st.com/en/microcontrollers/stm32f3-series.html?querycriteria=productId=SS1576

Como ves tenes 5MSPS hasta 18 en un modo especial (usa varios canales para leer el mismo valor analogico, de modo que cuando uno está convirtiendo el otro se "está preparando" para convertir).

La placa de evaluacion del stm32f3discovery cuesta USD14.7

quizá atmel tenga lo mismo, una familia con uC mixed signals.

saludos
Título: Re:Mis experiencias con Teensy 3.6
Publicado por: Picuino en 22 de Mayo de 2017, 15:21:03
El Kinetis K66 del Teensy3.6 también puede convertir con 2 ADCs para duplicar la frecuencia (interleaved). Pero tiene una frecuencia máxima de 2.4Msamples/segundo (imagino que a 8bit), menor que ese otro integrado.

Por ahora seguiré con la Teensy. Cuando haya avanzado y me lleguen las placas de ST, probaré con ellas.

Saludos.