step/src/Driver/stepper_s.c

226 lines
10 KiB
C
Raw Normal View History

2018-02-28 09:33:52 +00:00
/*******************************************************************************
* @file stepper_s.1.c
* @Author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2018-02-28 14:15:45
2018-03-01 09:32:38 +00:00
* @brief 线
2018-02-28 09:33:52 +00:00
******************************************************************************
* @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stepper.h"
/* Definition ----------------------------------------------------------------*/
STEPPER motor;
STEPPER *pmotor = &motor;
/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
* @brief GPIO口初始化
* @param None
* @retval None
* @Note
*******************************************************************************/
void Motor_GPIO_Init(void)
{
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
}
#if ADV_TIM_ENABLE
/*******************************************************************************
* @brief S型电机驱动
* @param None
* @retval None
* @Note 使1使TIM_RepetitionCounter参数跳过细分中断
*******************************************************************************/
void Initial_PWM_Motor1(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
Motor_GPIO_Init();
TIM_DeInit(TIM1);
//中断NVIC设置允许中断设置优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PWM1_PreemptionPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = PWM1_SubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_BaseInitStructure.TIM_Period = 1000;
TIM_BaseInitStructure.TIM_Prescaler = 5;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //信号输出到对应的输出引脚
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互补信号输出到对应的输出引脚
TIM_OCInitStructure.TIM_Pulse = 50; //脉冲宽度
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //互补输出高电平有效
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互补输出高电平有效
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //输出空闲状态为1
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //互补输出空闲状态为0
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //OC1通道初始化
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1, ENABLE);
//清中断,以免一启用中断后立即产生中断
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
//使能TIM1中断源
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM1, DISABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE); //使能PWM输出
}
#endif
/*******************************************************************************
* @brief
* @param None
* @retval None
* @Note 使TIM2PWM
*******************************************************************************/
void Motor_PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
Motor_GPIO_Init();
TIM_DeInit(TIM2);
//中断NVIC设置允许中断设置优先级
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //更新事件 TIM2_IRQHandler
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断
NVIC_Init(&NVIC_InitStructure);
TIM_BaseInitStructure.TIM_Period = 1000;
TIM_BaseInitStructure.TIM_Prescaler = 5;
TIM_BaseInitStructure.TIM_ClockDivision = 0;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //信号输出到对应的输出引脚
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互补信号输出到对应的输出引脚
TIM_OCInitStructure.TIM_Pulse = 500; //脉冲宽度
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //互补输出高电平有效
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //互补输出高电平有效
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //输出空闲状态为1
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //互补输出空闲状态为0
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //OC1通道初始化
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
//清中断,以免一启用中断后立即产生中断
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//使能TIM1中断源
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, DISABLE);
//TIM_CtrlPWMOutputs(TIM2,ENABLE); //使能PWM输出
}
/*******************************************************************************
* @brief S型曲线表
* @param None
* @retval None
* @Note None
*******************************************************************************/
void Calculate_S_Table(void)
{
}
/*******************************************************************************
* @brief
* @param None
* @retval None
* @Note None
*******************************************************************************/
void MOTOR_Init(void)
{
Motor_PWM_Init(); //初始化电机驱动PWM
/* 初始化电机参数 */
}
/*******************************************************************************
* @brief 2
* @param None
* @retval None
* @Note None
*******************************************************************************/
void TIM2_IRQHandler(void)
{
TIM2->SR = (u16)~TIM_FLAG_Update;
if (1 == pmotor->en)
{
//位置计算
if (pmotor->dir_pos == pmotor->dir)
{
pmotor->current_puase++;
}
else
{
pmotor->current_puase--;
}
pmotor->current_step = pmotor->current_puase / pmotor->div;
pmotor->passed_puase++; //总脉冲个数
pmotor->f_puase++; //以该频率脉冲输出的脉冲个数
2018-03-01 09:32:38 +00:00
2018-02-28 09:33:52 +00:00
//对称反转???
// if (pmotor->RevetDot == pmotor->PulsesHaven)
// {
// pmotor->pulsecount = pmotor->Step_Table[pmotor->CurrentIndex];
// }
if (pmotor->f_puase >= pmotor->table_step[pmotor->f_index]) //一个频率的步数走完
{
if (pmotor->passed_puase <= pmotor->start_step) //如果是起步阶段
{
if (pmotor->f_index < pmotor->start_f - 1)
{
pmotor->f_index++; //进入下一个频率阶段
pmotor->f_puase = 0;
if (pmotor->f_index >= pmotor->start_f) //启动阶段的步数没有走完,禁止进入下一阶段的频率
pmotor->f_index = pmotor->start_f;
}
}
if (pmotor->target_puase - pmotor->passed_puase <= pmotor->stop_step) //停止阶段
{
// if (pmotor->f_index < pmotor->StartTableLength - 1)
// {
// pmotor->f_index = pmotor->StartTableLength + pmotor->StopTableLength - pmotor->CurrentIndex;
// }
// pmotor->f_index++;
// pmotor->f_puase = 0;
// if (pmotor->f_index >= pmotor->StartTableLength + pmotor->StopTableLength)
// pmotor->CurrentIndex = pmotor->StartTableLength + pmotor->StopTableLength - 1;
}
pmotor->TIMx->ARR = pmotor->table_time[pmotor->f_index]; //设置周期
pmotor->TIMx->CCR1 = (pmotor->table_time[pmotor->f_index]) >> 1; //设置占空比
}
//旋转预定脉冲数停止running=0可以进行下一次旋转
if (pmotor->passed_puase >= pmotor->target_puase && pmotor->passed_puase > 3)
{
pmotor->en = 0;
pmotor->running = 0;
pmotor->f_index = 0;
TIM_Cmd(pmotor->TIMx, DISABLE); //DISABLE
}
}
}
/*********************************END OF FILE**********************************/