标题:
关于数字舵机和模拟舵机单片机驱动程序区别
[打印本页]
作者:
茂名叻仔
时间:
2022-5-18 20:25
标题:
关于数字舵机和模拟舵机单片机驱动程序区别
求大神解答,我用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 上传
点击文件名下载附件
作者:
yzwzfyz
时间:
2022-5-19 11:20
先弄清楚:数字舵机、模拟舵机的驱动原理。
作者:
啤酒瓶子老大
时间:
2022-5-19 12:30
模拟舵机一般是用一个持续不断的波长20ms的PWM信号控制的。
数字舵机就是一个设备,比如串口舵机,用的是串口的通讯协议,发送是类似是先发送舵机地址,后面是指令。(这个具体我也没研究过)
驱动程序根本就不一样。
要多用百度的同时更要擦亮双眼,有时搜到的结果是错的。百度只负责搜索,内容是什么是对是错他不负责。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1