beijinglaobai 发表于 2022-8-5 12:35

【N32G430开发板试用】+ N32G430编程控制步进电机梯形加减速

@安小芯 国产芯片-国民技术N32G430单片机编程控制步进电机实现梯形加减速

C语言 N32G430单片机定时器编程

利用两个定时器分别控制转速和加速度实现梯形加减速https://www.bilibili.com/video/BV1Lg41117Rg?share_source=copy_web&vd_source=75b07358fcefa824ffaf5ab2d1c4b8ca

月亮 发表于 2022-8-5 18:15

只看到视频,没有源代码。。。。。

duo点 发表于 2022-8-8 15:50

能附源代码一份吗

beijinglaobai 发表于 2022-8-9 13:13

/**
******************************************************************************
* 文件名程: STEPMOTOR.c
* 作    者: 老白
******************************************************************************
* 说明:步进电机梯形加减速驱动
******************************************************************************
*/
/* 包含头文件 ----------------------------------------------------------------*/
#include "BSTIM_common.h"
#include "GPTim_common.h"
#include "timer_common.h"
#include "main.h"
#include "bsp_delay.h"
#include "StepMotor.h"
#include "StepMotorIo.h"
#include "Test_GS.h"

#include "n32g430_it.h"
#include "Key.h"


/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
speedRampData Srd;//定义电机运行状态结构体

/* 函数体 --------------------------------------------------------------------*/
/**
* 函数功能: STEPMOTOR相关GPIO初始化配置
* 输入参数: 无
* 返 回 值: 无
* 说    明: 无
*/
void StepMotor_GPIO_Initialize(void)
{
    StepMotor_Io_Init();//电机脉冲控制引脚初始化
}

/**
* 函数功能: 控制定时器初始化(此处使用基本定时器TIM 6)
* 输入参数: 无
* 返 回 值: 无
* 说    明: 无
*/
void BSTIM_Init(void)
{
    //uint32_t BSTIMClockFrequency = 0 ;
    /* System Clocks Configuration */
    //BSTIMClockFrequency =
                Common_BSTIM_RCC_Initialize(TIM6, RCC_HCLK_DIV4);

    /* NVIC Configuration */
    Common_TIM_NVIC_Initialize(TIM6_IRQn, ENABLE);

    /* Time base configuration, period = 65535, prescaler = prescaler32000000 */
    Common_TIM_Base_Initialize(TIM6, Period,Prescaler );

    TIM_Base_Reload_Mode_Set(TIM6, TIM_PSC_RELOAD_MODE_IMMEDIATE);

    TIM_Interrupt_Enable(TIM6, TIM_INT_UPDATE);

    TIM_On(TIM6);
}


u8 jz_ = 1 ;//加减速标志0加速1 减速

int Fun_Motor_Timi_(int Motor_ZS_)
{
   return(int)(SYSCLK_FREQ_32M*60/( Period+1 )/(Prescaler+1)/MICRO_STEP/FSPR/(Motor_ZS_+1));       
}

void main_Motor(void)
{
Key_main();//键盘初始化
       
        for ( u8 i = 0 ; i < 8 ; i++ )
        {

                Srd.SDmax = 540 ;//设置最高速度
                Srd.SUmin = 30 ; //设置最低速度
                Srd.Motor_ZS = 20 ;//设置速度初值

        }

}

void fun_Pluse(u32 tim6i_ ,u8 i_)
{
   if ( ((tim6i_+10*i_)%Srd.Motor_Timi)== 0)
               {
                      StepMotor_Io_Pulse(i_);                                              
               }
}



/**
* 函数功能: 基本定时器中断服务函数
* 输入参数:
* 返 回 值: 无
* 说    明: 实现步进电机运转服务逻辑
*/
u32 tim6i = 0 ;       
void TIM6_IRQHandler(void)
{//基本定时器中断频率= (int)((32000000/(31+1)/(0+1)))=1000K
    if (TIM_Interrupt_Status_Get(TIM6, TIM_INT_UPDATE) != RESET)
    {   TIM_Interrupt_Status_Clear(TIM6, TIM_INT_UPDATE);
                                tim6i++;//TIM6中断计数

                                for ( int i = 0 ; i<8 ; i++ )
                                {
                                               if ( Srd.State != STOP )fun_Pluse(tim6i,i) ;         //如果不为停止状态则发送驱动脉冲       
                                }
               
    }
}



