最简单DIY基于51单片机的舵机控制器

51单片机物联网智能小车系列文章目录


第一篇:最简单DIY的51蓝牙遥控小车设计方案
第二篇:最简单DIY串口蓝牙硬件实现方案
第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车
第四篇:最简单DIY基于51单片机的舵机控制器



前言

    daodanjishui物联网核心原创技术之最简单DIY基于51单片机的舵机控制器。
    市面上有各种开源智能舵机控制器,但是有复杂的有简单的,如果想快速入门基于51单片机的舵机控制器搭配到智能小车上面,这个方案会给你一个快捷高效的方案。


一、最简单DIY基于51单片机的舵机控制器是什么?

    在第一篇完成了蓝牙遥控智能小车的设计,读者好奇源码中为什么会有PWM控制的代码呢?不过那时候是写博客的时候懒得删除了,多占用一个IO口也不会造成错误的。到现在来看是为我第四篇博文:DIY基于51单片机的舵机控制器 埋下了伏笔。
    虽然市面上也有不少开源的舵机控器方案,但是全部由寄存器配置完成控制PWM波输出的代码却很少,现在用文字的形式记录下来,这个代码是在郭天祥出的51单片机的书籍上照搬过来的。不是我原创的,后期会有一个原创的51云台设计推出。
    我这次是用51单片机开发板做的舵机控制,主要是利用了上面的按键。
51单片机开发板如下:
在这里插入图片描述

二、分析

1.准备硬件

1.1购买sg90舵机(180度舵机)如下图所示:
在这里插入图片描述
完成单片机与舵机的接线:
sbit pwm =P2^7 ; //PWM信号输出,接舵机的数据线
1.2准备51单片机
自行购买单片机

2.解析代码

    这个51单片机的代码也是相当精简,虽然是用寄存器写的,但是也是非常经典的一个PWM波发生程序!代码如下,相比arduino的控制程序,这个代码值钱多了!后期我会推出STM32版本的舵机控制程序,其实也是借鉴了这个程序的思路去完成的。

#include "reg52.h"

unsigned char count; //0.5ms 次数标识

sbit pwm =P2^7 ; //PWM信号输出,接舵机的数据线

sbit jia =P3^7; //角度增加按钮

sbit jan =P3^6; //角度减少按钮,低电平触发

unsigned char jd; //角度标识 1.0ms->45 1.5->90 2.0->135 2.5->180

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初始化

{

TMOD = 0x01; //定时器0工作在方式1,16位增计数定时器,16位全是1,最大计数值是65535,就溢出了

IE = 0x82;//EA=1全局中断允许,ET0=1,定时器中断允许

TH0 = 0xfe;//(65536-N)/256=0xef=254推出N=512,N就是需要计数的个数,机器周期是1.09us,所以

//512*1.09us=0.5ms,这时候舵机为0度,1ms是45度,2.5ms是180度,其他的类推

TL0 = 0x33; //11.0592MHz晶振的单片机,导致0.5ms计数器溢出一次,产生定时器中断

TR0=1; //开启定时器

}

void Time0_Int() interrupt 1 //定时器0中断服务程序

{

TH0 = 0xfe; //重新装载初值

TL0 = 0x33;

if(count< jd) //判断计数次数是否小于标识

pwm=1; //输出高电平PWM

else

pwm=0; //低电平PWM

count=(count+1); //计数次数继续增加

count=count%40; //计数次数必须小于40,因为0.5ms*40=20ms,这是舵机PWM的固定周期

}

void keyscan() //按键扫描

{

if(jia==0) //按下增加按钮

{

delay(10); //消除抖动

if(jia==0) //按下增加按钮

{

jd++; //标识增加,一共有5档,jd=1对应0度,jd=2对应0,45度,jd=3对应90,4对应135,5对应180度

count=0; //计数清0,当count加到2的时候,溢出两次,时间是0.5*2=1ms,对应舵机转到45度

if(jd==6)

jd=5; //标识清0

while(jia==0); //等待按键释放

}

}

if(jan==0) //按下减少按钮

{

delay(10);

if(jan==0)

{

jd--; //同理

count=0;

if(jd==0)

jd=1; //复位

while(jan==0);

}

}

}

