历史上的今天
今天是:2025年06月19日(星期四)
2018年06月19日 | 使用51单片机驱动舵机程序分析
2018-06-19 来源:eefocus
舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外 壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向, 再驱动无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,需要注意。
舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms 的正脉冲宽度和舵机的转角-90°~90°(即0~180度)相对应。注意,由于舵机牌子不同,其控制器解析出的脉冲宽度也不同,所以对于同一信号,不同牌子的舵机旋转的角度也不同。其原理是:它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号, 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
0.5ms------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
采用11.0592MHZ的51单片机驱动舵机转动程序如下:
//上电自动转动
#include
unsigned char count; //0.5ms次数标识
sbit pwm =P1^0 ; //PWM信号输出
sbit jia =P2^4; //角度增加按键检测IO口
sbit jian =P2^5; //角度减少按键检测IO口
unsigned char jd; //角度标识
sbit pwm1 =P0^0 ; //PWM信号输出给示波器,检测PWM波用
void delay(unsigned char i)//延时
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void Time0_Init() //定时器0初始化
{
//定时器0装初值 用示波器检测后,11.0592MHZ晶振 定时0.5ms进入中断 装初值如下
TH0 = (65536-445)/256;
TL0 = (65536-445)%256;
TMOD = 0x01; //定时器0工作在方式1
IE = 0x82; //IE=0x82=1000 0010 等价于 EA=1 开总中断 ET0=1 开定时器0中断
TR0=1; //开定时器0
}
void Time0_Int() interrupt 1 //中断程序
{
//重装初值
TH0 = (65536-445)/256;
TL0 = (65536-445)%256;
if(count< jd)
{
pwm=1; //确实小于,PWM输出高电平
pwm1=pwm; //接示波器用的io口,观测PWM波形用 } //判断0.5ms次数是否小于角度标识
//pwm=1; //确实小于,PWM输出高电平
else
{
pwm=0; //确实小于,PWM输出高电平
pwm1=pwm; //接示波器用的io口,观测PWM波形用 }
// pwm=0; //大于则输出低电平
count=(count+1); //0.5ms次数加1
count=count%40; //次数始终保持为40 即保持周期为20ms
}
//此注销掉部分为通过按键控制舵机转动的程序,功能为通过jia按键控制正转,
//通过jian按键控制反转
/*void keyscan() //按键扫描
{
if(jia==0) //角度增加按键是否按下
{
delay(10); //按下延时,消抖
if(jia==0) //确实按下
{
jd++; //角度标识加1
count=0; //按键按下 则20ms周期从新开始
if(jd==6)
jd=5; //已经是180度,则保持
while(jia==0); //等待按键放开
}
}
if(jian==0) //角度减小按键是否按下
{
delay(10);
if(jian==0)
{
jd--; //角度标识减1
count=0;
if(jd==0)
jd=1; //已经是0度,则保持
while(jan==0);
}
}
}*/
void main()
{
//上电,舵机自动正反转
//应注意每次步进是延时函数delay参数的设置,此处延时函数参数设置的并不理想
while(1)
{
for(jd=1;jd<6;jd++)
{
count=0;
Time0_Init();
delay(50000000);
}
delay(50000000);
for(jd=6;jd>0;jd--)
{
count=0;
Time0_Init();
delay(50000000);
}
}
}
上一篇:51单片机PWM双舵机控制详解
下一篇:51单片机PWM程序详解
史海拾趣
|
请教:sc32410的DMA的nXDREQ0和nXDREQ1两个外部源的问题 各位: 我在关于DMA驱动的事情。在ARM外接一块FPGA进行DMA数据传输。想用nXDREQ0为DMA请求源。在datasheet上面写道DREQ与DACK与HCLK同步。我不大理解什么意思?nXDREQ0是在FPGA端发起的,请问nXDREQ0这个在FPGA应该怎么 ...… 查看全部问答> |
|
Hi,各位,请教一下: 1.在evc下是如何获取汉字的内码的?假设汉字为“房”,其内码为623F,在GB2312则为2331,如果知道GB2312下的内码怎样转换成Unicode下的内码? 2.在CE4.2下,系统的字库文件应该是simsum.ac3(如果我没错的话),那么如何根据 ...… 查看全部问答> |
|
不知道有没有人能够提供一下PtReceivePacket中修改封包的方法?? 比如现在有两台电脑,称为A和B,B机通过A机连接到网络,也就是说B机访问任何网页A机都可以查看到,但现在我希望B机在IE中输入www.163.com的时候,网页出现的是www.sina.com.cn的内容。 大体上应该是这样: B机输入163网址以后,会有一个GET请求 ...… 查看全部问答> |
|
用demo程序重新生成SOPC时遇到下面的错误提示: Error: Failed to refresh PTF fileInfo: Finished elaborating PTF file.Executing: C:/altera/91/quartus//sopc_builder/bin/sopc_builder --classic --generate D:/DE3_NET_340_GMII_NET0/DE3_SO ...… 查看全部问答> |
|
关于PIC单片机的存储器问题?PIC单片机存储器分4体,(PIC16F877A) PIC单片机存储器分4体,(PIC16F877A),为什么要分四体啊?PIC单片机存储器分成4页,为什么在不同页里有相同的寄存器呢?这样他们的地址就不一样了,那不是很麻烦吗?例如PORTB在Bank0里地址是06H,在Bank2里是106H?为什么会这样呢?… 查看全部问答> |
|
【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第十七章 OLED显示实验 第十七章 OLED显示实验 前面几章的实例,均没涉及到液晶显示,这一章,我们将向大家介绍OLED的使用。在本章中,我们将使用战舰STM32开发板上的OLED模块接口(与摄像头共用的这个),来点亮OLED,并实现ASCII字符的显示。本章分为如下几个部分:17 ...… 查看全部问答> |
|
本人通过ftp把VxWorks镜像下载到TigerSharc201主板上运行。在调试的过程中,本想 通过键盘输入命令行来查看任务的执行情况,但不知为何键盘无法输入,只好通过远程调试。在调试的时候碰到这样的问题,怎么解决?我的shell是那出问题了????求解 ...… 查看全部问答> |
|
急求CD4000系列和74CH系列芯片的集成库,作为个新人,在Altium desinger09画图时,PCB导入时,全显示Unkonw pin.好像是引脚定义不对,但又不知道怎么改?各位看看能帮帮忙不?… 查看全部问答> |
|
话说,这几天天天出去,好累,组装进度慢慢慢。 这几天把挤出机部分装了,有这么几个问题。 第一个是这个连接件,就是螺丝刀指的位置,这个有点厚,直接导致了他在铝合金框架上不能固定,于是使用了神器把中间那里磨平了一部分。 上神器, 哈哈 ...… 查看全部问答> |




