找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2418|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

上位機(jī)控制步進(jìn)電機(jī)細(xì)分脈沖數(shù)不正確,keil上存在的單片機(jī)程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:304677 發(fā)表于 2018-4-21 10:41 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
以下代碼有部分定義未用到,請大家?guī)臀铱纯礊槭裁窗凑毡壤艘詫?yīng)的細(xì)分后的單位脈沖,得到的角度不是自己設(shè)定的,也就是最終的脈沖數(shù)不正確,無法精確控制角度,是什么原因呀。
  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;   //運(yùn)行l(wèi)ed指示燈
  7. sbit led_d=P0^3;     //數(shù)據(jù)是否相同檢測     
  8. sbit led1=P0^4;      //接收串口數(shù)據(jù)測試燈   
  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);//延時(shí)函數(shù)        
  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口測試數(shù)據(jù)led/接收數(shù)據(jù)閃爍      
  24.                           {
  25.                                   led1=1;
  26.                                  adc=0;
  27.                           }
  28.                           Turn_the_Setting_Angle((unsigned int)(receiveData));//來自串口發(fā)來的數(shù)據(jù)
  29.                           receiveData=0;
  30.                           delay(1000);
  31.                           led1=0;

  32.             }
  33.         }

  34.            void TimeConfig()
  35.            {
  36.            EA = 0;
  37.           //***********串口時(shí)鐘設(shè)置************//
  38.            TCLK=1;//串口設(shè)置時(shí)鐘為定時(shí)器2
  39.            RCLK=1;
  40.            TH2=0xFF; //9600bps 11.0592MHz的時(shí)鐘頻率
  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.           //**************串口延時(shí)函數(shù)************//
  52.                void Usart() interrupt 4
  53.             {
  54.                         adc=1;
  55.                  receiveData=SBUF;     //出去接收到的數(shù)據(jù)
  56.                    if(receiveData==0x02)//判斷是否接收到相同數(shù)據(jù)
  57.                      led_d=1;
  58.                     else
  59.                      led_d=0;
  60.                          RI = 0;              //清除接收中斷標(biāo)志位
  61.                  SBUF=receiveData;    //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  62.                  while(!TI);                  //等待發(fā)送數(shù)據(jù)完成
  63.                  TI=0;                              //清除發(fā)送完成標(biāo)志位
  64.             }         
  65. //********************讓電機(jī)轉(zhuǎn)到設(shè)定的角度***********************//
  66. //***************************************************************//
  67.            //dat為設(shè)定角度
  68.            void Turn_the_Setting_Angle(unsigned int dat)
  69.               {
  70.                 float i=2.222,j;              //  細(xì)分開關(guān)配置                      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為脈沖數(shù)
  72.                 j=dat*i;                                 
  73. //                                j=dat/1.8;          //200脈沖時(shí)對應(yīng)的步距角1.8,無細(xì)分
  74. //                  Pulse_number= (unsigned int)(j);
  75.                                 Pulse_number= (unsigned int)(j*1.412);         //1.412為上位機(jī)發(fā)來的16進(jìn)制數(shù)轉(zhuǎn)換為對應(yīng)比例角度
  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)        //延時(shí)1ms
  86.               {
  87.                     unsigned int i,j;
  88.                     for(i=x;i>0;i--)
  89.                      {
  90.                        for(j=110;j>0;j--) ;
  91.                      }
  92.               }
復(fù)制代碼



評分

參與人數(shù) 1黑幣 +1 收起 理由
LZM123 + 1 贊一個(gè)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:304677 發(fā)表于 2018-4-23 10:12 | 只看該作者
以上原因總結(jié)為,串口為接收到設(shè)定的角度,在接受到設(shè)定角度的情況下是可以實(shí)現(xiàn)轉(zhuǎn)動固定角度的。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表