TIM8通道1-4输出pwm

  • 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);
}

猜你喜欢

转载自blog.csdn.net/qq_35831134/article/details/110951250