void main()

{

jd=1;

count=0;

Time0_Init();

while(1)

{

keyscan(); //死循环,按键检测

}

}

3.舵机原理分析

根据工作原理,舵机的具体控制方法就是需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms2.5ms范围内的角度控制脉冲部分。脉冲宽度从0.5ms2.5ms,相对应舵盘的位置为0~180度,呈线性变化。一般舵机脉冲宽度20ms,高电平宽度与角度对应关系

0.5ms————0度;

1.0ms————45度;

1.5ms————90度;

2.0ms————135度;

2.5ms————180度;
根据上面的原理,我们知道单片机只要产生20ms的脉冲信号,通过改变高电平时间从0.5ms到2.5ms变化,就能使舵机转动到对应的角度。最后程序的功能就是按下增加按键,舵机从0度到180 ,按5次;舵机从180到0也需要按5次减少按钮。


三、仿真与调试

1. 准备好硬件,上电。

硬件连线都比较简单。

2. 操控舵机

按下增加按键,舵机从0度到180 ,按5次;舵机从180到0也需要按5次减少按钮。

总结

    刚学51单片机的读者最好入门这个代码,对51单片机寄存器的使用有一个深刻的理解,为以后的机械臂控制和智能小车调速打下坚实的基础。

代码工程下载链接:https://www.cirmall.com/circuit/20977/
点我直接跳转

版权声明:本文为CSDN博主「daodanjishui」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/niruxi0401/article/details/119617225

51单片机物联网智能小车系列文章目录


第一篇:最简单DIY的51蓝牙遥控小车设计方案
第二篇:最简单DIY串口蓝牙硬件实现方案
第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车
第四篇:最简单DIY基于51单片机的舵机控制器



前言

    daodanjishui物联网核心原创技术之最简单DIY基于51单片机的舵机控制器。
    市面上有各种开源智能舵机控制器,但是有复杂的有简单的,如果想快速入门基于51单片机的舵机控制器搭配到智能小车上面,这个方案会给你一个快捷高效的方案。


一、最简单DIY基于51单片机的舵机控制器是什么?

    在第一篇完成了蓝牙遥控智能小车的设计,读者好奇源码中为什么会有PWM控制的代码呢?不过那时候是写博客的时候懒得删除了,多占用一个IO口也不会造成错误的。到现在来看是为我第四篇博文:DIY基于51单片机的舵机控制器 埋下了伏笔。
    虽然市面上也有不少开源的舵机控器方案,但是全部由寄存器配置完成控制PWM波输出的代码却很少,现在用文字的形式记录下来,这个代码是在郭天祥出的51单片机的书籍上照搬过来的。不是我原创的,后期会有一个原创的51云台设计推出。
    我这次是用51单片机开发板做的舵机控制,主要是利用了上面的按键。
51单片机开发板如下:
在这里插入图片描述

二、分析

1.准备硬件

1.1购买sg90舵机(180度舵机)如下图所示:
在这里插入图片描述
完成单片机与舵机的接线:
sbit pwm =P2^7 ; //PWM信号输出,接舵机的数据线
1.2准备51单片机
自行购买单片机

2.解析代码

    这个51单片机的代码也是相当精简,虽然是用寄存器写的,但是也是非常经典的一个PWM波发生程序!代码如下,相比arduino的控制程序,这个代码值钱多了!后期我会推出STM32版本的舵机控制程序,其实也是借鉴了这个程序的思路去完成的。

#include "reg52.h"

unsigned char count; //0.5ms 次数标识

sbit pwm =P2^7 ; //PWM信号输出,接舵机的数据线

sbit jia =P3^7; //角度增加按钮

sbit jan =P3^6; //角度减少按钮,低电平触发

