
http://www.bipedolandia.es Bipedolandia,100% Spain sobre robots bípedos, Robonova, KONDO KHR-2HV, Nao, MechRC, Bioloid, Robobuilder, Kumotek KT-X, RoboPhilo, i-Sobot, Manoi AT01, Robovie-M V3, PLEN, BasicX, SCC32, Lynxmotion |
| Mayo 2012 | | Lun | Mar | Miér | Jue | Vie | Sáb | Dom |
|---|
| | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 10 | 11 | 12 | 13 | | 14 | 15 | 16 | 17 | 18 | 19 | 20 | | 21 | 22 | 23 | 24 | 25 | 26 | 27 | | 28 | 29 | 30 | 31 | | | | Calendario |
|
| | |
| Autor | Mensaje |
|---|
Luison Almirante


Cantidad de envíos: 2147 Edad: 25 Localización: Bilbao Puntos: 1953 Fecha de inscripción: 06/09/2008
 | Tema: Re: Cortex-M3 2012-02-02, 19:19 | |
| Ambos trabajan en 50Hz, peeero el rango no es el mismo y no sabría decirte cual es el exacto en ambos. El genérico efectivamente es de 500 a 2500 us, pero luego cada fabricante y cada modelo dentro del fabricante es diferente. Yo lo que hago es un programa que vaya de 1500 a 2500 cada vez que pulso un botón, o cada segundo, en saltos de 50. Y lo mismo a la inversa. Ves cuál es el rango máximo en el que se ha movido el servo sin parecer "forzado", le das un pequeño margen de 50 y asunto arreglado |
|  | | rcardt Almirante


Cantidad de envíos: 281 Localización: Barcelona Puntos: 292 Fecha de inscripción: 15/08/2009
 | Tema: Re: Cortex-M3 2012-02-02, 19:25 | |
| | Luison escribió: | Ambos trabajan en 50Hz, peeero el rango no es el mismo y no sabría decirte cual es el exacto en ambos.
El genérico efectivamente es de 500 a 2500 us, pero luego cada fabricante y cada modelo dentro del fabricante es diferente. Yo lo que hago es un programa que vaya de 1500 a 2500 cada vez que pulso un botón, o cada segundo, en saltos de 50. Y lo mismo a la inversa. Ves cuál es el rango máximo en el que se ha movido el servo sin parecer "forzado", le das un pequeño margen de 50 y asunto arreglado |
No es mala idea, pero porque probar de 1500 a 2500, y no de 500 a 2500, si me paso del rango, oiré el ruido de que me he pasado y ya tendré el rando, no |
|  | | Luison Almirante


Cantidad de envíos: 2147 Edad: 25 Localización: Bilbao Puntos: 1953 Fecha de inscripción: 06/09/2008
 | Tema: Re: Cortex-M3 2012-02-02, 19:37 | |
| | rcardt escribió: | | Luison escribió: | Ambos trabajan en 50Hz, peeero el rango no es el mismo y no sabría decirte cual es el exacto en ambos.
El genérico efectivamente es de 500 a 2500 us, pero luego cada fabricante y cada modelo dentro del fabricante es diferente. Yo lo que hago es un programa que vaya de 1500 a 2500 cada vez que pulso un botón, o cada segundo, en saltos de 50. Y lo mismo a la inversa. Ves cuál es el rango máximo en el que se ha movido el servo sin parecer "forzado", le das un pequeño margen de 50 y asunto arreglado |
No es mala idea, pero porque probar de 1500 a 2500, y no de 500 a 2500, si me paso del rango, oiré el ruido de que me he pasado y ya tendré el rando, no |
Bueno, para andar con cuidado y no pasarte en exceso, con las posibles consecuencias que eso podría tener... |
|  | | rcardt Almirante


Cantidad de envíos: 281 Localización: Barcelona Puntos: 292 Fecha de inscripción: 15/08/2009
 | |  | | Luison Almirante


