找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2353|回复: 0
收起左侧

基于l297的51单片机步进电机转速控制问题

[复制链接]
ID:342015 发表于 2018-6-5 20:40 | 显示全部楼层 |阅读模式
我们用T0来发出不同占空比的脉冲来控制电机转速,然后用T1去计T0发出脉冲的数量来达到我们所需要的步数,达到步数后电机停止并且蜂鸣器响。我们现在的问题是用键盘在液晶屏上控制转速和步数后,发送给我们的两个定时器作为初值去运转电机,但是设置的转速一旦大于30(r/min),电机就会一直转下去不会停止,蜂鸣器也不会叫,而且不论转速怎么提升,电机的转动速度都差不多不会变,只有在转速设定小于30的时候才能正常实现我们的功能,用设定转速行走我们所规定的步数后电机停止并且蜂鸣器报警。求51hei论坛大佬进行指点!!!

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
QQ图片20180605203237.png

单片机源程序如下:
  1. #include <reg52.h>      
  2. #include <intrins.h>  
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. sbit  LCD_RS = P2^0;               
  6. sbit  LCD_RW = P2^1;
  7. sbit  LCD_EN = P2^2;
  8. sbit S1=P2^3;   //定义键-----进入设置界面
  9. sbit S2=P2^4;   //定义键-----调整光标位置
  10. sbit S3=P2^5;   //定义键-----调整光标位置数值
  11. sbit S4=P2^6;   //定义键-----保存设置值
  12. sbit S5=P2^7;   //定义键-----发送键
  13. uchar code table1[]="z:0 v:000 b:000";
  14. uchar code table0[]="       000";
  15. uchar S1num,S2num,S3num;

  16. uint z,v1,v2,v3,b1,b2,b3,sv;
  17. uchar i;
  18.   void delay(uint z)      //延时函数
  19.   {
  20.    int x,y;
  21.    for(x=z;x>0;x--)
  22.    for(y=110;y>0;y--);
  23.     }
  24.   
  25.   void LCD_write_data(uint dat) //写数据
  26.       {
  27.       LCD_RS = 1;
  28.       LCD_RW = 0;
  29.                         LCD_EN = 0;
  30.                         P1=dat;
  31.       delay(5);
  32.       LCD_EN = 1;
  33.       delay(5);
  34.       LCD_EN = 0;
  35.       }
  36.           
  37.   void LCD_write_com(uint com)  //写指令
  38.       {                                 
  39.       LCD_RS = 0;
  40.       LCD_RW = 0;
  41.                         LCD_EN = 0;
  42.                         P1=com;               
  43.       delay(5);
  44.       LCD_EN = 1;
  45.       delay(5);
  46.       LCD_EN = 0;
  47.       }

  48. void init()//1602初始化
  49. {
  50.             z=0;
  51.             v1=0;
  52.             v2=0;
  53.             v3=0;
  54.             b1=0;
  55.             b2=0;
  56.             b3=0;
  57.             sv=0;
  58.             LCD_write_com(0x38);
  59.             LCD_write_com(0x01);
  60.             LCD_write_com(0x06);
  61.             LCD_write_com(0x0c);
  62. }
  63.   void write_v1(uchar add,uint dat)//写转速v函数
  64.                        
  65. {
  66.             uchar bai;
  67.                         bai=dat;
  68.             LCD_write_com(0xc0+add);
  69.             LCD_write_data(0x30+bai);
  70. }
  71. void write_v2(uchar add,uint dat)//写转速v函数
  72.                        
  73. {
  74.             uchar shi;
  75.             shi=dat;
  76.             LCD_write_com(0xc0+add);
  77.             LCD_write_data(0x30+shi);
  78. }
  79. void write_v3(uchar add,uint dat)//写转速v函数
  80.                        
  81. {
  82.             uchar ge;
  83.             ge=dat;
  84.             LCD_write_com(0xc0+add);
  85.             LCD_write_data(0x30+ge);
  86. }
  87. void write_b1(uchar add,uint dat)//写步数b函数
  88.                        
  89. {
  90.             uint bai;
  91.                         bai=dat;
  92.             LCD_write_com(0xc0+add);
  93.             LCD_write_data(0x30+bai);

  94. }
  95. void write_b2(uchar add,uint dat)//写步数b函数
  96.                        
  97. {
  98.             uint shi;
  99.             shi=dat;
  100.             LCD_write_com(0xc0+add);
  101.             LCD_write_data(0x30+shi);
  102. }
  103. void write_b3(uchar add,uint dat)//写步数b函数
  104.                        
  105. {
  106.             uint ge;
  107.             ge=dat;
  108.             LCD_write_com(0xc0+add);
  109.             LCD_write_data(0x30+ge);
  110. }
  111. void write_z(uchar add,uint dat)//写转向z函数
  112.                        
  113. {
  114.                         uint ge;
  115.             ge=dat;
  116.             LCD_write_com(0xc0+add);
  117.             LCD_write_data(0x30+ge);
  118. }
  119.   void write_sv(uchar add,uint dat)//写实际转速sv函数
  120.                        
  121. {
  122.             uint bai,shi,ge;
  123.                         bai=dat/100;
  124.             shi=dat%100/10;
  125.             ge=dat%10;
  126.             LCD_write_com(0x80+add);
  127.             LCD_write_data(0x30+bai);
  128.             LCD_write_data(0x30+shi);
  129.             LCD_write_data(0x30+ge);
  130. }
  131. void display()//1602初始化显示函数
  132. {     
  133.             init();
  134.                         LCD_write_com(0x80|0x10);
  135.            for(i=0;i<11;i++)
  136.           {
  137.                         LCD_write_data(table0[i]);
  138.                         delay(5);
  139.     }
  140.                 LCD_write_com(0xc0);
  141.            for(i=0;i<15;i++)
  142.           {
  143.                         LCD_write_data(table1[i]);
  144.                         delay(5);
  145.     }
  146.                 write_z(2,z);
  147.                 write_v1(6,v1);
  148.                 write_v2(7,v2);
  149.                 write_v3(8,v3);
  150.                 write_b1(12,b1);
  151.                 write_b2(13,b2);
  152.                 write_b3(14,b3);
  153.                 write_sv(6,sv);
  154.                 S1num=0;
  155.                 S2num=0;
  156.                 S3num=0;
  157.   }

  158. void keyscan()//键盘扫描函数
  159. {
  160.         if(S1==0)//按键S1按下时
  161.         {   
  162.             S1num=1;
  163.                 delay(20);
  164.                 if(S1==0)
  165.                 {
  166.                         LCD_write_com(0xc0+2);//光标到转向位置处
  167.                         LCD_write_com(0x0f);//光标闪烁
  168.                 }
  169.         }
  170.         if(S1num!=0)//只有按键S1按下后,S2,S3,S4按键操作才有效
  171.         {
  172.                 if(S2==0)//按键S2按下时
  173.                 {
  174.                        
  175.                         delay(20);
  176.                         if(S2==0)
  177.                         {
  178.                                 S2num++;
  179.                           while(!S2);//松手检测
  180.                                 if(S2num==0)
  181.                                         {
  182.                                 LCD_write_com(0xc0+2);//光标到指定位置
  183.                                         }
  184.                           if(S2num==1)
  185.                           {
  186.                         LCD_write_com(0xc0+6);//光标到指定位置
  187.                           }
  188.                            if(S2num==2)
  189.                           {
  190.                         LCD_write_com(0xc0+7);
  191.                           }
  192.                           if(S2num==3)
  193.                           {
  194.                         LCD_write_com(0xc0+8);
  195.                           }
  196.                                 if(S2num==4)
  197.                           {
  198.                         LCD_write_com(0xc0+12);
  199.                           }
  200.                                 if(S2num==5)
  201.                           {
  202.                         LCD_write_com(0xc0+13);
  203.                           }
  204.                                 if(S2num==6)
  205.                           {
  206.                         LCD_write_com(0xc0+14);
  207.                           }
  208.                                 if(S2num==7)
  209.                           {
  210.                                         LCD_write_com(0xc0+2);
  211.                             S2num=0;
  212.                           }
  213.                  }
  214.                  }  
  215.                                 if(S3==0)//按键S3按下时
  216.                 {
  217.                             delay(20);
  218.                                 if(S3==0)
  219.                                 {
  220.                                 while(!S3);
  221.                                         if(S2num==0)
  222.                                         {
  223.                                                 z++;
  224.                                                 if(z==2)
  225.                                                 {
  226.                                                     z=0;
  227.                                                 }
  228.                                                 write_z(2,z);
  229.                                                 LCD_write_com(0xc0+2);
  230.                                         }
  231.                                         if(S2num==1)
  232.                                         {
  233.                                            v1++;
  234.                                                 if(v1==10)
  235.                                                 {
  236.                                                    v1=0;
  237.                                                 }
  238.                                                 write_v1(6,v1);
  239.                                                 LCD_write_com(0xc0+6);
  240.                                         }
  241.                                         if(S2num==2)
  242.                                         {   
  243.                                                         v2++;
  244.                                                         if(v2==10)
  245.                                                         {
  246.                                                             v2=0;
  247.                                                         }
  248.                                                         write_v2(7,v2);
  249.                                                 LCD_write_com(0xc0+7);
  250.                                         }
  251.                                 if(S2num==3)
  252.                                         {
  253.                                                         v3++;
  254.                                                         if(v3==10)
  255.                                                         {
  256.                                                             v3=0;
  257.                                                         }
  258.                                                         write_v3(8,v3);
  259.                                                 LCD_write_com(0xc0+8);
  260.                                         }
  261.                                         if(S2num==4)
  262.                                         {
  263.                                                    b1++;
  264.                                                         if(b1==10)
  265.                                                         {
  266.                                                             b1=0;
  267.                                                         }
  268.                                                         write_b1(12,b1);
  269.                                                 LCD_write_com(0xc0+12);
  270.                                         }
  271.                                         if(S2num==5)
  272.                                         {                               
  273.                                                         b2++;
  274.                                                         if(b2==10)
  275.                                                         {
  276.                                                             b2=0;;
  277.                                                         }
  278.                                                         write_b2(13,b2);
  279.                                                 LCD_write_com(0xc0+13);
  280.                                         }
  281.                                         if(S2num==6)
  282.                                         {
  283.                                                         b3++;
  284.                                                         if(b3==10)
  285.                                                         {
  286.                                                             b3=0;
  287.                                                         }
  288.                                                         write_b3(14,b3);
  289.                                                 LCD_write_com(0xc0+14);
  290.                                         }
  291.                                 }
  292.                             }
  293.            if(S4==0)//按键S4按下时
  294.                  
  295.            {
  296.                   delay(5);
  297.                   if(S4==0)
  298.                   {
  299.                         S1num=0;
  300.                         S2num=0;
  301.                         S3num=0;
  302.                         LCD_write_com(0x0c);
  303.                   }
  304.                 }
  305.            }
  306.          }
  307. void main()
  308. {
  309.             display();//1602显示
  310.        
  311.             while(1)
  312.              {
  313.                                  keyscan();//不断检测键是否按下
  314.                          }
  315. }
复制代码

所有资料51hei提供下载:
最新.zip (265.78 KB, 下载次数: 29)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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