collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: STM32 Stepper Driver firmware  (Lida 3821 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

StarRider

  • Visitante
STM32 Stepper Driver firmware
« em: 04 de Agosto de 2013, 23:27 »
Boas,

Já tinha prometido isto vai para largos meses ao metRo_ , mas acabei por nunca colocar na totalidade aqui no
forum pois o código é usado em vários projecto e tem muitas interdependências com os mesmos, o que o torna
problemático de separar do resto dos projectos, alem das questões de copyright.

Assim, acabei por implementar um driver independente, totalmente autónomo que pode ser muito facilmente
incluído em qualquer outro projecto, fácil de configurar ao hardware e fácil de usar (penso eu) e que está
razoavelmente encapsulado para evitar grandes complicações.

Foi pensado, e implementado, para correr em MCUs STM32 mas pode ser facilmente alterado para correr em
qualquer outro MCU, o código é 100% C99 compatível por isso é facilmente compilado por qualquer toolchain.
Eu uso o Keil, podem efectuar o download deste na versão "free" que dá para pequenos projectos e para teste.

Algumas características:
 - STM32Fx compatível (usa "StdPeriph Lib" da ST - não testado com o STM32F0xx)
 - Funciona com stepper ICs que usam a interface SD (translator, ou com inputs "Step" e "Dir")
 - Controla 2 motores totalmente independentes
 - Rampa de aceleração e desaceleração configurável e independente para cada motor (um pode estar a
acelerar e o outro a desacelerar)
-  Velocidades de 2 a 1000 passos por segundo (pode ser alterado)
-  Velocidade constante (Move) ou posicionamento (Goto) independente e simultânea para os dois motores
 - Contador com a posição actual do motor (respeita a direcção dos movimentos)
 - Direcção CW (clockwise) ou CCW (counterclockwise )
 - Usa somente um TIMER (TIMER3, pode ser alterado)
 - Permite assignar qualquer pino IO para DIR e STEP
 - E mais umas cenas ...

O "source", e um projecto de exemplo para o Keil, estão em anexo.
Espero que seja útil, qualquer duvida "postem" aqui no forum enviem um email para o endereço que está nos
ficheiros do source.

Abraços,
PA
« Última modificação: 05 de Agosto de 2013, 01:48 por StarRider »

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: STM32 Stepper Driver firmware
« Responder #1 em: 05 de Agosto de 2013, 00:11 »
Ainda hoje me lembrei disto :p Vou analisar nos próximos dias, muito obrigado :)

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: STM32 Stepper Driver firmware
« Responder #2 em: 05 de Agosto de 2013, 15:43 »
Não estou a conseguir abrir o ficheiro, dá erro de ficheiro :s Podes comprimir noutro formato?

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: STM32 Stepper Driver firmware
« Responder #3 em: 28 de Agosto de 2013, 11:59 »
[strike]Não estou a perceber o periodo que defines aqui.
Do que sei de timers para criar uma onda com uma freq_pretendida no output channel usaria algo do genero:

TIM_TimeBaseStructure.TIM_Period = (SystemCoreClock/(freq_pretendida*2)) - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 0;

Será que poderias aprofundar um bocadinho esta parte?[/strike]

Já percebi :)

Código: [Seleccione]
//--- TIMx Configuration: Output Compare Timing Mode -----------------------
// TIM3 input clock (TIM3CLK) is set to 2 * APB1 clock (PCLK1), since APB1 prescaler is different from 1.   
// TIM3CLK = 2 * PCLK1 
// PCLK1 = HCLK / 4
// => TIM3CLK = 2 * (HCLK / 4) = HCLK / 2 = SystemCoreClock / 2
//
// Para um "TIMx counter clock" de 100KHz (exemplo com resolução de 10uS) o "Prescaler" deve ser calculado assim:
// Prescaler = (uint16_t) (TIMxCLK / 100000) - 1;
//
// O "Period" neste caso não interessa pois a IRQ (TIMx_IRQHandler) dos CCR (capture/compare register) controla o
// togles dos estados HiGH e LOW dos PINs do STEP
//
// A resolução do sistema é definida em "stm32f_stpdrv.h" no define STPDRV_TIMFREQ
//
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) ((SystemCoreClock / 2) / (STPDRV_TIMFREQ * 2)) - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;
TIM_TimeBaseInit(STPDRV_TIM, &TIM_TimeBaseStructure);
TIM_UpdateDisableConfig(STPDRV_TIM, ENABLE);  // deve ser ENABLE pois para desactiver o Update Event o bit deve ser 1
/* Prescaler configuration */
//TIM_PrescalerConfig(STPDRV_TIM, PrescalerValue, TIM_PSCReloadMode_Immediate);

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: STM32 Stepper Driver firmware
« Responder #4 em: 10 de Setembro de 2013, 23:40 »
#define STPDRV_MAXSETPSEC     1000     // maximo de steps/sec, deve satisfazer a condição: STPDRV_TIMFREQ / STPDRV_MAXSETPSEC > 100

Não percebo esta limitação :s

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: STM32 Stepper Driver firmware
« Responder #5 em: 15 de Setembro de 2013, 23:56 »
Num stm32f1 tive que alterar a frequencia para 10khz, 100khz é mt para os 24mhz dele :s consegui ter uma onda de 2khz quando selecionado 1000 steps por segundo mas isto nao respeita a  a indicação de que o max steps devia ser freq/maxsteps > 100.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: STM32 Stepper Driver firmware
« Responder #6 em: 05 de Outubro de 2013, 13:10 »
Num stm32f1 tive que alterar a frequencia para 10khz, 100khz é mt para os 24mhz dele :s consegui ter uma onda de 2khz quando selecionado 1000 steps por segundo mas isto nao respeita a  a indicação de que o max steps devia ser freq/maxsteps > 100.

Afinal acho que era meu o problema, devia ter registos com valores antigos depois de fazer um reset completo consegui usar o codigo com os 100khz :)