找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1404|回复: 0
打印 上一主题 下一主题
收起左侧

关于单片机驱动步进电机转速的问题

[复制链接]
跳转到指定楼层
楼主
ID:921891 发表于 2021-5-15 20:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在我可以控制步进电机的启停和正反转,但是控制不了速度,就算不用按键控制,直接修改定时器中断的时间也改变不了步进电机的转速,电机就只能一直以10s一圈的速度转动,小弟问下各位大哥大姐们什么情况。

#include <reg51.h>
unsigned int Tspeed[3]={20,4000,10000};
unsigned char motor_time;
unsigned int CYCLE=20
bit Run_Status=0;

sbit CLK=P3^4;//脉冲
sbit ENA=P3^2; //使能
sbit DIR=P3^3;        //方向       

sbit StopStart=P1^2;         //启停                        
sbit P_ADJ=P1^3;  //增速   
sbit N_ADJ=P1^4; //降速
sbit P_TS=P1^5;//正反转
unsigned int PWM;

void key_Set()
{

        ENA=0;
        CLK=0;
        DIR=0;
}

void delay()                                  //延时函数
{
        unsigned int i =500;
        while (i--);
       
}

void TimeInit()          //定时器初始化
{

       
        TMOD |= 0x01;
        TH0=(65536-CYCLE)/256;                  //给time0装初值
        TL0=(65536-CYCLE)%256;
        TH1=(65536-1000)/256;                 //给time1装初值
        TL1=(65536-1000)%256;
  IE = 0x8A;
        PT1=1;                       //使得time1的优先级高于time0
        TR0=1;                                             //打开两个中断
        TR1=1;

}

void Key_motor()                                             
{
        {
        if(P_ADJ==0)                                 //减速
        {
                delay();                       
                if(P_ADJ==0)
            {
                        while(!P_ADJ);
                        a--;
                        if(a<1)
                        a=0;
                        CYCLE=Tspeed[a];
                        }                       
                }
        }
       
        if(P_TS==0)                                           //正反转
        {
                                 delay();
                                if(P_TS==0)
                        {
                        while(!P_TS);                          
                        DIR=1;
                        b++;
                        if(b%2==0)
                        {
                        DIR=0;
                        }
                }
        }
       
        if(N_ADJ==0)                                  //加速
        {
                delay();
                if(N_ADJ==0)
                {
                        while(!N_ADJ);
                        a++;
                        if(a>2)
                        a=2;
                        CYCLE=Tspeed[a];
                }
        }
       
        if(StopStart==0) //启停件
        {
                delay();
                if(StopStart==0)
                {
                        while(!StopStart);
                        Run_Status=~Run_Status;
                        if(Run_Status)
                        {
                                ENA=1;                 
                                TR0=1;                       
                        }
                        else
                        {
                                ENA=0;                 
                                TR0=0;                  
                        }
                }
        }
}


void Time0() interrupt 1
{
    TH1=(65536-CYCLE)/256; //产生脉冲信号
         TL1=(65536-CYCLE)%256;
         CLK=~CLK;
        PWM++;
}


void Time1() interrupt 3
{
    TH1=(65536-1000)/256;                 //按键中断
         TL1=(65536-1000)%256;
         Key_motor();               
}



void main()
{
                key_Set();
          TimeInit();
                while(1)
                        {
               
                        Key_motor();       
                               
                }
               

}
       


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表