Mostrando entradas con la etiqueta STM32F103C8T6. Mostrar todas las entradas
Mostrando entradas con la etiqueta STM32F103C8T6. Mostrar todas las entradas

sábado, 22 de julio de 2017

OSCILOSCOPIO- Arduino - STM32F103C8T6



OSCILOSCOPIO
Arduino

STM32F103C8T6
640000 muestras segundo
Fast A/D


En mi anterior montaje había realizado un osciloscopio con un arduino. Había conseguido una tasa máxima de muestreo de 250000 muestras por segundo. El programa estaba realizado utilizando la librería SDL en la parte del PC.
Como tenía un arduino basado en un STM32F103C8T6 , un  procesador  bastante mas potente que el ATmega 328 , investigue si podía conseguir una tasa de muestreo algo mas elevada.
Según la tabla de características del  STM32F103xx  performance line devices: 1 μs at 56 MHz (1.17 μs at 72 MHz).
Se raro que indique mas rapidez de conversión a 56 MHz que a 72 MHz , pero el caso es que en teoría podría llegar a una tasa de muestreo de 854000 muestras por segundo.
Mi idea era mantener el interface SDL del anterior montaje y cambiar el programa arduino de obtención de datos en la placa STM32F103, ajustándolo al nuevo procesador.
Lo primero que intente con éxito era cambiar la orden del conversor A/D  y utilice la orden: adc_read(ADC2, 0) , donde el 0 es el pin A0 que corresponde al PA0 en el programa.
El programa funcionaba, pero no se conseguía un aumento significativo en la tasa de conversión.
Mirando por internet encontré una fórmula para cambiar el reloj del conversor A/D con la orden: adc_set_prescaler(ADC_PRE_PCLK2_DIV_4) .
Puede tener tres opciones:
  ADC_PRE_PCLK2_DIV_2
  ADC_PRE_PCLK2_DIV_4
  ADC_PRE_PCLK2_DIV_6
  ADC_PRE_PCLK2_DIV_8

Con este cambio en la frecuencia de reloj, cambiamos la tasa de muestreo.

Clock configuration register (RCC_CFGR)
Address offset: 0x04
Reset value: 0x0000 0000
Access: 0 ≤ wait state ≤ 2, word, half-word and byte access
1 or 2 wait states inserted only if the access occurs during clock source switch.

Bits 15:14 ADCPRE: ADC prescaler
Set and cleared by software to select the frequency of the clock to the ADCs.
00: PCLK2 divided by 2
01: PCLK2 divided by 4
10: PCLK2 divided by 6
11: PCLK2 divided by 8


Pero aún así no llegábamos a la tasa de muestreo que prometían las especificaciones del procesador.
Buscando por internet encontré en un foro http://www.stm32duino.com/viewtopic.php?t=847  la forma de aumentar la tasa de muestreo.
La forma era con el comando: adc_set_sample_rate(ADC2, ADC_SMPR_13_5);
Efectivamente, aumento la tasa de muestreo a mas de 600000 muestras por segundo.
Las opciones posibles son:
    ADC_SMPR_1_5,               /**< 1.5 ADC cycles */
    ADC_SMPR_7_5,               /**< 7.5 ADC cycles */
    ADC_SMPR_13_5,              /**< 13.5 ADC cycles */
    ADC_SMPR_28_5,              /**< 28.5 ADC cycles */
    ADC_SMPR_41_5,              /**< 41.5 ADC cycles */
    ADC_SMPR_55_5,              /**< 55.5 ADC cycles */
    ADC_SMPR_71_5,              /**< 71.5 ADC cycles */
    ADC_SMPR_239_5,             /**< 239.5 ADC cycles */
Aunque no entiendo muy bien lo que realmente hace, el manual del registro dice:
ADC sample time register 2 (ADC_SMPR2)
Address offset: 0x10
Reset value: 0x0000 0000

Bits 29:0 SMPx[2:0]: Channel x Sample time selection
These bits are written by software to select the sample time individually for each channel.
During sample cycles channel selection bits must remain unchanged.

