求大神解答,我用51單片機驅動SG90模擬舵機,功能正?梢詮0°轉到180°自由控制,但是用同樣的代碼驅動,驅動數字舵機MG90s,數字舵機會亂轉,上網百度后發現是不同類型的舵機,但是驅動參考程序,眾說紛紜,有些說數字舵機和模擬舵機驅動代碼是一樣的,但燒寫代碼進去,SG90可以正常轉動,MG90s用一樣的代碼會亂轉角度。
機械臂旋轉單片機源程序如下:- #include <reg52.h>
- #include <intrins.h>
- #include "Delay.h"
- #include "Timer0.h"
- #include "LCD1602.h"
- #include "MatrixKey.h"
- //extern MatrixKey();
- sbit SG0_PWM=P2^0;
- sbit SG1_PWM=P2^1;
- unsigned char PWM0_Count=0,PWM1_Count=0;
- unsigned char Keynum;
- unsigned char Displaynum,Displaynum2;
- /*
- PWM0_Count=1; //舵機轉動0度
- PWM0_Count=2; //舵機轉動45度
- PWM0_Count=3; //舵機轉動90度
- PWM0_Count=4; //舵機轉動135度
- PWM0_Count=5; //舵機轉動180度
- */
- void Keyscan()
- {
- if(Keynum==1)
- {
- PWM0_Count=1;
- Displaynum=0;
- }
- if(Keynum==2)
- {
- PWM0_Count=2;
- Displaynum=45;
- }
- if(Keynum==3)
- {
- PWM0_Count=3;
- Displaynum=90;
- }
- if(Keynum==4)
- {
- PWM0_Count=4;
- Displaynum=180;
- }
- }
- void Keyscan2()
- {
- if(Keynum==5)
- {
- PWM1_Count=1;
- }
- if(Keynum==6)
- {
- PWM1_Count=2;
- }
- if(Keynum==7)
- {
- PWM1_Count=3;
- }
- if(Keynum==8)
- {
- PWM1_Count=4;
- }
- }
- void main()
- {
- Timer0_Init();
- LCD_Init();
- while(1)
- {
- Keynum=MatrixKey();
- Keyscan();
- Keyscan2();
- LCD_ShowString(1,1,"angle");
- LCD_ShowString(1,6,":");
- LCD_ShowString(1,8,"upper");
- LCD_ShowString(1,13,":");
- LCD_ShowString(2,1,"lower");
- LCD_ShowString(2,6,":");
- LCD_ShowNum(1,14,Displaynum,3);
- LCD_ShowNum(2,7,Displaynum2,3);
- }
- }
- void Timer0_Routine() interrupt 1 //500us重裝一次初值0.5ms
- {
- static unsigned int T0Count;
- TH0 = 0xFE;
- TL0 = 0x33;
- T0Count++;//自增到20
- T0Count%=40;//產生20ms的方波
- if(T0Count<PWM0_Count)
- {
- SG0_PWM=1;
- }
- else
- {
- SG0_PWM=0;
- }
-
- if(T0Count<PWM1_Count)
- {
- SG1_PWM=1;
- }
- else
- {
- SG1_PWM=0;
- }
- }
復制代碼
Keil代碼下載:
機械臂旋轉.rar
(42.61 KB, 下載次數: 10)
2022-5-18 20:27 上傳
點擊文件名下載附件
|