参考单片机——SG90舵机工作原理_掏一淘哆啦A梦的奇妙口袋的博客-CSDN博客
这位博主做的代码,在此基础上进行简单修改成可以用51单片机的定时器和中断实现SG90舵机任意角度转动
完整代码如下:
#include <REGX52.H>
sbit PWM=P0^0; //对应舵机的PWM引脚,自己修改
int count=0; //全局变量count用于定时器计数
int c=0; //这个值为高低电平的临界值,可以改变,
//这里初始化为0表示开始让舵机复位到0度位置(输出0.5ms的高电平)
int th;
int tl;
int co;
void angle_Init(int angle) //这里定义一个函数,根据不同角度进行定时器初值的修改
{
th=(65536-(11.0592/12)*(500+angle/0.09));
tl=(65536-(11.0592/12)*(500+angle/0.09));
co=((20000*11.0592/12)/(500+angle/0.09));
}
void Timer_Init()
{
TMOD=0X01;
TH0=th/256;
TL0=tl%256;
ET0=1;
TR0=1;
EA=1;
}
void main()
{
angle_Init(0);
Timer_Init();
while(1);
}
void Timer() interrupt 1
{
TH0=th/256;
TL0=tl%256;
if(count<=c)
{
PWM=1;
}
else
{
PWM=0;
}
count++;
if(count>=co)
{
count=0;
}
}
这里对主要的内容进行解释。
th=(65536-(11.0592/12)*(500+angle/0.09));
tl=(65536-(11.0592/12)*(500+angle/0.09));
根据51单片机定时器计数初值的计算方法,这里采用模式1,最大计数为2^16,晶振为11.0592MHz,所以计数初值为
,
注意这里计时时间单位应该为us。按照所参考的SG90舵机的资料,我们可以得到高电平时间和转角之间的关系
代入上式即可。
co=((20000*11.0592/12)/(500+angle/0.09));
这里主要是考虑一个周期20ms时要清零进行下一周期。主要就是根据count参数,当count大于co时进行清零。所以co的计算就是在20ms内count++了几次。20ms共需要计数20000*11.0592/12次,除以一次定时计数次数(500+angle/0.09)。文章来源:https://www.toymoban.com/news/detail-596911.html
本文章是在自己学习51单片机时总结的,由于需要控制舵机旋转任意角度,网上也找不到相关内容,所以自己摸索出来,本人知识水平有限,难免出现错误,欢迎指出。文章来源地址https://www.toymoban.com/news/detail-596911.html
到了这里,关于51单片机实现SG90舵机任意角度转动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!