unsigned char jd; //角度标识 1.0ms->45 1.5->90 2.0->135 2.5->180

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初始化

{

TMOD = 0x01; //定时器0工作在方式1,16位增计数定时器,16位全是1,最大计数值是65535,就溢出了

IE = 0x82;//EA=1全局中断允许,ET0=1,定时器中断允许

TH0 = 0xfe;//(65536-N)/256=0xef=254推出N=512,N就是需要计数的个数,机器周期是1.09us,所以

//512*1.09us=0.5ms,这时候舵机为0度,1ms是45度,2.5ms是180度,其他的类推

TL0 = 0x33; //11.0592MHz晶振的单片机,导致0.5ms计数器溢出一次,产生定时器中断

TR0=1; //开启定时器

}

void Time0_Int() interrupt 1 //定时器0中断服务程序

{

TH0 = 0xfe; //重新装载初值

TL0 = 0x33;

if(count< jd) //判断计数次数是否小于标识

pwm=1; //输出高电平PWM

else

pwm=0; //低电平PWM

count=(count+1); //计数次数继续增加

count=count%40; //计数次数必须小于40,因为0.5ms*40=20ms,这是舵机PWM的固定周期

}

void keyscan() //按键扫描

{

if(jia==0) //按下增加按钮

{

delay(10); //消除抖动

if(jia==0) //按下增加按钮

{

jd++; //标识增加,一共有5档,jd=1对应0度,jd=2对应0,45度,jd=3对应90,4对应135,5对应180度

count=0; //计数清0,当count加到2的时候,溢出两次,时间是0.5*2=1ms,对应舵机转到45度

if(jd==6)

jd=5; //标识清0

while(jia==0); //等待按键释放

}

}

if(jan==0) //按下减少按钮

{

delay(10);

if(jan==0)

{

jd--; //同理

count=0;

if(jd==0)

jd=1; //复位

while(jan==0);

}

}

}

void main()

{

jd=1;

count=0;

Time0_Init();

while(1)

{

keyscan(); //死循环,按键检测

}

}

3.舵机原理分析

根据工作原理,舵机的具体控制方法就是需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms2.5ms范围内的角度控制脉冲部分。脉冲宽度从0.5ms2.5ms,相对应舵盘的位置为0~180度,呈线性变化。一般舵机脉冲宽度20ms,高电平宽度与角度对应关系

0.5ms————0度;

1.0ms————45度;

1.5ms————90度;

2.0ms————135度;

2.5ms————180度;
根据上面的原理,我们知道单片机只要产生20ms的脉冲信号,通过改变高电平时间从0.5ms到2.5ms变化,就能使舵机转动到对应的角度。最后程序的功能就是按下增加按键,舵机从0度到180 ,按5次;舵机从180到0也需要按5次减少按钮。


三、仿真与调试

1. 准备好硬件,上电。

硬件连线都比较简单。

2. 操控舵机

按下增加按键,舵机从0度到180 ,按5次;舵机从180到0也需要按5次减少按钮。

总结

    刚学51单片机的读者最好入门这个代码,对51单片机寄存器的使用有一个深刻的理解,为以后的机械臂控制和智能小车调速打下坚实的基础。

代码工程下载链接:https://www.cirmall.com/circuit/20977/
点我直接跳转

版权声明:本文为CSDN博主「daodanjishui」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/niruxi0401/article/details/119617225

生成海报
点赞 0

daodanjishui

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

最简单DIY基于51单片机的舵机控制器

51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇&#xff1a

数码管轮播显示

硬件: 数码管10个引脚,8个控制二极管亮、灭,2个引脚为负极。1k欧电阻链接负极,接gnd。 将8个二极管引脚依次链接0-7号引脚。 软件: /*共阳极单数码管显示&

STM32串口发送接收数据

1.串口通信 我用的32是stm32f10x最小系统没有UART4和UART5 USART : 通用同步异步收发器 UART : 通用异步收发器 nRTS : 请求发送 nCTS : 请求接收 区别:USART指单片机的一个IO端