void fun_SysTick_(speedRampData *Srd_)
{
   switch(Srd_->State) // 加减速曲线阶段
      {
      case STOP:       //停止
                                  //Morot_Stop( *Srd_ );
                                break;

      case ACCEL://加速阶段
                                     if ( Srd_->Motor_ZS < Srd_->SDmax )//if速度小于最高速度
                                               {
                                                     Srd_->Motor_ZS ++ ;//加速                                               
                                   //根据给定的速度值计算出相应的Motor_Timi值(驱动周期脉冲数)
                                             Srd_->Motor_Timi=Fun_Motor_Timi_(Srd_->Motor_ZS);                               
                                               } else { Srd_->State = RUN ; }
      break;

      case RUN:   //匀速阶段
                                          Srd_->Motor_Timi =Fun_Motor_Timi_(Srd_->Motor_ZS);                                       
      break;

      case DECEL: //减速阶段
                                  if ( Srd_->Motor_ZS > Srd_->SUmin )//如果大于最小速度
                                                {
                                                                Srd_->Motor_ZS -- ;
                                                                //根据给定的速度值计算出相应的Motor_Timi值(驱动周期脉冲数)
                                                                Srd_->Motor_Timi=Fun_Motor_Timi_(Srd_->Motor_ZS);
                                                }
                                                else { Srd_->State = STOP ; }//如果小于最小速度则停止
      break;
                               

                        }





}



int Tick_i = 0 ;//嘀嗒定时器中断次数累加
int Motor_JJS = 20;//200 ;//加减速变化频繁度(变动周期)周期越小速度变化越快
//int Run_js = 0 ;//匀速阶段计数
/**
* 函数功能: 嘀嗒定时器中断服务函数
* 输入参数: 无
* 返 回 值: 无
* 说    明: 实现加减速过程
*/
u8 ACCELi = 0 ;
u8 ACCELi_ = 0 ;
u8 DECELi = 0 ;
u8 DECELi_ = 0 ;
void SysTick_Handler(void)
{
   Tick_i++;
       for ( int i = 0 ; i < 8 ; i++ )
       {
                       if ( ( Tick_i + 4 * i ) % Motor_JJS == 0 )
                       {
                                       fun_SysTick_( &Srd)        ;
                       }   
       }
       
       if ( ACCELi_ > 0 ) { ACCELi_++ ;if ( ACCELi_ > 60 ){ ACCELi_ = 0 ;ACCELi++ ; } }
       if ( DECELi_ > 0 ) { DECELi_++ ;if ( DECELi_ > 60 ){ DECELi_ = 0 ;DECELi++ ; } }
       if ( ACCELi > 7 ) ACCELi = 0 ;
       if ( DECELi > 7 ) DECELi = 0 ;       
}


void while_Motor(void)
{

}



//2、从静止开始加速到匀速运转
//3、在任意运转状态下接到指令开始减速到停止
//4、在运行状态下接到指令开始减速、停止、小停顿、反向加速、到指定速度反向运动
//5、从A运转到B、经历 静止-加速-匀速-减速-停止(力求最小时间)最高速度跟A B 间距有关

//****所有运转情况均已不超出机构限制范围为准,等到极点要减速然后停止

/** N32G430 Peripherals Interrupt Handlers, interrupt handler's name please refer to the startup file (startup_n32g430.s) **/

/**
*\*\name    EXTI9_5_IRQHandler.
*\*\fun   External lines 5 to 9 interrupt.
*\*\param   none
*\*\returnnone
**/

void EXTI9_5_IRQHandler(void)
{
    if (RESET != EXTI_Interrupt_Status_Get(KEY5_INPUT_EXTI_LINE))
    {
                  
                                if ( ACCELi < 8 && ACCELi_ == 0 )
                                {LED2_TOGGLE;
         Srd.State = ACCEL ;//加速       
         ACCELi_ = 1;
                                }
      EXTI_Interrupt_Status_Clear(KEY5_INPUT_EXTI_LINE);
    }

    if (RESET != EXTI_Interrupt_Status_Get(KEY6_INPUT_EXTI_LINE))
    {
                                if ( DECELi < 8&& DECELi_ == 0 )
                                {      LED3_TOGGLE;
         Srd.State = DECEL ;//减速                               
                                       DECELi_ = 1 ;
                                }                               
      EXTI_Interrupt_Status_Clear(KEY6_INPUT_EXTI_LINE);
    }
}


void EXTI4_IRQHandler(void)
{
    LED1_TOGGLE;
    EXTI_Interrupt_Status_Clear(KEY4_INPUT_EXTI_LINE);               
}

jackcat 发表于 2022-8-17 16:15

这个步进电机性能怎么样   

beijinglaobai 发表于 2022-8-17 18:06

普通的2项4线42步进电机

beijinglaobai 发表于 2022-8-19 15:42

页: [1]
查看完整版本: 【N32G430开发板试用】+ N32G430编程控制步进电机梯形加减速