ImageImageImageImage
Hazte Socio (El Foro siempre Gratis)
Paga con Tarjetas+ Info www.arde.cc/socios

Proyecto: Controlador de posición

Muestranos tus proyectos y pidenos la ayuda que necesites

Moderator: Junta Directiva

Post Reply
User avatar
Sphinx
Usuario Experto
Usuario Experto
Posts: 639
Joined: Thu Apr 03, 2008 4:45 pm
Location: Madrid
Contact:

Re: Proyecto: Controlador de posición

Post by Sphinx » Mon Sep 24, 2012 11:40 am

Hola,

La he estado buscando y he visto en la página de ST el datasheet:

Se llama STM32F3Discovery.

Muy interesante.

Y aqui algunos sitios donde la venden, parece....

Saludos,
Sphinx.
Tanto si piensas que puedes, como si piensas que no puedes, estás en lo cierto.- Henry Ford
>> Mis experiencias y proyectos robóticos: http://linuxdroids.com

User avatar
beamspot
Usuario Desarrollador
Usuario Desarrollador
Posts: 1132
Joined: Thu Oct 11, 2007 8:56 pm
Nombre: Guillem

Re: Proyecto: Controlador de posición

Post by beamspot » Mon Sep 24, 2012 5:25 pm

Una ojeada a los precios también pone los dientes largos...

La semana pasada Mouser no tenía ni una en Stock. Y sería raro que en poco tiempo no llegase también a Farnell y RS, aunque casi siempre el primero en recibir y despachar material suele ser DigiKey.

Sumamente interesante. De hecho, en el trabajo estamos prototipando ahora con el STM32F407, cuando los STM32F3 nos vendrían igual de bien (para qué queremos un Ethernet que no vamos a usar?), si bien los 72MHz suponen 'una traba' frente a los 166MHz de los STM32F407. :twisted:

Lástima que de momento no he podido jugar mucho con estos bichos (algo de SPI y USART, hace meses), ya que estoy haciendo de ideólogo, diseñando 6 pcb's en dos meses, etc. Para principios del año que viene, quizás. :? 8O
Beamspot.

Juanjo
Usuario Experto
Usuario Experto
Posts: 451
Joined: Sun Dec 17, 2006 9:44 pm
Contact:

Re: Proyecto: Controlador de posición

Post by Juanjo » Mon Sep 24, 2012 6:28 pm

Desde hace dos años empecé con los ARMs, para un proyecto de un cliente, concretamente con un ARM9 con Ethernet, demasido grande en cuanto a todo, vamos podría ser el nucleo de un ordenador de hace unos cuantos años.

A partir de ahí hemos seguido con los ARMv7, concretamente los cortexM3 y con micros de ST. Una de las cosas que más han acabado por gustarme es la versatilidad de los puertos, prácticamente puedes configurar en cualquier pin lo que quieras (casi, hay restricciones, sobre todo para los interfaces, solo tienes algunas opciones, lógico). Esto da un grado de libertad a la hora de diseñar el hardware, con decir que más de una vez me ha librado de volver a hacer el PCB. Aunque tengo que decir que inicialmente es complejo y tedioso.

Lo del vector de interrupcciones (NVIC) es una caña, te permite crear un bootloader en la misma FLASH de programa, aunque el propio micro ya trae opciones para ello por USB, RS-232, etc, pero si conectas un MODEM GPRS esas opciones no sirven. Una de las cosas que no me gusta es que no hay EEPROM de datos y tienes que usar la FALSH, teniendo que escribir y borrar páginas para guardar datos o una externa.

Otras de las cosas que más me gustan es el CLOCK, con un oscilador externo de 8 MHz y el PLL puedes subir a 72 MHz (14 nS). Y sobre todo la de poder configurar distintos frecuencias de CLOCK según el periferico, etc, muy bueno.

Y lo que menos me gusta es el precio, para un Cortex M3, con CAN y demás perifericos está del orden de 2 a 3 € para cantidades, en Farnell seguro que vale 5 ó 7 €. Pero bueno es mucho micro para decirle que te lo dejen a 1 €.

