- PID算法, PID 就是“比例(proportional)、积分(integral)、微分(differential)”
P,I,D是三种不同的调节作用,既可以单独使用(P,I,D),也可以两个两个用(PI,PD),也可以三个一起用(PID)。
PID参数调整口诀:
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低四比一
一看二调多分析,调节质量不会低
若要反应增快,增大P减小I
若要反应减慢,减小P增大I
如果比例太大,会引起系统震荡
如果积分太大,会引起系统迟钝
- S形加减速和梯形加减速
- 第一象限、第二象限、第三象限、第四象限
- 插补
插补,就是根据零件轮廓的几何形状、几何尺寸以及轮廓加工的精度要求和工艺要求,在零件轮廓的起点和终点之间插入一系列中间点(折线端点)的过程,即所谓“数据点的密化过程”,其对应的算法称为插补算法。
实现插补运算可以有多种算法,例如 "DDA 算法","逐点比较法","正负法","最小偏差法(Bresenham 算法)"等,其中最小偏差法具有最小的偏差和较快的运行速度。
tim_STEPMOTOR.h
#ifndef __TIM_STEPMOTOR_H
#define __TIM_STEPMOTOR_H
#include "sys.h"
/*
*
*TIM8
*
*/
void TIM8_PWM_Init(u16 arr,u16 psc); //TIM? PWM部分初始化
#endif
tim_STEPMOTOR.c
#include "tim_STEPMOTOR.h"
/***************************************************************
*
*
*定时器底层驱动,时钟使能,引脚配置
*此函数会被HAL_TIM_PWM_Init()调用
*htim:定时器句柄
****************************************************************/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM8_CLK_ENABLE(); //使能定时器
__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIO时钟
//TIM8
GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; //C6-D12,C7-H12,C8-B15,C9-D11
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF3_TIM8;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
}
/*
*
*TIM8
*
*/
TIM_HandleTypeDef TIM8_Handler;
TIM_OC_InitTypeDef TIM8_CH_Handler; //定时器?通道?句柄
TIM_ClockConfigTypeDef TIM8_ClockSource; // 定时器时钟
TIM_MasterConfigTypeDef TIM8_Master; // 定时器主模式配置
TIM_BreakDeadTimeConfigTypeDef TIM8_BreakDeadTime;// 刹车和死区时间配置
//PWM部分初始化
void TIM8_PWM_Init(u16 arr,u16 psc)
{
/* STEPMOTOR相关GPIO初始化配置 */
HAL_TIM_PWM_Init(&TIM8_Handler); //初始化PWM GPIO
/* 定时器基本环境配置 */
TIM8_Handler.Instance=TIM8;
TIM8_Handler.Init.Prescaler=psc; //定时器分频
TIM8_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
TIM8_Handler.Init.Period=arr; //自动重装载值
TIM8_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&TIM8_Handler);
/* 定时器时钟源配置 */
TIM8_ClockSource.ClockSource = TIM_CLOCKSOURCE_INTERNAL; // 使用内部时钟源
HAL_TIM_ConfigClockSource(&TIM8_Handler, &TIM8_ClockSource);
/* 定时器比较输出配置 */
TIM8_CH_Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM8_CH_Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,
//默认比较值为自动重装载值的一半,即占空比为50%
TIM8_CH_Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为低
TIM8_CH_Handler.OCNPolarity = TIM_OCNPOLARITY_LOW; // 互补通道输出极性
TIM8_CH_Handler.OCFastMode = TIM_OCFAST_DISABLE; // 快速模式
TIM8_CH_Handler.OCIdleState = TIM_OCIDLESTATE_RESET; // 空闲电平
TIM8_CH_Handler.OCNIdleState = TIM_OCNIDLESTATE_RESET;// 互补通道空闲电平
/* 使能比较输出通道 */
HAL_TIM_OC_Stop_IT (&TIM8_Handler, TIM_CHANNEL_1);
HAL_TIM_OC_Stop_IT (&TIM8_Handler, TIM_CHANNEL_2);
HAL_TIM_OC_Stop_IT (&TIM8_Handler, TIM_CHANNEL_3);
HAL_TIM_OC_Stop_IT (&TIM8_Handler, TIM_CHANNEL_4);
HAL_TIM_OC_ConfigChannel(&TIM8_Handler,&TIM8_CH_Handler,TIM_CHANNEL_1);//配置TIM?通道?
HAL_TIM_OC_ConfigChannel(&TIM8_Handler,&TIM8_CH_Handler,TIM_CHANNEL_2);//配置TIM?通道?
HAL_TIM_OC_ConfigChannel(&TIM8_Handler,&TIM8_CH_Handler,TIM_CHANNEL_3);//配置TIM?通道?
HAL_TIM_OC_ConfigChannel(&TIM8_Handler,&TIM8_CH_Handler,TIM_CHANNEL_4);//配置TIM?通道?
HAL_TIM_PWM_Start(&TIM8_Handler,TIM_CHANNEL_1);//开启PWM?通道?
HAL_TIM_PWM_Start(&TIM8_Handler,TIM_CHANNEL_2);//开启PWM?通道?
HAL_TIM_PWM_Start(&TIM8_Handler,TIM_CHANNEL_3);//开启PWM?通道?
HAL_TIM_PWM_Start(&TIM8_Handler,TIM_CHANNEL_4);//开启PWM?通道?
}
/***************************************************************
*
*定时器底层驱动,开启时钟,设置中断优先级
*回调函数,定时器中断服务函数调用
*
****************************************************************/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM8)
{
__HAL_RCC_TIM8_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM8_CC_IRQn, 8,9);
HAL_NVIC_EnableIRQ(TIM8_CC_IRQn);
}
}
//定时器中断服务函数
void TIM8_CC_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM8_Handler);
}