C语言电机控制,曲线加速 ,直线加速
1.函数说明
void vStepMotor_Init(void);
初始化步进电机参数:使能脚,方向,脉冲,原点检测信号,终点检测信号 运动最小速度 最大速度 加速步长等等。
void vStepMotor_Calc_S_Wave(unit16_t speedLow, unit16_t speedHigh , StepMotor_Typedef * Motor , unit16_t size );
根据设定计算 电机运动的参数,也就是计算得到定时器翻转脉冲的间隔。
void vStepMotor_Run(StepMotor_Typedef * Motor , Motor_State Dir, uint16_t steps);
电机执行的方向和步数。
void vStepMotor_Run_Motion(StepMotor_Typedef motor);
该函数在对应的定时器中断中执行,根据计算的定时器反转脉冲时间翻转脉冲。

程序框架

void main(void)

vStepMotor_Init();
vStepMotor_Calc_S_Wave(400,600,60);
while(1)
{
vStepMotor_Run(motor, Dir, steps);
}

void TIM2_IRQHandler(void)
(
if(TIM_Get ITStatus(TIM, TIM_IT_Update)==SET)

TIM_ClearFlag(TIM,TIM_FLAG_Updata);
vStepMotor_Run_Motion(&Motor);

)

手机更新中

void StepMotor_Init(void)
{
vStepMotorGPIOInit();
//-------------------------------------------------------------------------------------
WasteWat_Mtr.Ctrl_Status=STOP;
WasteWat_Mtr.PIN_EN =&PDout(12);
WasteWat_Mtr.PIN_DIR=&PDout(13);
WasteWat_Mtr.PIN_CLK=&PDout(14);
//Pump_WasteLiquid_Mtr.PIN_ORI=&PBin(15);
WasteWat_Mtr.TIM_ARR=&MEM_ADDR(&TIM4->ARR);//tim5
WasteWat_Mtr.Para_S_Type=FULL_S_WAVE;
WasteWat_Mtr.Run_S_Len=wParaGet(WasteWater_Num, mStepsS);//
WasteWat_Mtr.S_Wave=&S_Wave_WasteWa_Mtr[0];
WasteWat_Mtr.Para_OriginDir=CCW; //100ul
WasteWat_Mtr.Para_OriginSteps=60; //无原点
WasteWat_Mtr.Run_Timer_Freq=2000000;
WasteWat_Mtr.Para_ClkPerStep=8;
WasteWat_Mtr.Run_Low_Speed =300;
WasteWat_Mtr.Run_High_Speed=500;
WasteWat_Mtr.CW_CCW_AntiLogic=TRUE;
WasteWat_Mtr.Dir_Enable=TRUE; //方向不使能
WasteWat_Mtr.Origin_Status=TRUE; //

    StepMotor_Calc_S_Wave(wParaGet(WasteWater_Num,mSpeedMin),wParaGet(WasteWater_Num,mSpeedMax),&WasteWat_Mtr,WasteWat_S_Wave_Size);   //废液电机
}

void StepMotor_Calc_S_Wave(uint16_t low,uint16_t high,StepMotor_TypeDef* Motor,uint16_t size)
{
u16 S_len_arr,step;
float a1,b1,c1,a2,b2,c2;

 Motor->Run_Low_Speed=low;Motor->Run_High_Speed=high;S_len_arr = Motor->Run_S_Len/2;//   Motor->S_Wave[t]=(Motor->Run_Timer_Freq/2)/(Vt*Motor->Para_ClkPerStep); //数组中存储的是计算好的定时器ARR值//计算前一段抛物线参数 y = a*x*x + b*x + ca1 = (float)(high-low)/(3*S_len_arr*S_len_arr); b1 = (float)(high-low)/(6*S_len_arr);c1 = (float)low;//计算后一段抛物线参数 y = a*x*x + b*x + ca2 = (float)(3*(low-high))/(8*S_len_arr*S_len_arr);b2 = (float)(13*(high-low))/(8*S_len_arr);c2 = (float)((7*low)/4 - (3*high)/4);for(step = 0;step < 2*S_len_arr;step++)  //对所有步数的S_wave进行计算{if(/*step >= 0 &&*/ step < S_len_arr){Motor->S_Wave[step] = a1*step*step + b1*step + c1;}else if(step >= S_len_arr && step <= S_len_arr*2){Motor->S_Wave[step] = a2*step*step + b2*step + c2;}}if(Motor->Run_S_Len%2){                 //对奇数的最后一步进行单独处理Motor->S_Wave[Motor->Run_S_Len-1] = high;}

}

