找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1378|回复: 9
收起左侧

单片机按键控制步进电机不能准确实现,求高人指点

[复制链接]
ID:610895 发表于 2019-9-25 11:35 | 显示全部楼层 |阅读模式
STC89C52,以下程序可以仿真运行,就是用按键改变频率和脉冲数量不能准确实现,频率加可以循环,频率减也可以,而且不准确。角度加按到最后就直接成单一电平,不再变化,角度减按下就直接成单一电平,不能再变化。本人初学C语言,求高人指点问题出在哪里?是参数设置和单片机不匹配还是程序不完善?
#include reg52.h //这是一个按键驱动步进电机的程序
sbit k1=P1^2;//k1按下执行void Manual();
sbit k9=P3^1; //频率减
sbit k10=P3^0;  //频率加
sbit k11=P2^7;//角度加
sbit k12=P2^6;//角度减

sbit PWM=P2^3;//pwm输出
sbit DIR=P2^4;//换向电平输出
sbit EN=P2^5;//电机使能

unsigned int i,tt=1500,step=50;定义变量,tt用来确定频率,step用来确定脉冲数量
void keyscan();//按键k1检测
void keyscan1();//按键k9~k12检测

void Manual();步进电机手动控制程序
void shoudong();//手动程序调用开中断程序
void main(void)//主程序,主要是按键k1检测
{
        while(1)
{
        keyscan();
}
}

void keyscan()
{
while(1)
{
        if(k1==0)        Manual();
}

}
void keyscan1()//按键k9~12检测程序及改变tt、step的值
{
while(1)
{        
        if(k9==0)
                {
                tt < 1500;
                tt=tt+100;//tt初始值设置为1500,这是减速语句,变化范围1500~500
          }
        else if(k10==0)
        {        
                tt > 500;//这是加速语句
                tt=tt-100;
        }
        else if(k11==0)
        {
                step < 200;//step初始设置50,范围50~200,实际测试50时25个脉冲
                step=step+50;
        }
        else if(k12==0)
        {
                step > 50;
                step=step-50;
        }
}
}

void Manual()
        {
                  while(1)
                        {
                        shoudong();
                        keyscan1();
                        keyscan();
      }                                
        }

void shoudong()
{
  TMOD=0x01;
  TH0=(65536-tt)/256;
  TL0=(65536-tt)%256;
  EA=1;
  ET0=1;
  TR0=1;
}
void zhongduan( ) interrupt 1
{   
    TH0=(65536-tt)/256;
    TL0=(65536-tt)%256;
    PWM=~PWM;
          i++;
          if(i==step)
                {
     i=0;
                 DIR=~DIR;
    }
}

回复

使用道具 举报

ID:235200 发表于 2019-9-25 12:13 | 显示全部楼层
程序设计的按键进行步进增和减,首先要保证每一次按键只改变一次数据,另外tt增减后建议进行一次判断,如果超过上限或下限值,要修改上限或下限值为初始值
回复

使用道具 举报

ID:275826 发表于 2019-9-25 12:41 | 显示全部楼层
你的程序结构很乱呀,KEYSCAN()调用了自己
回复

使用道具 举报

ID:610895 发表于 2019-9-25 13:58 来自手机 | 显示全部楼层
tyrl800 发表于 2019-9-25 12:41
你的程序结构很乱呀,KEYSCAN()调用了自己

单循环应该没影响
回复

使用道具 举报

ID:610895 发表于 2019-9-25 13:59 来自手机 | 显示全部楼层
csmyldl 发表于 2019-9-25 12:13
程序设计的按键进行步进增和减,首先要保证每一次按键只改变一次数据,另外tt增减后建议进行一次判断,如果超 ...

修改为上下限可以吗?
回复

使用道具 举报

ID:142699 发表于 2019-9-25 15:01 | 显示全部楼层
建议去看一下PID算法控制相关的内容,还有你这个按键没防抖是肯定不行的- -
回复

使用道具 举报

ID:213173 发表于 2019-9-25 17:54 | 显示全部楼层
楼主这个程序连正常运行的最基本的条件都不具备,甚至离谱在子程序中调用自己,并且用了许多死循环,竟然声称可以仿真运行。建议楼主找点相对成熟点的例程参考,基本读懂别人的程序再自己写。
回复

使用道具 举报

ID:610895 发表于 2019-9-25 23:04 来自手机 | 显示全部楼层
wulin 发表于 2019-9-25 17:54
楼主这个程序连正常运行的最基本的条件都不具备,甚至离谱在子程序中调用自己,并且用了许多死循环,竟然声 ...

确实错了,复制粘贴时犯错了,那个按键检测应该是一个STOP函数
回复

使用道具 举报

ID:610895 发表于 2019-9-26 14:13 来自手机 | 显示全部楼层
csmyldl 发表于 2019-9-25 12:13
程序设计的按键进行步进增和减,首先要保证每一次按键只改变一次数据,另外tt增减后建议进行一次判断,如果超 ...

感谢指导,现在加入延时和按键释放判断,程序完全正常!
回复

使用道具 举报

ID:610895 发表于 2019-9-29 23:21 来自手机 | 显示全部楼层
已经全部完成,感谢回复的各位!问题处在程序没有延时和检测按键松开的问题上
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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