De las prueba realizadas la mejor combinación para dar una tasa de muestreo de 640000 muestras/segundo  es :
adc_set_prescaler(ADC_PRE_PCLK2_DIV_2) ;
adc_set_sample_rate(ADC2, ADC_SMPR_7_5);


Visualización de una frecuencia de 16000Hz . Muestreo de 640000 muestras/seg.

Para poder visualizar y medir mejor las ondas, he incorporado botones de zoom y de desplazamiento de onda.

Visualización de la onda 16KHz con zoom x4 modo puntos.

 
Visualización de la onda 16KHz con zoom x4 modo lineas.

Podemos observar 40 muestreos en un ciclo de onda de 16KHz.
Si calculamos 16000x40=640000 muestras/segundo.



PROGRAMA

Nota:
Debemos tener en cuenta que la máxima tensión de entrada es de 3.3V , que también es la tensión de alimentación del procesador.
La impedancia de entrada es mucho mas baja que en un arduino convencional,  lo que debemos tener en cuenta.
La propia sonda del osciloscopio me producía ruido en el propio chip.



Saludos
Juan Galaz



Bibliografía:
oscisdl.html
http://www.stm32duino.com/viewtopic.php?t=847
https://github.com/leaflabs/leaflabs-docs/blob/master/source/libmaple/overview.rst
https://hackaday.io/project/425-arduino-oscilloscope-688000-samplessec


www.000webhost.com

jueves, 2 de febrero de 2017

STM32F103C8T6 vs Arduino - Test de un bucle

Página principal


STM32F103C8T6
vs
Arduino
Test en un bucle


En esta practica voy a comparar la rapidez de un bucle en las dos placas.

Programa de bucle
//  Arduino
//  22.6 Seg.  __2000

//  STM
//  5.8 Seg.  ___2000

int n1,n2;
char z;

// STM
#define pinLED1 PA0

//Arduino
//#define pinLED1 13

void setup()
{
 pinMode(pinLED1, OUTPUT);
}

void loop()
{
   digitalWrite(pinLED1, HIGH);
   for(n1=0;n1<30000;n1++)
     {
       for(n2=0;n2<2000;n2++) { z=1; }
     }
   digitalWrite(pinLED1, LOW);
   for(n1=0;n1<30000;n1++)
     {
       for(n2=0;n2<2000;n2++) { z=0; }
     }
              
}


Como podemos comprobar que  si utilizamos el mismo programa, en Arduino tarda en recorrer el bucle 22.6 Seg. , y si utilizamos el STM32  tarda 5.8 Seg.
La comparación es de  3.8 veces más rápido el STM32 .
Yo esperaba bastante más rápido el STM32 por ser un micro de 32 bits  frente al arduino que es de 8 bits.
Además el uno funciona a 72 MHz frente al otro que funciona a 16 MHz.
Debemos pensar que la optimización de código de cada compilador es diferente.


Saludos.
JUAN GALAZ

STM32F103C8T6 vs Arduino Test con los puertos

Página principal

STM32F103C8T6
vs
Arduino
Test con los puertos


En esta practica voy a comparar la rapidez de manejo de puerto en las dos placas.




 Con STM32
//   817.7 khz
//__________
#define pinLED1 PA0


void setup()
{
   pinMode(pinLED1, OUTPUT);
 }

void loop()
{
 
salto:
  digitalWrite(pinLED1, LOW);
  digitalWrite(pinLED1, HIGH);
  goto salto;

}

Con Arduino
// 94060 Hz

void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  digitalWrite(13, HIGH);  
  digitalWrite(13, LOW);            
}
//  96920 Hz

void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
salto:
  digitalWrite(13, HIGH);  
  digitalWrite(13, LOW);
  goto salto;            
}
//  2648.6 KHz

void setup()
{
   DDRB = DDRB | B00100000;
}
void loop()
{
salto:
  PORTB = PORTB | B00100000;
  PORTB = PORTB & B11011111;
  goto salto;    
}
//  3972.9 KHz

void setup()
{
   DDRB = DDRB | B00100000;
}
void loop()
{
salto:
  PORTB = 0;
  PORTB = 255;
  goto salto;          
}

