标题:
STM32单片机步进电机S型加减速算法
[打印本页]
作者:
zpwgf
时间:
2022-11-16 13:22
标题:
STM32单片机步进电机S型加减速算法
/*********************************************************************************************/
【*】 程序简介
-工程名称:步进电机-S形加减速实现定长移动
-实验平台: 野火STM32 F407 开发板
-MDK版本:5.30
-ST固件库版本:1.8.0
【 !】功能简介:
实现步进电机-S形加减速的控制
【 !】实验操作:
下载本程序,复位开发板即可。
【 !!】注意事项:
步进电机驱动器使用32细分,加减速函数入口参数和定时器TIM_PRESCALER值
不一定适合所有电机和所有场景,需要根据实际需求调整,入口参数最重要,
其次是TIM_PRESCALER值,42步进电机建议用TIM_PRSCALER为2,57步进电机建
议用TIM_PRSCALER为24,86步进电机建议用TIM_PRSCALER为24。
/*********************************************************************************************/
串口(TTL-USB TO UART):
CH340的收发引脚与STM32的发收引脚相连。
RX<--->PB6
TX<--->PB7a
步进电机驱动器接口1:
PUL+<--->VCOM
PUL-<--->PI5
DIR+<--->VCOM
DIR-<--->PE1
ENA+<--->VCOM
ENA-<--->PE0
/*********************************************************************************************/
【*】 时钟
A.晶振:
-外部高速晶振:25MHz
-RTC晶振:32.768KHz
B.各总线运行时钟:
-系统时钟 = SYCCLK = AHB1 = 168MHz
-APB2 = 84MHz
-APB1 = 42MHz
C.浮点运算单元:
不使用
/*********************************************************************************************/
【*】 版本
-程序版本:1.0
/*********************************************************************************************/
【*】 参考
野火STM32电机驱动
/*********************************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx.h"
#include "./usart/bsp_debug_usart.h"
#include "./stepper/bsp_stepper_S_speed.h"
#include "./stepper/bsp_stepper_init.h"
#include "./led/bsp_led.h"
#include "./key/bsp_key.h"
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
HAL_Init();
HAL_InitTick(0);
/* 初始化系统时钟为168MHz */
SystemClock_Config();
/* 按键初始化 */
Key_GPIO_Config();
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
DEBUG_USART_Config();
printf("欢迎使用野火 电机开发板 步进电机S形加减速定长移动——单轴 例程\r\n");
printf("按下按键1 按键2 可开始加减速演示\r\n");
/*步进电机初始化*/
stepper_Init();
while (1)
{
if(Key_Scan(KEY1_GPIO_PORT, KEY1_PIN) == KEY_ON)
{
for(uint8_t i = 0; i < 6; i++)
{
Stepper_Move_S(60, 1784, 0.1f, 5 * SPR);
while(Stepper.status != STOP);
HAL_Delay(10);
Stepper_Move_S(60, 1784, 0.1f, -5 * SPR);
while(Stepper.status != STOP);
HAL_Delay(10);
}
}
if(Key_Scan(KEY2_GPIO_PORT, KEY2_PIN) == KEY_ON)
{
Stepper_Move_S(60, 1500, 0.28f, 30 * SPR);
}
}
}
/**
* @brief System Clock Configuration
* The system Clock is configured as follow :
* System Clock source = PLL (HSE)
* SYSCLK(Hz) = 168000000
* HCLK(Hz) = 168000000
* AHB Prescaler = 1
* APB1 Prescaler = 4
* APB2 Prescaler = 2
* HSE Frequency(Hz) = 8000000
* PLL_M = 25
* PLL_N = 336
* PLL_P = 2
* PLL_Q = 7
* VDD(V) = 3.3
* Main regulator output voltage = Scale1 mode
* Flash Latency(WS) = 5
* @param None
* @retval None
*/
void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
/* Enable Power Control clock */
__HAL_RCC_PWR_CLK_ENABLE();
/* The voltage scaling allows optimizing the power consumption when the device is
clocked below the maximum system frequency, to update the voltage scaling value
regarding system frequency refer to product datasheet. */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/* Enable HSE Oscillator and activate PLL with HSE as source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
while(1) {};
}
/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
while(1) {};
}
/* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported */
if (HAL_GetREVID() == 0x1001)
{
/* Enable the Flash prefetch */
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
}
}
复制代码
Keil代码下载(附件内只含代码,不含其他任何文件):
代码.7z
(966.6 KB, 下载次数: 35)
2022-11-16 16:13 上传
点击文件名下载附件
步进电机算法
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1