步进电机位置速度双环控制实现
野火stm32电机教学
提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili
PID模型
位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速度)和实际转轴速度作为差值,经过速度PID获得速度期望,然后控制步进电机的输入脉冲频率,调整电机转速。
实验环境
【*】 程序简介
-工程名称:步进电机-位置环控制-位置式PID
-实验平台: 野火STM32 F103 拂晓 开发板
【 !】功能简介:
位置速度环例程 默认使用从PID调试助手界面打开串口
【 !】实验操作:
下载本程序,复位开发板即可。
【 !!】注意事项:
步进电机驱动器使用32细分
/************************************************************/
步进电机驱动器接口1:
PUL+<--->VCOM
PUL-<--->PC6
DIR+<--->VCOM
DIR-<--->PE6
ENA+<--->VCOM
ENA-<--->PE5
编码器与步进电机的接线
红线+5V <------------>VENC
黑线GND <------------->GND
A相蓝线 <------------>PD12
B相绿线 <------------>PD13
Z相黄线 <------------>PD14
屏蔽线()<------------>GND(没有PIN屏蔽线的可以不接)
/*************************************************************************/
【*】 时钟
A.晶振:
-外部高速晶振:8MHz
-RTC晶振:32.768KHz
B.各总线运行时钟:
-系统时钟 = SYCCLK = AHB = 72MHz
-APB2 = 72MHz
-APB1 = 36MHz
定时器输出PWM控制步进电机
定时器8,通道1,时钟频率72MHz ,预分频因子为16,重装载值0xFFFF,
//Motor 脉冲
#define MOTOR_PUL_IRQn TIM8_CC_IRQn
#define MOTOR_PUL_IRQHandler TIM8_CC_IRQHandler
#define MOTOR_PUL_TIM TIM8
#define MOTOR_PUL_CLK_ENABLE() __HAL_RCC_TIM8_CLK_ENABLE()
#define MOTOR_PUL_PORT GPIOC
#define MOTOR_PUL_PIN GPIO_PIN_6
#define MOTOR_PUL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
#define MOTOR_PUL_CHANNEL_x TIM_CHANNEL_1
#define MOTOR_TIM_IT_CCx TIM_IT_CC1
#define MOTOR_TIM_FLAG_CCx TIM_FLAG_CC1
/*频率相关参数*/
//定时器实际时钟频率为:72MHz/TIM_PRESCALER
//具体需要的频率可以自己计算
#define TIM_PRESCALER 16 /*补充:对F103例程测试,提高分频利于位置环稳定状态*/
// 定义定时器周期,输出比较模式周期设置为0xFFFF
#define TIM_PERIOD 0xFFFF
比较输出模式的反转模式
/**
******************************************************************************
* @file bsp_stepper_init.c
* @author fire
* @version V1.0
* @date 2019-xx-xx
* @brief 步进电机初始化
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 F103 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "./stepper/bsp_stepper_init.h"
TIM_HandleTypeDef TIM_StepperHandle;
__IO uint16_t OC_Pulse_num = 65535; //比较输出的计数值
/**
* @brief 中断优先级配置
* @param 无
* @retval 无
*/
static void TIMx_NVIC_Configuration(void)
{
/* 外设中断配置 */
HAL_NVIC_SetPriority(MOTOR_PUL_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(MOTOR_PUL_IRQn);
}
/**
* @brief 配置TIM复用输出PWM时用到的I/O
* @param 无
* @retval 无
*/
static void Stepper_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*开启Motor相关的GPIO外设时钟*/
MOTOR_DIR_GPIO_CLK_ENABLE();
MOTOR_PUL_GPIO_CLK_ENABLE();
MOTOR_EN_GPIO_CLK_ENABLE();
/*选择要控制的GPIO引脚*/
GPIO_InitStruct.Pin = MOTOR_DIR_PIN;
/*设置引脚的输出类型为推挽输出*/
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull =GPIO_PULLUP;
/*设置引脚速率为高速 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
/*Motor 方向引脚 初始化*/
HAL_GPIO_Init(MOTOR_DIR_GPIO_PORT, &GPIO_InitStruct);
/*Motor 使能引脚 初始化*/
GPIO_InitStruct.Pin = MOTOR_EN_PIN;
HAL_GPIO_Init(MOTOR_EN_GPIO_PORT, &GPIO_InitStruct);
/* 定时器通道1功能引脚IO初始化 */
/*设置输出类型*/
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
/*设置引脚速率 */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
/*设置复用*/
GPIO_InitStruct.Pull =GPIO_PULLUP;
/*选择要控制的GPIO引脚*/
GPIO_InitStruct.Pin = MOTOR_PUL_PIN;
/*Motor 脉冲引脚 初始化*/
HAL_GPIO_Init(MOTOR_PUL_PORT, &GPIO_InitStruct);
}
/*
* 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
* TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
* 另外三个成员是通用定时器和高级定时器才有.
*-----------------------------------------------------------------------------
* TIM_Prescaler 都有
* TIM_CounterMode TIMx,x[6,7]没有,其他都有(基本定时器)
* TIM_Period 都有
* TIM_ClockDivision TIMx,x[6,7]没有,其他都有(基本定时器)
* TIM_RepetitionCounter TIMx,x[1,8]才有(高级定时器)
*-----------------------------------------------------------------------------
*/
void TIM_PWMOUTPUT_Config(void)
{
TIM_OC_InitTypeDef TIM_OCInitStructure;
/*使能定时器*/
MOTOR_PUL_CLK_ENABLE();
TIM_StepperHandle.Instance = MOTOR_PUL_TIM;
/* 累计 TIM_Period个后产生一个更新或者中断*/
///当定时器从0计数到TIM_PERIOD-1,即为TIM_PERIOD次