久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3480|回復: 7
打印 上一主題 下一主題
收起左側

電機控制問題困擾了我?guī)滋炝耍泻玫霓k法,在文檔里給我解答,謝謝

[復制鏈接]
跳轉到指定樓層
樓主
ID:37147 發(fā)表于 2016-12-4 11:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
問題困擾了我?guī)滋炝耍泻玫霓k法,在文檔里給我解答,謝謝、

方案一:
1、誰能提供一個思路:用一個固定的中斷時間,中斷一次,變量加一次。變量每加一次,刷新的數(shù)據(jù)更新一次,這個變量的作用是:改變中斷的頻率的。比如說:一開始定時1ms中斷一次,刷新一次數(shù)據(jù),然后又中斷一次,變量在之前的基礎上加一,即2ms后數(shù)據(jù)跟著刷新一次,再中斷一次,3ms后數(shù)據(jù)刷新一次,依次往下進行,即想實現(xiàn)勻減速。之所以用固定時間中斷是因為我還需要一個脈沖(這個可以實現(xiàn),但是實現(xiàn)不了勻減速)。
我現(xiàn)在這程序,你們看下,步進電機設置了3個速度,一圈一個固定速度,不是我想要的。我想要的是總共轉3圈的話,速度慢慢降下來,減速的等級設多點,平滑點就好了。
方案二:
2、當然你們要說改變定時器的初值的話,這樣行,我實現(xiàn)了電機的勻減速,我還需要一個固定的脈沖,定時的初值又是變化的,又實現(xiàn)不了固定脈沖了。這兩個方案,問題相互交叉,很是煩惱。
方案三:
3、你們會想使用2個定時器,一個定時器給電機做勻減速運動,一個定時器做固定脈沖輸出,我試了,勻減速沒問題,但是固定脈沖會受影響,不是一個穩(wěn)定的脈沖占空比。

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. volatile unsigned long beats1=0;//電機1轉動節(jié)拍總數(shù)
  6. void startmotor1(unsigned long angle1);//電機1函數(shù)       
  7. static unsigned char index1 =0;//節(jié)拍輸出索引1
  8. unsigned char code beatcode1[8]={0x1,0x3,0x2,0x6,0x4,0xc,0x8,0x9};//步進電機1、3節(jié)拍控制碼
  9. uchar temp1=0;//臨時變量
  10. uchar n=0;//小電機中斷頻率計數(shù)變量
  11. uint k=0;//小電機刷新節(jié)拍計數(shù)
  12. void delay(unsigned char i)
  13. {
  14.         unsigned x,y;
  15.         for(x=i;x>0;x--)
  16.                 for(y=50;y>0;y--);
  17. }

  18. bit flag1=0,flag2=0,flag3=0,flag4=0;
  19. unsigned char dir=0;
  20. sbit k1=P3^5;//按鍵1--啟動電機/正轉
  21. sbit k2=P3^6;//按鍵2--電機反轉
  22. sbit k3=P3^7;//按鍵3--暫停/開始
  23. sbit PWM=P2^0;//42步進電機脈沖引腳
  24. sbit buffer=P2^5;//蜂鳴器
  25. sbit fangxiang=P2^6;//電機正反轉控制線
  26. sbit EN=P2^7;                //使能停止線
  27. sbit P1_0=P1^0;
  28. sbit P1_1=P1^1;
  29. sbit P1_2=P1^2;
  30. sbit P1_3=P1^3;
  31. sbit P1_4=P1^4;
  32. sbit P1_5=P1^5;
  33. sbit P1_6=P1^6;
  34. sbit P1_7=P1^7;
  35. void di()                   //蜂鳴器函數(shù)
  36. {
  37.         unsigned char a;
  38.         for(a=0;a<100;a++)
  39.         {
  40.             delay(1);
  41.                 buffer=0;
  42.                 delay(1);
  43.                 buffer=1;
  44.          }        
  45. }
  46. void keyscan()                //按鍵掃描程序
  47. {
  48.                 if(k1==0)
  49.                         delay(10);                                   //消抖
  50.                         if(k1==0)                                  //啟動電機
  51.                         {      
  52.                                  while(!k1);                          //等待按鍵1松手
  53.                                 TR0=1;

  54.                         //        EN=1;
  55.                         //        fangxiang=0;
  56.                                 startmotor1(360*5);          //調用電機1函數(shù)
  57.                          }

  58. }
  59. void startmotor1(unsigned long angle1) //步進電機1啟動函數(shù),angle1為所轉動角度
  60. {
  61.         EA=0;
  62.         beats1=(angle1*4076)/360;
  63.         EA=1;

  64. }

  65. void motor1()        //電機函數(shù);固定格式,調用就行。
  66. {
  67.                         if(beats1!=0)
  68.                                 {
  69.                                         temp1=P1;
  70.                                         temp1=temp1&0xf0;                //清零P1口低4位  11110000
  71.                                         temp1=temp1|beatcode1[index1];
  72.                                         P1=temp1;
  73.                                         index1++;
  74.                                         index1=index1&0x07;
  75.                                         beats1--;
  76.                                 }
  77.                                 else
  78.                                 {                  
  79.                                     P1_0=0;
  80.                                         P1_1=0;
  81.                                         P1_2=0;
  82.                                         P1_3=0;         
  83.                                 }
  84. }

  85. void main()
  86. {  
  87.         TMOD=0x01;//設置T0為模式1
  88.         TH0=0xfc; //1ms中斷一次
  89.         TL0=0x18;
  90.         ET0=1;
  91.         while(1)
  92.         {
  93.                 keyscan();        //按鍵掃描
  94.                 if(flag1==1)  
  95.                 {
  96.                         flag1=0;
  97.                         if(flag3==1) //進入第3圈速度;
  98.                         {
  99.                                 if(n==8) //第3圈速度,3ms刷新一次節(jié)拍;
  100.                                 {
  101.                                         n=5;
  102.                                         k++;  //第3圈節(jié)拍計數(shù);
  103.                                         if(k==4076)         //第3圈以3ms的速度刷新4076個節(jié)拍后(即轉了一圈),停止轉動。
  104.                                         {
  105.                                                 k=0;
  106.                                                 beats1=0;//停止轉動
  107.                                                 flag3=0;//標志3清楚,以便再次啟動定時器;
  108.                                                 n=0;        //n清零
  109.                                                 TR0=0;//關定時器       
  110.                                         }
  111.                                  motor1();
  112.                                 }
  113.                         }
  114.                         if(flag2==1)  //進入第2圈速度;
  115.                         {
  116.                                 if(n==4)  //第2圈速度,2ms刷新一次節(jié)拍;
  117.                                 {
  118.                                         n=2;
  119.                                         k++;   //第2圈節(jié)拍計數(shù);
  120.                                         if(k==4076)        //第2圈以2ms的速度刷新4076個節(jié)拍后(即轉了一圈),重新設置速度n=5,進入標志3判斷;
  121.                                         {
  122.                                                 k=0;
  123.                                                 n=5;
  124.                                                 flag3=1;   //速度3標志,進入速度3,3ms刷新一次;
  125.                                         }       
  126.                                 motor1();
  127.                                 }
  128.                         }  
  129.                         if(n==1)           //進入第1圈速度,1ms刷新一次節(jié)拍;
  130.                         {
  131.                                 n=0;
  132.                                 k++;           //第1圈節(jié)拍計數(shù);
  133.                                         if(k==4076)         //第1圈以1ms的速度刷新4076個節(jié)拍后(即轉了一圈),重新設置速度n=2,進入標志2判斷;
  134.                                         {
  135.                                                 k=0;
  136.                                                 n=2;
  137.                                                 flag2=1;//速度2標志,進入速度2,2ms刷新一次;
  138.                                         }
  139.                                 motor1();                               
  140.                         }  
  141.                 }
  142.         }
  143. }


  144. void timer0() interrupt 1                
  145. {
  146.         TH0=0xfc; //重新賦值,1ms中斷一次
  147.         TL0=0x18;
  148.         n++;         //小電機中斷刷新頻率計數(shù)
  149.         flag1=1;//標志的作用是跳至主函數(shù)中,以節(jié)省中斷時間。
  150. }
