標(biāo)題: 為什么我用單片機(jī)操作SG90時(shí),單片機(jī)會(huì)復(fù)位 [打印本頁]

作者: 完后余生9375    時(shí)間: 2020-4-2 13:35
標(biāo)題: 為什么我用單片機(jī)操作SG90時(shí),單片機(jī)會(huì)復(fù)位
我的單片機(jī)和SG90 9g舵機(jī)是用的一個(gè)電源。信號(hào)線接在了P1^0上面。但是我用按鍵控制舵機(jī)方向的時(shí)候。遇到了以下問題。困擾許久,還請(qǐng)51黑的大神不吝賜教。

我在程序里采用count來定時(shí)。每0.5ms進(jìn)入一次中斷。count == 40為一個(gè)周期20ms。用PWM_count 控制方向。初始值為1(轉(zhuǎn)向0度)。2(轉(zhuǎn)向45度)3轉(zhuǎn)向90度。分別用s2 s3 s4按鈕對(duì)其PWM_count進(jìn)行修改。但是我在使用中發(fā)現(xiàn)。我按下s4后舵機(jī)會(huì)正常的轉(zhuǎn)到90度,然后會(huì)自己又轉(zhuǎn)回到單片機(jī)初始值的設(shè)置值1也就是0度。按下s3也是轉(zhuǎn)45度又回到0度。通過調(diào)試發(fā)現(xiàn)是PWM_count的值自動(dòng)變?yōu)榱?造成的。這種情況是單片機(jī)復(fù)位造成的嗎?

一個(gè)星期了,還是沒有解決。下面是程序,大佬們幫看看。
  1. #include<reg52.h>
  2. sbit SG_PWM=P1^0;
  3. unsigned char count=0;
  4. unsigned char PWM_count=1;                  //初始值   1--0度,2--45度,3--90
  5. unsigned char a=0;

  6. sbit s2 = P3^0;
  7. sbit s3 = P3^1;
  8. sbit s4 = P3^2;

  9. sbit led1 = P1^2;
  10. sbit led2 = P1^3;

  11. void Timer_Init()
  12. {
  13.   TMOD=0X01;      //T0定時(shí)方式1
  14.   TH0=0xfe;
  15.   TL0=0x33;       //計(jì)數(shù)初值設(shè)置為0.5ms
  16.   ET0=1;          //打開定時(shí)器0的中斷
  17.   TR0=1;          //打開定時(shí)器0
  18.   EA=1;           //開總中斷
  19. }

  20. /**
  21. * 延時(shí)函數(shù)
  22. **/
  23. void delay(unsigned int i)
  24. {
  25.         unsigned int x,y;
  26.         for(x = i; x > 0; x--)
  27.                 for(y = 120; y > 0 ; y--);
  28. }

  29. void Timer() interrupt 1      //特別注意此處,0--外部中斷0,1--定時(shí)器中斷0,2--外部中斷1,3--定時(shí)器中斷1,4--串行口中斷1
  30. {
  31.   TR0=0;
  32.   TH0=0xfe;
  33.   TL0=0x33;       //重新賦計(jì)數(shù)初值為0.5ms
  34.   if(count<=PWM_count)
  35.   {
  36.     SG_PWM=1;
  37.   }
  38.   else
  39.   {
  40.     SG_PWM=0;
  41.   }
  42.   count++;
  43.   if(count>=40)
  44.   {
  45.     count=0;
  46.     a++;
  47.   }
  48.   TR0=1;
  49. }
  50. void main()
  51. {
  52.   Timer_Init();
  53.   while(1){
  54.                         if(s2 == 0){
  55.                                 delay(100);
  56.                                 if(s2 == 0){
  57.                                         count = 0;
  58.                                         PWM_count = 1;
  59.                                 }
  60.                         }
  61.                        
  62.                         if(s3 == 0){
  63.                                 delay(100);
  64.                                 if(s3 == 0){
  65.                                         count = 0;
  66.                                         PWM_count = 2;
  67.                                 }
  68.                         }
  69.                        
  70.                         if(s4 == 0){
  71.                                 delay(100);
  72.                                 if(s4 == 0){
  73.                                         count = 0;
  74.                                         PWM_count = 3;
  75.                                 }
  76.                         }
  77.                        
  78.                         if(PWM_count == 1){
  79.                                 led1 = 0;
  80.                                 led2 = 1;
  81.                         }
  82.                        
  83.                         if(PWM_count == 3){
  84.                                 led1 = 1;
  85.                                 led2 = 0;
  86.                         }
  87.                        
  88.                 }
  89. }
復(fù)制代碼




作者: 王天星    時(shí)間: 2020-4-2 18:24
從代碼上看沒什么異常,你判斷是單片機(jī)復(fù)位導(dǎo)致的,你可以在單片機(jī)上電時(shí)串口發(fā)送一個(gè)數(shù)據(jù),如果舵機(jī)旋轉(zhuǎn)過程中出現(xiàn)單片機(jī)復(fù)位,那一定會(huì)有串口數(shù)據(jù)。你這種情況導(dǎo)致單片機(jī)復(fù)位的可能性是有的。舵機(jī)使用外接5V電壓和單片機(jī)共地就可以解決。
作者: 完后余生9375    時(shí)間: 2020-4-8 15:29
王天星 發(fā)表于 2020-4-2 18:24
從代碼上看沒什么異常,你判斷是單片機(jī)復(fù)位導(dǎo)致的,你可以在單片機(jī)上電時(shí)串口發(fā)送一個(gè)數(shù)據(jù),如果舵機(jī)旋轉(zhuǎn)過 ...

感謝!確實(shí)是舵機(jī)和單片機(jī)共用電源所致。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1