Lo recomiendo, eso si, se necesita tiempo para dominar la arquitectura y trabajar con ellos. Si alguien tienen pensado utilizarlo en plan rápido, se lo desaconsejo, es bastante complejo.

Si alguien ha leído hasta aquí disculpas por el tocho y espero que algunas observaciones le sirvan a alguien.

Saludos.

PD: Se me olvidaba, gracias al informático que me ha acompañado en estos temas, que si no solo no se si habría podido sacarle el potencial que tienen estos micros.
Sytek

User avatar
Ave_Fenix
Usuario Avanzado
Usuario Avanzado
Posts: 205
Joined: Thu Jan 22, 2009 8:29 pm

Re: Proyecto: Controlador de posición

Post by Ave_Fenix » Mon Sep 24, 2012 8:11 pm

Yo con Cortex llevo algún que otro año también.
Uso sobre todo la STM32H103 y 107, aunque ahora tengo pedidas varias Cortex-M4 que salieron hace días a 8€ en la puerta de casa :D

Yo sólo tengo que decir, que no me pareció complejo, o al menos no más que los AVR. Utilizo CooCox para programarlo, el cual tiene todas las librerías y ejemplos prácticos.
Se programa como siempre. Lo único complejo que veo, es el tener bien claro cómo configurar bien los diferentes puertos, periféricos y demás... pero para eso están los ejemplos que trae el propio Coocox :wink:

Bien es cierto que cada fabricante usa sus propias librerías, y aunque CooCox tiene unas librerías estándar, yo siempre uso las del fabricante para evitarme dolores de cabeza en posible "bugs". En ST lo tienes todo bastante mascado.

Entiendo que no es nivel Lego, o Arduino, pero tampoco me pareció más complejo que otros micros (opinión personal, claro).

Ranganok
Usuario Desarrollador
Usuario Desarrollador
Posts: 3874
Joined: Mon Nov 07, 2005 3:10 pm
Location: Barbaros del Valle
Contact:

Re: Proyecto: Controlador de posición

Post by Ranganok » Tue Sep 25, 2012 8:15 am

Hola,

Este proyecto lo terminaré con pic, en parte porque tengo mucho trabajo hecho, en parte porque es de diseño electrónico. Pero las librerías, como las voy ha hacer en C serán fácilmente adaptables a cualquier otro micro.

Dos cosas: alguna idea de cómo y dónde crear un repositorio para el código?
Y por otro lado, los que ya habéis utilizado ARM, podríais hacer un tutorial desde 0 para los que no sabemos por dónde empezar?

Los esquemas los pondré en breve.

S2

Ranganok Schahzaman
skiras.blogspot.com

"En igualdad de condiciones la explicación más sencilla es la cierta"

User avatar
Ave_Fenix
Usuario Avanzado
Usuario Avanzado
Posts: 205
Joined: Thu Jan 22, 2009 8:29 pm

Re: Proyecto: Controlador de posición

Post by Ave_Fenix » Wed Sep 26, 2012 9:41 am

Aunque las librerías difieres mucho entre fabricantes, te dejo un ejemplo sencillo que he hecho para STM32-H103 (olimex).

Code: Select all

/**
  *****************************************************************************
  * @title   Simple
  * @author  Luisón
  * @date    26 Sep 2012 - 26 Sep 2012
  * @email	 theinit@yahoo.es
  * @brief	 Programa sencillo que responde con un eco por el puerto serie y
  *			 enciende o apaga un led cada vez que se pulsa un botón. Está todo
  *			 en base a interrupciones. Programado para la placa STM32-H103
  *
  *
  *****************************************************************************
  */


#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_usart.h"
#include "misc.h"

#define LED_ST_PORT GPIOC
#define LED_ST_PIN GPIO_Pin_12

#define BOTON1_PORT GPIOA
#define BOTON1_PIN GPIO_Pin_0

#define SERIAL_PORT GPIOA
#define RX_PIN GPIO_Pin_10
#define TX_PIN GPIO_Pin_9

//***************************************************************************
//
// Variables globales
//
// **************************************************************************
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;

//***************************************************************************
//
// Declaro las funciones
//
// **************************************************************************
void FLIP_PIN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void SetupEXTI(void);

void SetupUSART(void);
void USARTxSend(USART_TypeDef* USARTx, const unsigned char *pucBuffer, unsigned long ulCount);