復制代碼


問題困擾了我?guī)滋炝耍泻玫霓k法,在文檔里給我解答,謝謝.rar

4.53 KB, 下載次數(shù): 6, 下載積分: 黑幣 -5

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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2017-1-10 00:17 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:37147 發(fā)表于 2017-1-10 20:45 | 只看該作者
admin 發(fā)表于 2017-1-10 00:17
好資料,51黑有你更精彩!!!

問題已經(jīng)解決了。謝謝
回復

使用道具 舉報

地板
ID:1 發(fā)表于 2017-1-10 20:59 | 只看該作者
怎么解決的能分享一下嗎?
回復

使用道具 舉報

5#
ID:37147 發(fā)表于 2017-1-10 21:40 | 只看該作者
admin 發(fā)表于 2017-1-10 20:59
怎么解決的能分享一下嗎?

可以,有時間分享出來,就在這幾天。
回復

使用道具 舉報

6#
ID:161164 發(fā)表于 2017-1-10 23:08 | 只看該作者
雖然樓主的問題解決了,但我還是想分享一下我的想法,看看可不可行
uchar ScanTime = 0;  //創(chuàng)建一個全局變數(shù),預設刷新時間
把以下代碼替換 if(flag1==1) {}里的代碼
if(flag1==1)  
{
                flag1=0;
                if(n>=ScanTime)           //進入第1圈速度,預設1ms刷新一次節(jié)拍;
                {
                                n=0;
                                k++;           //節(jié)拍計數(shù);
                                if(k>=1019)         //1019 = 4076*3(圈)/12(級)
                                {
                                                k=0;
                                                ScanTime++; //延長刷新時間
                                                if(ScanTime>=12)  //12級減速
                                                {
                                                        beats1=0;//停止轉動
                                                        TR0=0;//關定時器
                                                }
                                }
                                motor1();                                
                }  
}






