发新帖我要提问
12
返回列表
打印

【求助】用硬件法实现步进电机的速度控制

[复制链接]
楼主: lqfy
手机看帖
扫描二维码
随时随地手机跟帖
21
明月小厨| | 2013-1-11 11:54 | 只看该作者 回帖奖励 |倒序浏览
如果用斩波的方式驱动;每一个1对应一个PWM波形输出;斩波频率通常在20KHZ-50KHZ;
频率越高,发热越厉害;

使用特权

评论回复
22
明月小厨| | 2013-1-11 11:57 | 只看该作者
如果再细;在计算每个PWM的占空比;每次不同;实现0-1的过渡,实现1-0的过渡;非常麻烦;
再引出加减速,每一步的时间都不同;简单的就直线式加减;复杂的就搞二次曲线;

使用特权

评论回复
23
skm2008| | 2013-1-11 11:59 | 只看该作者
对PWM脉宽进行控制,可以实现对速度的控制

使用特权

评论回复
24
明月小厨| | 2013-1-11 12:00 | 只看该作者
理想情况下开和关的速度完全一样;
如果不一样(其实通常都是不一样的),则要引入一个补偿值;以实测为准(精确到nS);

使用特权

评论回复
25
明月小厨| | 2013-1-11 12:01 | 只看该作者
让一个没有经验的新人做这个,决策失误!
没事,兄弟你多收集资料,一步步摸索;老板出学费;

使用特权

评论回复
26
明月小厨| | 2013-1-11 12:09 | 只看该作者
能把相关的数据收集准确,或自己建模型实测;这部分工作约占全部工作的99%;全中国也没有多少人有这份耐心来完成这个工作;
绝大多数都是直扑控制/输出;等老板一点头就OK了;

使用特权

评论回复
27
明月小厨| | 2013-1-11 12:14 | 只看该作者
我的想法是用最简单的方案实现它,PWM都不需要了;(有一种单片机,可以输出4路PWM信号;用这个实现起来要简单些);
如果最简单的方案达不到标准的要求;先坐下来和老板谈谈;降低要求或加点工资,必须的;
老板有可能不懂这些,拒绝你;
这样你就直接拍拍屁股走人;

使用特权

评论回复
28
明月小厨| | 2013-1-11 12:17 | 只看该作者
如果细分法,用中高档的单片机完成;51类的估计都不行;

使用特权

评论回复
29
lymum| | 2013-1-11 13:26 | 只看该作者
速度就是驱动脉冲频率,步数就是驱动脉冲数量

使用特权

评论回复
30
nir| | 2013-1-11 13:37 | 只看该作者
我用fpga做过。

使用特权

评论回复
31
lwq030736| | 2013-1-11 14:01 | 只看该作者
用电机驱动芯片啊,TMC260挺好的
只要按照需要发脉冲和方向就行了

使用特权

评论回复
32
明月小厨| | 2013-1-11 21:35 | 只看该作者
步进电机的驱动芯片真的是有;以前是进口的,好象很难买到;后来出现国产的;好象成都还是苏州有一家;
因为芯片的价格远比单片机类贵,所以不可能使用它们;如果用逻辑电路搭一个出来当然是可以的;我也想过这个方案,但从成本上计算,还是单片机便宜;10元左右的ARM肯定可以搞的象模象样了;如果不要求细分,最普通的51也够用了;我估计仅电烙铁+万用表+示波器不一定行;
一步一停的方式应该不行的;估计楼主的电机很小;只有小步进电机才会有高转速;

使用特权

评论回复
33
jrcsh| | 2013-1-14 23:29 | 只看该作者
  2楼的方法对了~~~~ 你只要看看楼下说的关联上的提示就行了


  28BYJ 是带减速器的,  一般常见的是 128/1  和 64/1   


  还要注意的是 你选用的拍法, 也要计算上。  
  

  假如 60N =1转 : 2转=120N  呵呵

  入门级控制方法:  等延时,换拍,上电,等延时

    优化控制方法:  等掉电延时,换拍,上电,等上电延时,换拍,掉电,等掉电延时,换拍,上电,等上电延时,换拍,掉电,

使用特权

评论回复
34
lqfy|  楼主 | 2013-3-12 15:53 | 只看该作者
#include<reg52.h>
#define uint  unsigned int
#define uchar unsigned char

sbit dir = P1^0;                                                                                        //方向电平
sbit cp  = P1^1;                                                                                        //步进脉冲信号
sbit dm = P1^5;                                                                                        //数码管断码
sbit px = P1^6;                                                                                         //数码管片选
sbit clk = P1^7;                                                                                        //数码管读写允许
sbit an1 = P3^5;                                                                                        //正传按键
sbit an2 = P3^6;                                                                                        //反转按键
sbit an3 = P3^7;                                                                                        //停止按键

uchar code a[]={0xc0,/*0*/0xf9/*1*/,0xa4/*2*/};
uchar ms,k_time;
bit ax;

void delay_ms(uint x)
{
        uint i = 0;
        while(x--)
                for(i; i < 123; i++);
}

void key()
{
        uchar k;                                                                                                 //键码转换为键值的标志
                k = 0;                                                                                                 //变量初始化
                if(an1 == 0)
                        k = 1;                                                                                         //按下AN1后,将1赋值给k
                else if(an2 == 0)
                        k = 2;                                                                                         //按下AN2后,将2赋值给k
                else if(an3 == 0)
                        k = 3;                                                                                         //按下AN3后,将3赋值给k
                if(k != 0)                                                                                         //判断按键是否按下
                {
                          k_time ++;
                        if(k_time > 5 && ax == 0)
                        {
                                ax = 1;                                                                //按下标志位
                                switch(k)
                                {
                                        case 1 : ms = 0;break;
                                        case 2 : ms = 1;break;
                                        case 3 : ms = 2;break;
                                }                        
                        }                                
                }
                else
                {
                         k_time = 0;
                        ax =  0;               
                }               
}

void led_disp()
{
        P0 = a[ms];                                                                   //送数码管扫描字
                dm = 0;                                                                   //段选段打开
                clk = 0;                                                           //送触发信号,上升沿
                clk = 1;                                                           
                dm = 1;                                                                   //段选段关闭
        P0 = ~0x01;                                                                   //送数码管断码
                px = 0;                                                                   //片选打开
                clk = 0;
                clk = 1;
                px = 1;                                                                   //片选段关闭
                delay_ms(2);
        P0 = 0xff;                                                                     //送熄灭符
                dm = px = 0;
                clk = 0;
                clk = 1;
                dm = px =1;
}

void bj(bit x)
{
        uchar i;
        dir = x;                                           //正反转赋值
        cp = ~cp;                                           //脉冲
        for(i = 0; i < 50 ; i++);

}

void init()
{
        IE = 0x82;                                                        //选中定时器1
        TMOD = 0x01;                                                //打开定时器工作方式
        TH0 = -2500/256;
        TL0 = -2500%256;
        TR0 = 1;                                                         //打开定时器0
}

void main()
{
        init();
        while(1)
        {
                key();
                led_disp();
        }
}

void time() interrupt 1
{
        TH0 = -2500/256;
        TL0 = -2500%256;
        if(ms == 1)
                bj(0);                                //正传
        else if(ms == 2)
                bj(1) ;                                //反转
}

使用特权

评论回复
35
lqfy|  楼主 | 2013-3-12 15:54 | 只看该作者
[em:6:][em:6:]

使用特权

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

本版积分规则