Cantidad de envíos: 2147 Edad: 25 Localización: Bilbao Puntos: 1953 Fecha de inscripción: 06/09/2008
 | Tema: Re: Cortex-M3 2012-02-02, 19:51 | |
| | rcardt escribió: | | Luison escribió: |
Bueno, para andar con cuidado y no pasarte en exceso, con las posibles consecuencias que eso podría tener... |
Bien, tu tienes mas experiencia, así que aplicaré esos rangos de trabajo, y luego ya veremos. Supongo que conoces los límites de maniobrabilidad de cada extremidad y no ves necesario alargar tanto los grados de los servos. Me aplico el consejo, gracias crack. |
Generalmente dan cerca de 180º de libertad, así que no hay por qué forzar por norma general.
Pero vamos, que igual te interesa en cierto momento estar más ajustado, eso se tendrá que ver en cada situación, yo sólo digo lo que yo hago |
|  | | rcardt Almirante


Cantidad de envíos: 281 Localización: Barcelona Puntos: 292 Fecha de inscripción: 15/08/2009
 | Tema: Re: Cortex-M3 2012-02-04, 23:17 | |
| Para ir comenzando, he encontrado este tutorial para la placa: [Tienes que estar registrado y conectado para ver este vínculo]Tenemos un ejemplo para mover un par de servos a tres de sus posiciones,de una manera muy descriptiva, así que ya tenemos por donde comenzar. |
|  | | Luison Almirante


Cantidad de envíos: 2147 Edad: 25 Localización: Bilbao Puntos: 1953 Fecha de inscripción: 06/09/2008
 | |  | | rcardt Almirante


Cantidad de envíos: 281 Localización: Barcelona Puntos: 292 Fecha de inscripción: 15/08/2009
 | Tema: Re: Cortex-M3 2012-02-07, 20:44 | |
| | Luison escribió: |
Si en el propio Coocox, si vas a timmer verás un ejemplo también perfectamente válido... y compatible con coocox. Ese código creo que usa funciones no compatibles, aunque no estoy 100% seguro.
Aún así, para comprender el funcionamiento, no está nada mal. |
Una cosa campeón, podrías decirme k es lo que hace el ejemplo de Timer que hay en coocox y que me comentas, mueve algún servo o algo así?? |
|  | | Luison Almirante


Cantidad de envíos: 2147 Edad: 25 Localización: Bilbao Puntos: 1953 Fecha de inscripción: 06/09/2008
 | Tema: Re: Cortex-M3 2012-02-07, 21:32 | |
| | rcardt escribió: | | Luison escribió: |
Si en el propio Coocox, si vas a timmer verás un ejemplo también perfectamente válido... y compatible con coocox. Ese código creo que usa funciones no compatibles, aunque no estoy 100% seguro.
Aún así, para comprender el funcionamiento, no está nada mal. |
Una cosa campeón, podrías decirme k es lo que hace el ejemplo de Timer que hay en coocox y que me comentas, mueve algún servo o algo así?? |
Al añadir la librería TIM a tu proyecto, verás que te aparece un ejemplo para utilizar el timer de tu cortex.
En el ejemplo de coocox se genera un cuádruple PWM con un timer si mal no recuerdo (PWM genérico, no concretamente el de servo). Se pueden generar 4 PWM con cada timer, que es lo que hace en el ejemplo como he dicho. Si usas del timer 2 al 5 sacas 16 PWM. Con lo que para obtener hasta 32 PWM, tienes que generar primero 16, reconfigurar los timer y generar los otros 16. Habrá un retraso de 2-3 ms entre un grupo de PWMs y el otro... lo que no es ningún drama
No sé si me he explicado bien. Configuras 4 timers para que genere 4 PWMs cada uno y así conseguimos 16PWM. Los arrancamos, pero tras 2.5ms (ya habrá realizado los 16 PWMs el ciclo en alto), reconfiguramos los timer para que ahora generen los otros 16PWM en las otras 16 salidas de servomotor que tengamos reservadas. Cuando pasen 17.5ms desde la segunda reconfiguración, o 20 ms desde al primera (es lo mismo). Se vuelve a reconfigurar los timer para que saque de nuevo los primerso 16 PWM en las primeras 16 posiciones.
Evidentemente, si tienes menos servomotores pues en la "segunda" ronda se generan menos PWM o lo que necesites. |
|  | | rcardt Almirante