回復

使用道具 舉報

7#
ID:37147 發(fā)表于 2017-1-11 08:53 | 只看該作者
lkc8210 發(fā)表于 2017-1-10 23:08
雖然樓主的問題解決了,但我還是想分享一下我的想法,看看可不可行
uchar ScanTime = 0;  //創(chuàng)建一個全局 ...

對的,我也是按照這個思路寫的
回復

使用道具 舉報

8#
ID:37147 發(fā)表于 2017-1-11 09:08 | 只看該作者
admin 發(fā)表于 2017-1-10 20:59
怎么解決的能分享一下嗎?

管理員您好,需要分享的資料,我已經(jīng)分享出來了,麻煩您審核通過一下,供大家參考、學習!謝謝!
回復

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日一区二区 | 亚洲精品成人在线 | 免费看大片bbbb欧美 | 一级片网址 | 国产一区精品在线 | 久草在线 | 久久久久久久久久久久亚洲 | 亚洲一区 | 日韩影院在线 | 国产精品久久久久久 | 日本特黄a级高清免费大片 成年人黄色小视频 | 剑来高清在线观看 | 成人午夜激情 | 日韩精品在线观看网站 | 国产综合精品一区二区三区 | 欧美激情久久久 | 国产成人精品福利 | 久久av在线播放 | 特黄色一级毛片 | 欧美精品成人一区二区三区四区 | 欧美成年黄网站色视频 | 国产精品18hdxxxⅹ在线 | 国产精品成人一区二区三区夜夜夜 | 欧美一区二区在线播放 | 国产伦精品一区二区三区照片91 | 亚洲一区二区中文字幕 | 一级黄色在线 | 人人干人人爽 | 91视视频在线观看入口直接观看 | 亚洲国产精品久久久 | 一级全黄少妇性色生活免费看 | 国产无套一区二区三区久久 | 四虎影| 国产精品免费看 | 国产免费一区 | 国产一区二区在线免费观看 | 在线一区 | 91免费入口 | 久久久久久久综合 | 国内激情av片 | 久久国产精品久久国产精品 |