找回密码
 立即注册

QQ登录

只需一步,快速开始

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

上位机控制步进电机细分脉冲数不正确,keil上存在的单片机程序问题

[复制链接]
跳转到指定楼层
楼主
ID:304677 发表于 2018-4-21 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下代码有部分定义未用到,请大家帮我看看为什么按照比例乘以对应的细分后的单位脉冲,得到的角度不是自己设定的,也就是最终的脉冲数不正确,无法精确控制角度,是什么原因呀。
  1. #include <reg52.h>

  2. sbit led=P0;

  3. //--------定义使用的IO口---------//
  4. sbit PWM=P1^0;       //脉冲输出                  
  5. sbit key_run=P1^4;   //启动            
  6. sbit led_run=P0^0;   //运行led指示灯
  7. sbit led_d=P0^3;     //数据是否相同检测     
  8. sbit led1=P0^4;      //接收串口数据测试灯   
  9. //-------定义全局变量--------//                  

  10. unsigned char pwm_duty=0,adc=0;
  11. unsigned char receiveData=0;                     
  12. void Turn_the_Setting_Angle(unsigned int dat);
  13. void TimeConfig();
  14. void delay(unsigned int c);//延时函数        
  15. void main(void)
  16.       {
  17.                  TimeConfig();
  18.                  led_d=0;
  19.                  led1=0;
  20.             while(1)
  21.             {
  22.                         
  23.               if(adc==1)        //P0.4口测试数据led/接收数据闪烁      
  24.                           {
  25.                                   led1=1;
  26.                                  adc=0;
  27.                           }
  28.                           Turn_the_Setting_Angle((unsigned int)(receiveData));//来自串口发来的数据
  29.                           receiveData=0;
  30.                           delay(1000);
  31.                           led1=0;

  32.             }
  33.         }

  34.            void TimeConfig()
  35.            {
  36.            EA = 0;
  37.           //***********串口时钟设置************//
  38.            TCLK=1;//串口设置时钟为定时器2
  39.            RCLK=1;
  40.            TH2=0xFF; //9600bps 11.0592MHz的时钟频率
  41.            TL2=0xDB;
  42.            RCAP2H=0xFF; //方式1和方式3的波特率=fosc/(32*(65535-(RCAP2H,RCAP2L))
  43.            RCAP2L=0xDB;
  44.            SCON=0x50;//SM0? SM1? SM2? REN? TB8 RB8? TI RI
  45.            PCON &= 0x7F; //sMOD=0;
  46.                ET2=1;
  47.            ES=1;
  48.                EA = 1;
  49.                 TR2=1;
  50.           }         
  51.           //**************串口延时函数************//
  52.                void Usart() interrupt 4
  53.             {
  54.                         adc=1;
  55.                  receiveData=SBUF;     //出去接收到的数据
  56.                    if(receiveData==0x02)//判断是否接收到相同数据
  57.                      led_d=1;
  58.                     else
  59.                      led_d=0;
  60.                          RI = 0;              //清除接收中断标志位
  61.                  SBUF=receiveData;    //将接收到的数据放入到发送寄存器
  62.                  while(!TI);                  //等待发送数据完成
  63.                  TI=0;                              //清除发送完成标志位
  64.             }         
  65. //********************让电机转到设定的角度***********************//
  66. //***************************************************************//
  67.            //dat为设定角度
  68.            void Turn_the_Setting_Angle(unsigned int dat)
  69.               {
  70.                 float i=2.222,j;              //  细分开关配置                      800/360=2.222         200/360=0.555          1600/360=4.44  3200/360=8.888  6400/360=17.778
  71.                 unsigned int Pulse_number;  // Pulse_number为脉冲数
  72.                 j=dat*i;                                 
  73. //                                j=dat/1.8;          //200脉冲时对应的步距角1.8,无细分
  74. //                  Pulse_number= (unsigned int)(j);
  75.                                 Pulse_number= (unsigned int)(j*1.412);         //1.412为上位机发来的16进制数转换为对应比例角度
  76.                         while(Pulse_number)
  77.                              {
  78.                                 PWM=0;
  79.                                 delay(20);
  80.                                 PWM=1;      
  81.                                 delay(20);
  82.                                 Pulse_number=Pulse_number-1;
  83.                              }
  84.               }


  85.              void delay(unsigned int x)        //延时1ms
  86.               {
  87.                     unsigned int i,j;
  88.                     for(i=x;i>0;i--)
  89.                      {
  90.                        for(j=110;j>0;j--) ;
  91.                      }
  92.               }
复制代码



评分

参与人数 1黑币 +1 收起 理由
LZM123 + 1 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:304677 发表于 2018-4-23 10:12 | 只看该作者
以上原因总结为,串口为接收到设定的角度,在接受到设定角度的情况下是可以实现转动固定角度的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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