//void StepMotor_Calc_S_Wave(uint16_t low,uint16_t high,StepMotor_TypeDef* Motor,uint16_t size)
//{
// //Fcur = Fmin + (Fmax-Fmin)/(1+e^(-flexible*(i-num)/num));
// //flexible = 4~6; num = length/2; length = 加减速步长
// const int l_dwFlexible = -6;
// //const float e = 2.72; //e 约等于2.72
// int l_wNum = 0;
// uint32_t l_dwFValue = 0;
// uint16_t l_wLenth = 0;
// uint16_t l_wLow = 0, l_wHigh = 0;
// uint16_t i = 0;
// float l_Tmp = 0.0;

// //Motor = &g_StepMtrCtrlInfo[byStepMNbr];

// if (Motor->Run_S_Len >= 200 )
// {
// Motor->Run_S_Len = 200;
// }

// l_wLenth = Motor->Run_S_Len;
// l_wNum = l_wLenth/2;
// l_wLow = low;
// l_wHigh = high;

// for (i = 1; i <= l_wLenth; i++)
// {
// l_Tmp = 1 + expf(l_dwFlexible*(i-l_wNum)/l_wNum);

// l_dwFValue = 0.5 + l_wLow + (float)(l_wHigh - l_wLow)/l_Tmp;

// //Motor->S_Wave[i-1] = Motor->Run_Timer_Freq/2/(l_dwFValue*Motor->Para_ClkPerStep);
// Motor->S_Wave[i-1] = l_dwFValue;
// }

// for (i = l_wLenth; i < 200; i++) //将曲线数组填充满
// {
// //Motor->S_Wave[i] = Motor->Run_Timer_Freq/2/(l_wHigh*Motor->Para_ClkPerStep);
// //Motor->S_Wave[i] = Motor->S_Wave[i-1];
// }
//}

//void StepMotor_Calc_S_Wave(uint16_t low,uint16_t high,StepMotor_TypeDef* Motor,uint16_t size)
//{
// //y=kx+b
// uint16_t i = 0;
// float k = 0;
//
// if(size > 200)
// {
// size =200;
// }
//
// k = (float)(high-low) / size;
//
// for(i=0; i< size; i++)
// {
// Motor->S_Wave[i] = ((float)i*k) +low+0.5;
// }
//}

