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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3576|回復: 7
收起左側

電機控制問題困擾了我幾天了,有好的辦法,在文檔里給我解答,謝謝

[復制鏈接]
ID:37147 發表于 2016-12-4 11:43 | 顯示全部樓層 |閱讀模式
問題困擾了我幾天了,有好的辦法,在文檔里給我解答,謝謝、

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

  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轉動節拍總數
  6. void startmotor1(unsigned long angle1);//電機1函數       
  7. static unsigned char index1 =0;//節拍輸出索引1
  8. unsigned char code beatcode1[8]={0x1,0x3,0x2,0x6,0x4,0xc,0x8,0x9};//步進電機1、3節拍控制碼
  9. uchar temp1=0;//臨時變量
  10. uchar n=0;//小電機中斷頻率計數變量
  11. uint k=0;//小電機刷新節拍計數
  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()                   //蜂鳴器函數
  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函數
  57.                          }

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

  64. }

  65. void motor1()        //電機函數;固定格式,調用就行。
  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刷新一次節拍;
  100.                                 {
  101.                                         n=5;
  102.                                         k++;  //第3圈節拍計數;
  103.                                         if(k==4076)         //第3圈以3ms的速度刷新4076個節拍后(即轉了一圈),停止轉動。
  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刷新一次節拍;
  117.                                 {
  118.                                         n=2;
  119.                                         k++;   //第2圈節拍計數;
  120.                                         if(k==4076)        //第2圈以2ms的速度刷新4076個節拍后(即轉了一圈),重新設置速度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刷新一次節拍;
  130.                         {
  131.                                 n=0;
  132.                                 k++;           //第1圈節拍計數;
  133.                                         if(k==4076)         //第1圈以1ms的速度刷新4076個節拍后(即轉了一圈),重新設置速度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++;         //小電機中斷刷新頻率計數
  149.         flag1=1;//標志的作用是跳至主函數中,以節省中斷時間。
  150. }
復制代碼


問題困擾了我幾天了,有好的辦法,在文檔里給我解答,謝謝.rar

4.53 KB, 下載次數: 6, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:1 發表于 2017-1-10 00:17 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:37147 發表于 2017-1-10 20:45 | 顯示全部樓層
admin 發表于 2017-1-10 00:17
好資料,51黑有你更精彩!!!

問題已經解決了。謝謝
回復

使用道具 舉報

ID:1 發表于 2017-1-10 20:59 | 顯示全部樓層
怎么解決的能分享一下嗎?
回復

使用道具 舉報

ID:37147 發表于 2017-1-10 21:40 | 顯示全部樓層
admin 發表于 2017-1-10 20:59
怎么解決的能分享一下嗎?

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

使用道具 舉報

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






回復

使用道具 舉報

ID:37147 發表于 2017-1-11 08:53 | 顯示全部樓層
lkc8210 發表于 2017-1-10 23:08
雖然樓主的問題解決了,但我還是想分享一下我的想法,看看可不可行
uchar ScanTime = 0;  //創建一個全局 ...

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

使用道具 舉報

ID:37147 發表于 2017-1-11 09:08 | 顯示全部樓層
admin 發表于 2017-1-10 20:59
怎么解決的能分享一下嗎?

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91社区在线观看播放 | 精品免费国产一区二区三区 | 中文字幕一区二区视频 | av在线免费看网址 | 亚洲精品久久久一区二区三区 | 成人精品久久 | 午夜影院在线观看免费 | 一区二区视频在线 | 无码国模国产在线观看 | 成人性生交大片 | 欧美视频免费在线观看 | 国产精品夜夜春夜夜爽久久电影 | 欧美一区二区三 | 久久精品99 | 日韩在线播放第一页 | 色婷婷综合在线观看 | 日韩成人中文字幕 | 午夜视频在线免费观看 | 精品一区二区三区在线视频 | 欧美精品一区免费 | 久久国内精品 | 国产久 | 日韩在线视频一区二区三区 | 91资源在线观看 | 亚洲欧美日韩精品久久亚洲区 | 久久久久久久一区二区三区 | 亚洲一区视频在线 | 欧美vide| 麻豆91av| 自拍偷拍中文字幕 | 超碰97人人人人人蜜桃 | 国产成人免费视频 | 九九热re| 国产一区二区在线播放 | 亚洲精品免费观看 | 精品视频一区二区三区在线观看 | 午夜精品久久久久久久久久久久久 | 国产色| 国产精品永久免费视频 | 99久久免费精品视频 | 精品视频一区二区三区在线观看 |