Cantidad de envíos: 281 Localización: Barcelona Puntos: 292 Fecha de inscripción: 15/08/2009
 | Tema: Re: Cortex-M3 2012-02-07, 21:41 | |
| Recuerda por que pines sacaba las cuatro 4 PWMs,... sino ya lo miraré mañana, ya que este ejemplo esta muy currado también. |
|  | | Luison Almirante


Cantidad de envíos: 2147 Edad: 25 Localización: Bilbao Puntos: 1953 Fecha de inscripción: 06/09/2008
 | Tema: Re: Cortex-M3 2012-02-07, 21:59 | |
| | rcardt escribió: | Recuerda por que pines sacaba las cuatro 4 PWMs,... sino ya lo miraré mañana, ya que este ejemplo esta muy currado también. |
Del 6 al 9 del puerto C. Pero vamos, usa el que más rabia te de |
|  | | rcardt Almirante


Cantidad de envíos: 281 Localización: Barcelona Puntos: 292 Fecha de inscripción: 15/08/2009
 | Tema: Re: Cortex-M3 2012-02-08, 21:12 | |
| Venga Luis, échame una mano con el código pleasee. | Código: | /** ************************************************************* * @brief TIM_PWMOutput ************************************************************* */
#include "stm32f10x.h" #include "stm32f10x_tim.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h"
/* Variables */ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t CCR1_Val = 1000; uint16_t CCR2_Val = 1500; uint16_t CCR3_Val = 2000; uint16_t CCR4_Val = 2500; uint16_t PrescalerValue = 0;
/* Funciones */ void RCC_Configuration(void); void GPIO_Configuration(void);
int main(void) { TIM_PWMOutput(); }
void TIM_PWMOutput(void) { RCC_Configuration(); /* Configuración sistema de relojes */ GPIO_Configuration(); /* GPIO Configuración */
/* Calculo valor prescalado */ PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; /* Tiempo base configuraciÛn */ TIM_TimeBaseStructure.TIM_Period = 665; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* PWM1 Modo configuración: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Modo configuraciÛn: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Modo configuraciÛn: Channel3 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
/* PWM1 Modo configuraciÛn: Channel4 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/* Habilitado contador TIM3 */ TIM_Cmd(TIM3, ENABLE);
while (1) {} }
void RCC_Configuration(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* Habilito reloj TIM3 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); /* Habilito reloj GPIOA,B y C */ }
void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;
/*GPIOB ConfiguraciÛn: TIM3 channel1, 2, 3 and 4 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /*Pines como salidas Push-Pull*/ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
}
|
He cojido el código de muestra y lo he limpiado un poco de comentariosl. Por lo que puedo apreciar, se declaran cuatro posiciones, las cuales yo he modificado para los servos, a 1000,1500, 2000 y 2500, supongo que están los valores correctos. Las funciones: void RCC_Configuration(void); /* Habilitar relojes*/ void GPIO_Configuration(void); /* GPIO, configuración salida TIM3 canales 1, 2, 3, 4*/ Las entiendo perfectamente,... pero gran parte de la función TIM_PWMOutput() no la entiendo, me pierdo en: /* Calculo valor prescalado */ PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; /* Tiempo base configuraciÛn */ TIM_TimeBaseStructure.TIM_Period = 665; TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; Para el prescalado de los servos, tengo que tocar los valores o así ya están correctos. Y por otro lado, supongo que tendré que colocar entre los bloques el retardo de 20ms: for (i=0;i<20000;i++); Ya ves que estoy un poco, por no decir muy perdido.
|
|  | | Luison Almirante