stm32 步进电机控制,S曲线加减速,匀加速运动相关推荐

  1. 基于STM32F103的步进电机S型曲线加减速算法与实现

    步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的 ...

  2. c语言s型曲线方程,电机控制 | S曲线加减速

    S型曲线加减速 1.  S型曲线 1.1 简介 Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线.Sigmoid函数也叫Logistic函数,取值范围为(0,1),它可以将一个实数 ...

  3. 步进电机S型曲线加减速算法与实现

    转载于http://blog.csdn.net/pengzhihui2012/article/details/52228822?locationNum=6 一年前做过的S型曲线加减速算法,再次做的时候 ...

  4. 步进电机S(SigMoid)曲线加减速【查表法】

    首先感谢以下博客的博主提供的参考公式:https://blog.csdn.net/pengzhihui2012/article/details/52228822?locationNum=6 首先在本设 ...

  5. “S“型曲线加减速在42步进电机的位置控制和速度控制中的交叉应用

    "S"型曲线加减速在42步进电机位置和速度交叉控制应用 兴趣使然,兴趣使然-哈哈,花了一个多星期研究了一下S型曲线在步进电机的加速减速中应用,以及简单的结合了一下位置控制和速度控制 ...

  6. 基于51单片机+ULN2003控制步进电机S曲线加减速

    目录 1.ULN2003功能简介 2.28BYJ48简介 3.S曲线加减速方法 4.proteus仿真及实物测试 1.ULN2003功能简介 ULN2003比较简单,相关资料也比较多.可以用来驱动四线 ...

  7. 【龙印】步进电机使用七段式抛物线型S曲线加减速和路径规划的理论分析和实现

    本文为在用龙芯1c做3D打印机过程中的笔记.龙芯1c做的3d打印机简称"龙印",Git地址"http://git.oschina.NET/caogos/marlin_ls ...

  8. S曲线加减速算法 VS 梯形加减速算法

    设计运动控制系统很多年,突然有人问我S曲线加减速算法跟梯形加减速算法的区别,我竟然拼凑了很多语言都没能讲清楚.作为一个技术男怎能善罢甘休,但介于个人能力有限只能借用网上大牛的讲解搞清楚.苦苦搜索了三天 ...

  9. stm32f302实现斩波控制步进电机_spwm超级无敌stm32步进电机控制教程

    spwm超级无敌stm32步进电机控制教程 [复制链接] 本帖最后由 huo_hu 于 2014-3-10 14:00 编辑 本教程介绍步进电机驱动和细分的工作原理,以及stm32103为主控芯片制作 ...

  10. matlab拟合s型加减速曲线,运动控制系统s曲线加减速的实现方法

    运动控制系统s曲线加减速的实现方法 [专利摘要]一种运动控制系统S曲线加减速的实现方法,1)S曲线加减速的实现条件:S曲线加减速控制过程的基本限定条件公式如公式(6):完整的S曲线加减速过程应满足公式 ...

最新文章

  1. Extjs PROXY查询params无法传参,改用extraParams
  2. javascript 异步实现方案
  3. MySQL从入门到精通50讲(十一)-MySQL正则表达式及事务
  4. QT自定义图表上不同元素的外观
  5. 包打包和解析过程 unity_Unity学习—资源管理概览
  6. 图像分类_PyTorch图像数据分类
  7. 6.Hibernate多对多关系建立
  8. 二、17【FPGA】无源蜂鸣器驱动实验
  9. 【C++从入门到踹门】第十四篇:二叉搜索树
  10. layer php相册层,贤心旧版jquery layer.js如何展示相册
  11. APISpace 绕口令API接口 免费好用
  12. 引用第三方SDK产生依赖冲突
  13. 【Python学习记录】Numpy广播机制(broadcast)
  14. 什么是待办事项?日常办事项清单怎么写
  15. Hive 自定义UDF函数讲解
  16. 基于bim技术的应用软件有?哪些提高bim工作效率的revit插件
  17. matlab归一化方法,数据归一化的基本方法
  18. 【毕业设计】基于STM32的心率检测器 - 单片机 嵌入式 物联网
  19. MAX40026 280ps高速比较器
  20. Android播放视频或视频通话只有声音没有画面解决方法,布局刷新失败解决办法

热门文章

  1. JRs在看啥?- 虎扑社区用户行为分析
  2. IC Compiler II(ICC II)后端设计流程——超详细
  3. 《计算机网络—自顶向下方法》 第四章Wireshark实验:IP
  4. 计算机考研815指什么,考研815化学包括什么
  5. linux安装Oracle11g详细教程(redhat6、Centos7)
  6. 企业私有网络构建与运维
  7. python从右向左第三个字符_字符串是一个字符序列,例如,字符串s,从右侧向左第3个字符用什么索引?_学小易找答案...
  8. 把单元格一分为二_怎么把单元格上下一分为二
  9. ov5640_mipi.c分析
  10. PLL中的locked信号解析