【N32G430开发板试用】+ N32G430编程控制步进电机梯形加减速
@安小芯 国产芯片-国民技术N32G430单片机编程控制步进电机实现梯形加减速C语言 N32G430单片机定时器编程
利用两个定时器分别控制转速和加速度实现梯形加减速https://www.bilibili.com/video/BV1Lg41117Rg?share_source=copy_web&vd_source=75b07358fcefa824ffaf5ab2d1c4b8ca
只看到视频,没有源代码。。。。。 能附源代码一份吗 /**
******************************************************************************
* 文件名程: 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);
}
这个步进电机性能怎么样 普通的2项4线42步进电机
页:
[1]