[活动专区]

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

[复制链接]
189|3
手机看帖
扫描二维码
随时随地手机跟帖
beijinglaobai|  楼主 | 2022-8-5 12:35 | 显示全部楼层 |阅读模式
@安小芯 国产芯片-国民技术N32G430单片机编程控制步进电机实现梯形加减速

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

利用两个定时器分别控制转速和加速度实现梯形加减速

使用特权

评论回复
月亮| | 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[8];//定义电机运行状态结构体

/* 函数体 --------------------------------------------------------------------*/
/**
  * 函数功能: 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 = prescaler  32000000 */
    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[i].SDmax = 540 ;//设置最高速度
                Srd[i].SUmin = 30 ; //设置最低速度
                Srd[i].Motor_ZS = 20 ;//设置速度初值

        }

}

void fun_Pluse(u32 tim6i_ ,u8 i_)
{
     if ( ((tim6i_+10*i_)%Srd[i_].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[i].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[i])        ;
                         }   
         }
         
         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
*\*\return  none
**/

void EXTI9_5_IRQHandler(void)
{
    if (RESET != EXTI_Interrupt_Status_Get(KEY5_INPUT_EXTI_LINE))
    {
                    
                                if ( ACCELi < 8 && ACCELi_ == 0 )
                                {LED2_TOGGLE;
           Srd[ACCELi].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[DECELi].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);               
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则