Cantidad de envíos: 2147 Edad: 25 Localización: Bilbao Puntos: 1953 Fecha de inscripción: 06/09/2008
 | Tema: Re: Cortex-M3 2012-02-08, 22:42 | |
| Bueno, ya te dije hace tiempo que los ejemplos se hacen con los leds de la placa, no directamente con los servomotores. Bien, en el ejemplo la placa corre a 24MHz, con lo que SystemCoreClock es 24.000.000, si se quiere sacar una precisión máxima... el prescaler se calcula dividiendo entre 24 millones, y así cada hercio de la CPU genera un cambio en el timer En tu caso, necesitas una precisión de microsegundos. Con lo que en tu caso será: PrescalerValue = (uint16_t) (72000000/1000000)-1; TIM_TimeBaseStructure.TIM_Period = 665; En la línea anterior, se declara el periodo del timer, en tu caso al haber puesto que el timer cambie cada microsegundo y como quieres que dure 20ms=20000us, pues lo tienes bien fácil: TIM_TimeBaseStructure.TIM_Period = 20000; //Ojo que este valor tiene un máximo, creo que son 16bits (aprox 64.000). Bien, ahora tienes declarado que el valor del timer se actualiza cada microsegundo, y además tienes puesto que cada 20.000 cambios del timer, osea, cada 20ms, el timer se reinicializa a cero y empieza de nuevo a contar. Perfecto, ahora con tus valores de CCRX_Val debería de funcionar Eso sí, YO te aconsejo que hagas el ejemplo con los leds y modifiques el timer para que funcione cada cuatro, cada segundo y cada 0.5 segundos, y así ves con tus propios ojos y cronómetro en mano, que efectivamente lo tienes todo bien configurado, y que sabes cómo funciona |
|  | | rcardt Almirante


Cantidad de envíos: 281 Localización: Barcelona Puntos: 292 Fecha de inscripción: 15/08/2009
 | Tema: Re: Cortex-M3 2012-02-09, 07:23 | |
| Explicación entendida,... creo que el tema prescalado y timers tengo que machacarlo mas  . Muchas gracias por tan clara coprensión. Me pondré con los leds como dices para hacer las pruebas, pero me interesaba saber la configuración para los servos, sobretodo para entenderlo un poco mejor. Entre las modificaciones de soldado de la placa y demas cosas, no me da mucho tiempo para el código; este finde pasaré la imágen de como he dejado la placa definitivamente. Nos leemos. |
|  | | Luison Almirante


Cantidad de envíos: 2147 Edad: 25 Localización: Bilbao Puntos: 1953 Fecha de inscripción: 06/09/2008
 | Tema: Re: Cortex-M3 2012-02-09, 08:33 | |
| | rcardt escribió: | Explicación entendida,... creo que el tema prescalado y timers tengo que machacarlo mas . Muchas gracias por tan clara coprensión. Me pondré con los leds como dices para hacer las pruebas, pero me interesaba saber la configuración para los servos, sobretodo para entenderlo un poco mejor. Entre las modificaciones de soldado de la placa y demas cosas, no me da mucho tiempo para el código; este finde pasaré la imágen de como he dejado la placa definitivamente. Nos leemos.
|
TRAMPA!!! Si te lo digo no aprendes. Mejor intenta comprenderlo y pon lo que tú crees que debería de ser
NOTA: Los timer corren a la velocidad del microcontrolador, osea, en tu caso el timer se incrementería 72 millones de veces cada segundo... Bien, eso es mucho, de ahí que exista un Prescaler y un clock división.
En los ejemplos que hemos visto, sólo hemos tocado el prescaler, pero también se puede tocar el clock división (generalmente el cock división sólo puede tomar unos valores específicos).
Si tu prescaler vale 10 y tu clock división 16, tu timer incrementará su valor cada 10*16=160 hercios de tu placa.
Pero lo dicho, en tu caso puedes dejar el clock división a cero y así sólo utilizar el prescaler |
|  | | |
| | Permiso de este foro: | No puedes responder a temas en este foro.
| |
| |
| |
|