void EXTI0_IRQHandler(void);

void USART1_IRQHandler(void);


int main(void)
{

    //
    // Configuro los relojes del sistema
    //
    RCC_Configuration();

    //
    // Configuro el vector NVIC
    //
    NVIC_Configuration();

    //
    // Configuro los puertos GPIO
    //
    GPIO_Configuration();

    //
    // Configurar el puerto serie 1 (USART1)
    //
    SetupUSART();

    //
    // Configurar la interrupción externa (EXTI0)
    //
    SetupEXTI();

    while (1)
    {

    }
}


//***************************************************************************
//
//Configura los diferentes relojes del sistema.
//
// **************************************************************************
void RCC_Configuration(void)
{
	// 1. Clocking the controller from internal HSI RC (8 MHz)
	RCC_HSICmd(ENABLE);
	// wait until the HSI is ready
	while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
	RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
	// 2. Enable ext. high frequency OSC
	RCC_HSEConfig(RCC_HSE_ON);
	// wait until the HSE is ready
	while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
	// 3. Init PLL
	RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); // 72MHz en mi caso
	RCC_PLLCmd(ENABLE);
	// wait until the PLL is ready
	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
	// 4. Set system clock dividers
	RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);
	RCC_PCLK2Config(RCC_HCLK_Div1);
	RCC_PCLK1Config(RCC_HCLK_Div2);
	RCC_HCLKConfig(RCC_SYSCLK_Div1);
	// 5. Clock system from PLL
	RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


    //
    // Habilito el reloj en los puertos que utilizo y el AFIO clock
    //
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
}

//***************************************************************************
//
//Configura los diferentes puertos GPIO.
//
//***************************************************************************
void GPIO_Configuration(void)
{
	/* Configuro PA0 como puerto de entrada */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* ConfiguroUSART1 Tx (PA.09)*/
	GPIO_InitStructure.GPIO_Pin = TX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* Configuro USART1 Rx (PA.10) */
	GPIO_InitStructure.GPIO_Pin = RX_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//***************************************************************************
//
//Configura "the nested vectored interrupt controller"
//
//***************************************************************************
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    //
    // Set the Vector Table base location at 0x08000000
    //
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

    //
    // Configure one bit for preemption priority
    //
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

    //
    // Habilito la interrupción EXTI0 (con menos prioridad que el puerto serie)
    //

	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    //
    // Habilito la interrupción del puerto Serie
    //

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

void SetupEXTI(void)
{
	//
    // Conecto EXTI Line0 to PA0
    //
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);


    //
    // Configuro EXTI Line0 para generar una interrupción cada vez que se pulsa
    //
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);


}

void SetupUSART(void)
{
      USART_InitTypeDef USART_InitStructure;

      USART_InitStructure.USART_BaudRate            = 460800;
      USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
      USART_InitStructure.USART_StopBits            = USART_StopBits_1;
      USART_InitStructure.USART_Parity              = USART_Parity_No ;
      USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
      USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;

      	  /* USART Peripheral Enable */
      USART_Cmd(USART1, ENABLE);
      	  /* Apply USART configuration */
      USART_Init(USART1, &USART_InitStructure);
      	  /* Enable RX interrupt */
      USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}

void USARTxSend(USART_TypeDef* USARTx, const unsigned char *pucBuffer, unsigned long ulCount)
{
    //
    // Mientras haya algo que enviar...
    //
    while(ulCount--)
    {
    	while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);	//Espera a que el USARTx esté libre, si se pone después del
    								        //envío (como en ejemplos) se pierde el primer carácter enviado
        USART_SendData(USARTx, (uint16_t) *pucBuffer++);
    }
}



//**************************************************************************
//
//Función que cambia el estado de un pin.
//
//**************************************************************************

void FLIP_PIN(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
	GPIOx->ODR ^= GPIO_Pin;
}


//**************************************************************************
//
//Manejo de interrupciones.
//
//**************************************************************************
void EXTI0_IRQHandler(void)
{
	FLIP_PIN(LED_ST_PORT,LED_ST_PIN);
    EXTI_ClearITPendingBit(EXTI_Line0);
}