Como podemos comprobar si utilizamos el mismo programa, en Arduino hacemos oscilar el puerto a 96 KHZ  ,y si utilizamos el STM32 oscila a 817KHz .
Como el arduino lo tengo bastante utilizado, sé bastantes trucos. Como vemos  podemos llegar a 2.6 Mhz , incluso a 3.9 Mhz haciendo alguna trampa.

Saludos.
JUAN GALAZ

miércoles, 25 de enero de 2017

Programar el STM32F103C8T6 con el IDE de Arduino

Página principal
STM32F103C8T6
y
Arduino

El otro día navegando por la red encontré un tutorial de como programar un ARM mediante  el entorno de arduino.
http://grauonline.de/wordpress/?page_id=1004
El procesador ARM está presente en muchos dispositivos, casi todos lo móviles android, los router , y otros muchos dispositivos.
El precio del módulo con el STM32F103C8T6 cuesta alrededor de 3€ lo cual es un precio muy competitivo.
El STM32F103C8T6  es un procesador con la siguientes características: ARM32 Cortex-M3, 72 Mhz, 64K flash, 20K SRAM, 33 I/O pins, 3.3V . El modulo además lleva un conector usb, un cristal extra de 32762Hz, y un par de puentes para programar el chip.




Los pasos seguidos para hacer funcionar el módulo STM en arduino son los siguientes:
-Tener instalado el entorno de arduino, en mi caso arduino-1.6.9 .
-Bajar de la página https://github.com/rogerclarkmelbourne/Arduino_STM32 el fichero:
      https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip
-Descomprimirlo dentro del directorio del  arduino/hardware/   creando un directorio llamado Arduino_STM32-master .
-Abrimos el arduino y cambiamos en el menú de herramientas lo siguiente:

Tecleamos el siguiente programa:
#define pinLED1 PA0

void setup()
{
   pinMode(pinLED1, OUTPUT);
}

void loop()
{
  digitalWrite(pinLED1, LOW);
  delay(500);
  digitalWrite(pinLED1, HIGH);
  delay(500);
}

Compilamos y si todo ha ido bien nos devolverá el siguiente mensaje:
El Sketch usa 7.116 bytes (10%) del espacio de almacenamiento de programa. El máximo es 65.536 bytes.
Variables globales usan 1.984 bytes de memoria dinamica.

El módulo dispone al igual que en el arduino, de un led conectado al pin C13 para probar sin tener que colocar ningún componente mas.
Para utilizar este led cambiar la línea:
#define pinLED1 PA0 
por
#define pinLED PC13

Ahora viene el paso de programar el módulo.
Para este paso necesitamos un conversor de USB a SERIE. Este conversor suele andar por los 3€ o menos, yo lo tenía de otros proyectos. Además el módulo proporciona los 3.3V para alimentar el chip.
Hemos de recordar que el Chip STM32F103C8T6 funciona a 3.3V , el módulo dispone de un reductor de tensión de 5V a 3.3V  , con lo cual podemos alimentarlo a 5V en el pin adecuado.
Según el fabricante la mayoría de los pin toleran de entrada  5V.
 (Up to 80 fast I/O ports –   26/37/51/80 I/Os, all mappable on 16 external interrupt vectors and almost all 5 V-tolerant

Conectamos el conversor USB a SERIE  según las imagenes siguiente:




Una vez hechas las conexiones nos toca programar el chip de la siguiente manera:

-Poner el puente BOOT0 a 1.
-Pulsar el botón de RESET .
-En el IDE de arduino pulsar el botón de Subir.

En pocos segundos se pondrá a parpadear el led.
Si queremos dejar el chip programado y no programarlo mas, movemos el puente BOOT0 a 0.

Próximamente haré otras prácticas para probar este módulo que promete mucho.


Saludos.
JUAN GALAZ

Bibliografía:

http://www.st.com/en/microcontrollers/stm32f103c8.html
http://grauonline.de/wordpress/?page_id=1004
https://github.com/rogerclarkmelbourne/Arduino_STM32
http://www.stm32duino.com/