OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4755|回复: 1

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

[复制链接]

2

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2021-5-15
在线时间
1 小时
发表于 2021-5-15 20:59:22 | 显示全部楼层 |阅读模式
现在我可以控制步进电机的启停和正反转,但是控制不了速度,就算不用按键控制,直接修改定时器中断的时间也改变不了步进电机的转速,电机就只能一直以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();      
                              
                }
               

}
      


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2021-5-20 15:47:57 | 显示全部楼层

回帖奖励 +1 金钱

本帖最后由 zhxzhx 于 2021-5-20 15:49 编辑

你在 timer0 里 改变timer1定时周期有什么用?另外,timer1 中断根本没有存在的必要,main里除了 Key_motor 就没干别的.
另外 CYCLE 是一个整形,要保证原子操作.
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-26 06:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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