求大神解答,我用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)
|