void USART1_IRQHandler(void)
{
    if ((USART1->SR & USART_FLAG_RXNE) != (u16)RESET)
	{
          unsigned char caracter[] = " ";
    	  caracter[0] = USART_ReceiveData(USART1);

          USARTxSend(USART1, caracter, 1);
	}
}



Ranganok
Usuario Desarrollador
Usuario Desarrollador
Posts: 3874
Joined: Mon Nov 07, 2005 3:10 pm
Location: Barbaros del Valle
Contact:

Re: Proyecto: Controlador de posición

Post by Ranganok » Thu Sep 27, 2012 9:09 am

Gracias, lo apunto como plantilla para los ST.

S2

Ranganok Schahzaman
skiras.blogspot.com

"En igualdad de condiciones la explicación más sencilla es la cierta"

User avatar
beamspot
Usuario Desarrollador
Usuario Desarrollador
Posts: 1132
Joined: Thu Oct 11, 2007 8:56 pm
Nombre: Guillem

Re: Proyecto: Controlador de posición

Post by beamspot » Thu Sep 27, 2012 7:33 pm

¿Por casualidad te has pasado por CooCox.org? Allí tienen muchas cosas, como librerías, ejemplos, IDE gratuito, RTOS, incluso proyectos compartidos. Como muchos, perderás algo de tu valioso tiempo, aunque no creo que sea un desperdicio.
Beamspot.

Ranganok
Usuario Desarrollador
Usuario Desarrollador
Posts: 3874
Joined: Mon Nov 07, 2005 3:10 pm
Location: Barbaros del Valle
Contact:

Re: Proyecto: Controlador de posición

Post by Ranganok » Mon Oct 22, 2012 11:17 am

Estaba buscando un cubo o unos ejes (gráficos en 3D) para C#, tipo lo que me ha pasado sistemasorp en http://foro.webdearde.com/viewtopic.php ... 316#p39316" onclick="window.open(this.href);return false; . Lo que quiero hacer es pasarle las medidas de los sensores vía serie o RF y probar distintos algoritmos en el PC:
- Directo.
- Filtros complementarios.
- Kalman.
- DCM (creo que este es sólo para corregir no para estimar el ángulo, pero me lo tengo que estudiar a fondo todavía).
- AHRS

De esta forma se podrá ver la mejor opción (coste/beneficio) para implementarla en el procesador.

S2

Ranganok Schahzaman

PD: He realizado un pequeño post para ver el funcionamiento de los filtros complementarios (por si alguien quiere hecharle un vistazo): http://skiras.blogspot.com.es/2012/10/4 ... res-i.html" onclick="window.open(this.href);return false;
skiras.blogspot.com

"En igualdad de condiciones la explicación más sencilla es la cierta"

User avatar
Ave_Fenix
Usuario Avanzado
Usuario Avanzado
Posts: 205
Joined: Thu Jan 22, 2009 8:29 pm

Re: Proyecto: Controlador de posición

Post by Ave_Fenix » Mon Oct 22, 2012 3:04 pm

Si estás intentando calcular la posición exacta de tu placa en 3D, no sólo en un eje, ya puedes ir descartando :
- Directo
- Filtros complementarios

Ya que esos NO sirven. En cuanto tienes un movimiento en 3D, el ángulo de un eje depende del giro de otro eje y del estado anterior, con lo que el cambio de ángulo que te da el giro es absolutamente inservible, lo mismo para los demás, los cuales ni se enterarán de ciertos giros.

Sobre Kalman, ahora mismo no me acuerdo, pero creo recordar que era sólo un Filtro, no estoy 100% seguro, desde luego no es el que se usa. Y si se usa era para filtrar la señal y meterla en el DCM más limpia (y no hace falta).
Lo que debes usar es DCM, el cual, a pesar de lo que comentas, sí estima el ángulo, es el único que lo hace, de hecho.

Hace un año o más, puse por aquí un vídeo mio de lo que quieres hacer pero hecho en Java para poder ser exportado a todas las plataformas, lo digo porque seguramente me preguntes si hablo sólo desde la teoría o si he hecho el proyecto :wink:

El DCM es un proyecto bien bonito, ¡ánimo!!

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest