12下一页

[问答] 关于步进电机加减速运动的C程序编写

[复制链接]
发表于 2016-12-7 09:52:05   704 查看 20 回复 显示全部楼层 倒序浏览
分享
我写了一个步进电机加减速运动的程序,但是发现电机进入不了加减速,主程序中给定一个固定步数,由加减速程序去判断加减速且走完固定步数就关闭定时器,但是电机停不了,也不能加减速。

步进电机加减速运动程序

步进电机加减速运动程序

奖励5积分
标签:步进电机 程序编写

实习生

发表于 2016-12-7 17:31:06  
华强PCB打样
程序明显有问题啊! if(!stepCnt) 是当stepCnt等于0是才会进入。结果就是第一步会进入这个函数然后加速,然后后面永远不会在进入,最后就是永远处于这个速度,永远不会减速,不会停止。
回复

点赞

发表于 2016-12-8 09:38:31    楼主|
xianhehu 发表于 2016-12-7 17:31
程序明显有问题啊! if(!stepCnt) 是当stepCnt等于0是才会进入。结果就是第一步会进入这个函数然后加速,然后后面永远不会在进入,最后就是永远处于这个速度,永远不会减速,不会停止。

这一点是因为我希望主程序给电机步数的时候,电机都是从一开始进入加减速,if(!stepCnt)里面包含的程序只是为了分配加减速步数而已。走过第一步之后不需要再进入这一段程序,直接跑到后面的加速段或者减速段执行就好了。匀速段则不会改变定时器的值。经过昨天的测试,我发现问题出在减速段的条件上面,应该是else if(stepCnt>lessSpeedStep),去掉等号就可以加减速了。不过现在主要的问题是无论我怎么设置加减速数组,电机声音都很大。
回复

点赞

实习生

发表于 2016-12-9 17:55:01  
本帖最后由 xianhehu 于 2016-12-9 18:00 编辑
黑眼圈红了 发表于 2016-12-8 09:38
这一点是因为我希望主程序给电机步数的时候,电机都是从一开始进入加减速,if(!stepCnt)里面包含的程序只是为了分配加减速步数而已。走过第一步之后不需要再进入这一段程序,直接跑到后面的加速段或者减速段执行就好了。匀速段则不会改变定时器的值。经过昨天的测试,我发现问题出在减速段的条件上面,应该是else if(ste ...

你后面的所有加速减速代码不都在if(!stepCnt)这个条件语句块之内的吗,你进不了这个条件,你后面怎么可能进去?stepCnt等于0才进入,后面胡if(stepCnt>lessSpeedStep)还有意义吗?  或者你程序改了,不是上面发的那个?
回复

点赞

发表于 2016-12-12 09:31:35    楼主|
xianhehu 发表于 2016-12-9 17:55
你后面的所有加速减速代码不都在if(!stepCnt)这个条件语句块之内的吗,你进不了这个条件,你后面怎么可能进去?stepCnt等于0才进入,后面胡if(stepCnt>lessSpeedStep)还有意义吗?  或者你程序改了,不是上面发的那个?

只在第一次启动的时候进入if(!stepCnt),在这段程序里实现加减速步数的计算,第二次以及之后的步数因为已经不等于0了,所以进入中断的时候直接跳到判断stepCnt与addSpeedStep或者lessSpeedStep的大小,从而得知电机是在加速段还是减速段,然后进入相应的程序、
回复

点赞

实习生

发表于 2016-12-12 12:36:29  
本帖最后由 xianhehu 于 2016-12-12 12:42 编辑
黑眼圈红了 发表于 2016-12-12 09:31
只在第一次启动的时候进入if(!stepCnt),在这段程序里实现加减速步数的计算,第二次以及之后的步数因为已经不等于0了,所以进入中断的时候直接跳到判断stepCnt与addSpeedStep或者lessSpeedStep的大小,从而得知电机是在加速段还是减速段,然后进入相应的程序、 ...

关键是跳不过去啊,判断stepCnt与addSpeedStep或者lessSpeedStep的大小这些代码都是if(!stepCnt)这个if条件语句内的,这个条件不满足后面就不可能跳过去。如果是像你说的这个逻辑,上面发的那段代码就是错的,少了一个"}",在第33行应该加一个}括号。
回复

点赞

实习生

发表于 2016-12-12 15:50:37  
不懂编程的我好像看懂了楼上在讨论什么
回复

点赞

发表于 2016-12-12 16:28:15    楼主|
xianhehu 发表于 2016-12-12 12:36
关键是跳不过去啊,判断stepCnt与addSpeedStep或者lessSpeedStep的大小这些代码都是if(!stepCnt)这个if条件语句内的,这个条件不满足后面就不可能跳过去。如果是像你说的这个逻辑,上面发的那段代码就是错的,少了一个"}",在第33行应该加一个}括号。
...

确实是少了一个括号。。。。。
回复

点赞

发表于 2016-12-12 16:29:08    楼主|
xianhehu 发表于 2016-12-12 12:36
关键是跳不过去啊,判断stepCnt与addSpeedStep或者lessSpeedStep的大小这些代码都是if(!stepCnt)这个if条件语句内的,这个条件不满足后面就不可能跳过去。如果是像你说的这个逻辑,上面发的那段代码就是错的,少了一个"}",在第33行应该加一个}括号。
...

后来的程序我已经有加上了,截图的时候没注意到、、、、、
回复

点赞

发表于 2016-12-12 16:30:36    楼主|
xianhehu 发表于 2016-12-12 12:36
关键是跳不过去啊,判断stepCnt与addSpeedStep或者lessSpeedStep的大小这些代码都是if(!stepCnt)这个if条件语句内的,这个条件不满足后面就不可能跳过去。如果是像你说的这个逻辑,上面发的那段代码就是错的,少了一个"}",在第33行应该加一个}括号。
...

其实这不是重点啦,重点是为什么我有了加减速声音还辣么大,好心累。。。
回复

点赞

发表于 2016-12-12 16:31:17    楼主|
z810401351 发表于 2016-12-12 15:50
不懂编程的我好像看懂了楼上在讨论什么

蓝瘦香菇、、、、
回复

点赞

实习生

发表于 2016-12-12 17:21:02  

这程序是不是就相当于变频器的程序啊,那什么加速时间减速时间启动转矩啥的,
回复

点赞

发表于 2016-12-13 15:02:10    楼主|
z810401351 发表于 2016-12-12 17:21
这程序是不是就相当于变频器的程序啊,那什么加速时间减速时间启动转矩啥的,

其实就是每次中断去改变定时器的值然后达到加减速的目的,也就是你说的变频。
回复

点赞

实习生

发表于 2016-12-14 11:43:38  
黑眼圈红了 发表于 2016-12-13 15:02
其实就是每次中断去改变定时器的值然后达到加减速的目的,也就是你说的变频。

不懂,嘻嘻
回复

点赞

实习生

发表于 2016-12-19 14:29:25  
很好
回复

点赞

工程师

发表于 2016-12-22 22:42:39  
我就来看看 。。。。。。。。。。。。
回复

点赞

实习生

发表于 2016-12-25 15:14:23  
                   /*******************************************************************/
/* 程序名:PWM直流电机调速 */
/* 晶振:11.00592 MHz CPU型号:AT89C51 */
/* 直流电机的PWM波控制,可以直接的调速从0到5级的调速 */
/*****************************************************************/
#include<reg51.h>
#define TH0_TL0 (65536-1000)//设定中断的间隔时长
unsigned char count0 = 50;//低电平的占空比
unsigned char count1 = 0;//高电平的占空比
bit Flag = 1;//电机正反转标志位,1正转,0反转
bit start =0; //电机停止标志
sbit Key_add=P3 ^ 0; //电机减速
sbit Key_dec=P3 ^ 1; //电机加速
sbit Key_turn=P3 ^ 2; //电机换向
sbit Key_start_stop=P3 ^ 3;           //电机启停
sbit PWM1=P2^6;//PWM 通道 1,反转脉冲
sbit PWM2=P2^7;//PWM 通道 2,正转脉冲
unsigned char Time_delay;
/************函数声明**************/
void Delay(unsigned char x);
void Motor_speed_high(void);
void Motor_speed_low(void);
void Motor_turn(void);
void start_stop(void);
void Timer0_init(void);

/****************延时处理**********************/
void Delay(unsigned char x)
{
Time_delay = x;

while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔
}
/*******按键处理加pwm占空比,电机加速**********/
void Motor_speed_high(void)//
{
if(Key_add==0)
{
   Delay(10);
   if(Key_add==0)
   {
    count0 +=20;
   
    if(count0 >= 100)
    {
     count0 = 100;
    }
   }
   while(!Key_add);//等待键松开
}
}
/******按键处理减pwm占空比,电机减速*****/
void Motor_speed_low(void)
{
if(Key_dec==0)
{
   Delay(10);
   if(Key_dec==0)
   {
    count0 -= 20;
   
    if(count0 <= 0)
    {
     count0 = 0;
    }
   }
   while(!Key_dec );
}
}
/******************电机的启停控制*******************/
void start_stop()
{start = 0;
        PWM1 =0;
        PWM2 =0;
        while(1)
        {
                if(Key_start_stop==0)
                {
                    while(Key_start_stop == 0);
                        start = ~start;
                    if(start == 1)
                        {
                           PWM1 = 1;PWM2 = 0;
                        }
                        else
                        {
                                PWM1 =0;PWM2 =0;
                        }
                }
        }               
}

/************电机正反向控制**************/
void Motor_turn(void)
{
if(Key_turn == 0)
{
   Delay(10);
   if(Key_turn == 0)
   {
    Flag = ~Flag;
   }
   while(!Key_turn);
}
}
/***********定时器0初始化***********/
void Timer0_init(void)
{
TMOD=0x01; //定时器0工作于方式1
TH0=TH0_TL0/256;
TL0=TH0_TL0%256;
TR0=1;
ET0=1;
EA=1;
}
/*********主函数********************/
void main(void)
{
Timer0_init();
   start_stop();
while(1)
{
  
   Motor_turn();
   Motor_speed_high();
   Motor_speed_low();
}
}
/**************定时0中断处理******************/
void Timer0_int(void) interrupt 1 using 1
{
TR0 = 0;//设置定时器初值期间,关闭定时器
TL0 = TH0_TL0 % 256;
TH0 = TH0_TL0 / 256 ;//定时器装初值
TR0 = 1;
if(Time_delay != 0)//延时函数用
{
   Time_delay--;
}
if(start==0)
                {
                PWM1 = 0;
                PWM2 = 0;
                }
                else
           PWM1 = 1;
           PWM2 = 0        ;
if(Flag == 1)//电机正转
{
   PWM1 = 0;
  
   if(++count1 < count0)
   {
    PWM2 = 1;
   }
    else
     PWM2 = 0;

    if(count1 >= 100)
    {
     count1=0;
    }
}
   else //电机反转
   {
    PWM2 = 0;
   
    if(++count1 < count0)
    {
     PWM1 = 1;
    }
     else
     PWM1 = 0;
   
     if(count1 >= 100)
     {
      count1=0;
     }
   }
}
回复

点赞

发表于 2017-1-5 19:28:36  
J636495 发表于 2016-12-25 15:14
/*******************************************************************/
/* 程序名:PWM直流电机调速 */
/* 晶振:11.00592 MHz CPU型号:AT89C51 */

我用L298N连接只会转不会加速,还有就是PWM的那俩个引脚是接298的INPUT端吗
回复

点赞

实习生

发表于 2017-3-8 12:14:42  
我的小小空间 发表于 2017-1-5 19:28
我用L298N连接只会转不会加速,还有就是PWM的那俩个引脚是接298的INPUT端吗

是的,你看看你的pwm有没有问题呢
回复

点赞

发表于 2017-3-13 15:42:34  
黑眼圈红了 发表于 2016-12-12 16:30
其实这不是重点啦,重点是为什么我有了加减速声音还辣么大,好心累。。。

电机声音大可能还是你没有做细分,电机在震动
回复

点赞

12下一页
高级模式
您需要登录后才可以回帖 登录 | 注册

专家问答 查看更多>>
关闭

站长推荐 上一条 /6 下一条

小黑屋|手机版|Archiver| 电子发烧友 ( 粤ICP备14022951号-2 )     

GMT+8, 2017-3-28 21:59 , Processed in 0.153908 second(s), 15 queries , Memcache On.

微信扫描
快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

我的提问

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

单片机论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

-

硬件设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

树莓派论坛

智能硬件论坛

开发快智能硬件开发平台

Intel物联网开发者专区

Waveshare

乐美客SBC专区

Arduino论坛

BeagleBone论坛

机器人论坛

创客神器NanoPi

小钢炮CANNON

比派科技banana pi专区

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

个人版区

阿东Verilog技术专版

直流马达驱动电路设计

LabVIEW英雄联盟

特权同学FPGA专区

-

厂商专区

灵动微电子 MM32

盈鹏飞嵌入式

TI论坛

TI Deyisupport社区

芯灵思嵌入式论坛

Tisan

米尔科技

庆科社区

WIZnet技术专区

Cypress技术论坛

飞凌嵌入式

Qualcomm技术论坛

英创嵌入式

机智云GoKit论坛

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区