51单片机PWM双舵机控制详解

发布者:SereneSoul55最新更新时间:2018-06-19 来源: eefocus关键字:51单片机  PWM  双舵机控制 手机看文章 扫描二维码
随时随地手机看文章

为什么要写这篇博客、因为我在调我的51单片机wifi小车的双舵机摄像头的时候。从一开始对PWM很陌生到完全理解PWM调节并调好了两个舵机加起来花费了整整一天的时间。也看了很多的资料。这里综合一下,希望能帮助到像我一样需要使用PWM调舵机的人。


我用的舵机是———-盛辉SG90舵机(标准版)

这里写图片描述 
对就是上面这个东东

下面来简单的看一下它的工作原理: 
三根线: 
橙色—————————–信号线 
红色—————————–VCC 
棕色—————————–GND

首先、在这个舵机的内部有一个基准电压。如果我们想要控制这个舵机的转动。那么我们就要通过一定信号线给它一个一定周期的直流偏置电压。 
最终舵机内部会根据直流偏置电压与内部基准电压进行比较,获得电压差输出。最后电压差的正负输出到电机驱动芯片决定电机的正反转。

经过这样一个简单的叙述我们大概知道了该怎么控制舵机的正反转。

下面我们了解一下该给它什么样周期的直流偏置电压呢? 
下看一下占空比的概念(图示): 
这里写图片描述

如上图:占空比 = t / T; 
想要控制舵机,那么我们就需要一个周期T = 20ms。高电平小t等于0.5ms-2.5ms之间的这样一个方波。 
为什么是这个参数呢?

因为 t (高电平在一个周期内持续时间) 
t = 0.5ms——————-舵机会转动 0 ° 
t = 1.0ms——————-舵机会转动 45° 
t = 1.5ms——————-舵机会转动 90° 
t = 2.0ms——————-舵机会转动 135° 
t = 2.5ms——————-舵机会转动180° 
不要问我为什么,哈哈哈,因为这和舵机内部的基准电压有关,我们只要知道它到底如何用就可以了,里面的电路实现可以不用深究!


通过上面的一下基础概念性的知识我们已经大概了解了舵机的工作原理。接下来让我们来看一下如果用C51单片机PWM来调节控制它


对于T = 20ms 。我们可以定时器0(方式1)来计数。每次0.1ms。如果计数达到200则说明一个周期到了,计数清0 
补充: 
11.0592MHz晶振——0.1ms TH0 = 0xff,TL0 = 0xa3 
12.0000MHz晶振——0.1ms TH0 = 0xff,TL0 = 0x9c

对于t = 0.5ms—–2.5ms我们可以采用全局变量。让全局变量等于5—25之间,因为我的舵机的一个计数周期是0.1ms,这样全局变量的5—25正好就是0.5ms—2.5ms

有了这个对应关系,那么程序变的简单起来 
一起来看

/* 因为我是使用Android APP通过串口给单片机发送指令来控制两个舵机的转动

   所以下列程序的参数在这里做个解释:

   SEV_count  上文中提到的全局变量,它的改变能够改变占空比,也就是高电平持续时间,相信你们看了代码就会明白,SEV_COUNT控制电机左右转。

   SEH_count  控制电机上下转

   count定时器计数值

   串口发送‘f’代表舵机向上转

   串口发送'g'代表舵机向下转

   串口发送‘h’代表舵机向左转

   串口发送‘i’代表舵机向右转

   sbit SEV_PWM = P0^0;  //上下舵机信号位

   sbit SEH_PWM = P0^1;  //左右舵机信号位

 */


unsigned char count = 0;

unsigned char SEV_conut = 15;

unsigned char SEH_count = 15;

/* 串口初始化、定时器T0、T1初始化 */

void Com_Init()

{

    IP = 0x08;

    PCON &= 0x7F;

    TMOD &= 0x00;

    TMOD |= 0x21; //定时器0设置为16为定时器方式1,定时器1配置波特率为自动重载方式2

    SCON= 0x50;   //串口工作在方式1,8位异步通信

    TH1 = 0xfd;   //定时器1设置为在11.0592下波特率为9600

    TL1 = 0xfd;

    ES = 1;       //打开串口中断

    ET1 = 0;      //关闭定时器1中断

    TR1 = 1;      //打开定时器1


    TH0 = 0xff;   //配置定时器0初值,溢出时间为0.1ms

    TL0 = 0xa4;


    ET0 = 1;      //打开定时器0中断

    TR0 = 1;      //开启定时器0

}

/* 定时器0中断服务程序 */

void Time0_Int() interrupt 1

{

    TR0 = 0;      //关闭定时器0

    TH0 = 0xff;   //重装初值0.1ms

    TL0 = 0xa4;

    //舵机1

    if(count <= SEH_count) //控制占空比左右

    {

        //如果count的计数小于(5-25)也就是0.5ms-2.5ms则这段小t周期持续高电平。产生方波

        SEH_PWM = 1;

    }

    else

    {

        SEH_PWM = 0;

    }

    //舵机2

    if(count <= SEV_count) //控制占空比上下

    {

        SEV_PWM = 1;

    }

    else

    {

        SEV_PWM = 0;

    }

    count++;

    if (count >= 200) //T = 20ms则定时器计数变量清0

    {

        count = 0;

    }

    TR0 = 1; //开启定时器0

}


void main()

{

    Com_Init();

    while(1)

    {

        ;

    }

}

/* 串口中断函数 */

void uart_ser() interrupt 4

{

    if (RI == 0)

    {

        return;

    }

    ES = 0;

    RI = 0;

    command = SBUF; //将接收到的数据传给command

    switch(command)

    {

         case 'f': //舵机向上转

        {

            SEV_count++;

            if(SEV_count >= 25)

            {

                SEV_count = 25;

            }

            count = 0; //占空比参数t改变,让定时器重新计数

            break;

        }   

        case 'g':

        {

            SEV_count--;

            if(SEV_count <= 5)

            {

                SEV_count = 5;

            }

            count = 0;

            break;

        }   

        case 'h':

        {

            SEH_count++;

            if(SEH_count >= 25)

            {

                SEH_count = 25; //保持角度180度。 

            }

            count = 0;

            break;

        }   

        case 'i':

        {

            SEH_count--;

            if(SEH_count <= 5) //保持角度0度

            {

                SEH_count = 5;

            }

            count = 0;

            break;

        }

        case 'k':  //舵机复位

        {

            SEH_count = 15;

            SEV_count = 15;

            count = 0;

            break;

        }

        default:

        {

            break;

        }

    }

    ES = 1; //打开串口

}


以上就是一个双舵机的PWM控制,其实原理很简单。只要明白了原理实现起来很快的。

关键字:51单片机  PWM  双舵机控制 引用地址:51单片机PWM双舵机控制详解

上一篇:51单片机之闪烁一个小灯
下一篇:使用51单片机驱动舵机程序分析

推荐阅读最新更新时间:2024-03-16 16:06

51单片机IO口模拟串口通讯的设计
#include sbit BT_SND =P1^0; sbit BT_REC =P1^1; IO 口模拟232通讯程序 使用两种方式的C程序 占用定时器0 #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLE TL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0; sbit ACC0= ACC^0; sbit ACC1= ACC^1; sbit ACC2= ACC^2; sbit ACC3= ACC^3; sbit ACC4= ACC^4; sbit ACC5= ACC^5; sbit ACC6= ACC^6; sbit AC
[单片机]
锦锐单片机CA51F152S4A/B PWM+ADC+触控型8051MCU
1 概述 CA51F152 系列芯片是基于1T 8051 内核的8 位微控制器,不仅保留了传统8051 芯片的基本特性,通常情况下运行速度比传统的8051 芯片快10 倍,性能更加优越。芯片内置16KB Flash 程序存储器,可多次重复编程,以及1KB SRAM 方便客户开发复杂的应用。还集成了26 路12 Bit ADC、26 路Touch Key(不需外接电容)、16 Bit PWM、I2C、2 路UART、SPI、RTC、低电压检测(LVD)等功能模块。支持PWM、I2C、UART 外设可以映射到任意管脚,支持8 个大灌电流管脚,软件可实现双扫LED 屏显示功能,还支持IDLE、STOP 和低速运行三种省电模式以适应不同功
[单片机]
锦锐单片机CA51F152S4A/B <font color='red'>PWM</font>+ADC+触控型8051MCU
基于单片机与CPLD的步进电机PWM驱动技术
步进电动机是一种将数字信号转换为位移(或直线位移)的机电执行元件,每当输入一个脉冲时,转轴便转过一个固定的机械角度,他具有快速起停、精确步进、没有积累误差且能直接接收数字信号的特点,在数字控制系统中得到了广泛的应用。步进电机的运动性能和他的驱动器有密切的关系,驱动器的性能的优劣直接影响到步进电机运行的好坏。细分驱动方式可以减小步进电机的步矩角,提高分辨率,使电机运行更加平稳均匀,可以减小或消除低频振动。利用恒流和细分驱动技术可以大大提高步进电机的步矩分辨率,减小转矩波动,避免低频共振及降低运行噪声。通常的步进电机控制方法是采用CPU配合专用的步进电机驱动控制器来实现,存在成本高、不同种类的电动机必须要有相应的驱动控制器与之配对
[嵌入式]
基于单片机与CPLD的步进电机<font color='red'>PWM</font>驱动技术
51单片机系列知识15--HD7279(1)
HD7279--串行接口8位LED数码管及64键键盘职能控制芯片 HD7279A是一片具有串行接口的,可同时驱动8位共阴极数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可以连接多达64健的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。 HD7279内部含有译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式,还具有多种控制指令,如消隐、闪烁、左移、右移、段寻址等。 典型应用:仪器仪表、工业控制器、条形显示器、控制面板。 特点: ·串行接口,无需外接元件可直接驱动LED ·各位独立控制译码/不译码及消隐和闪烁属性 ·(循环)左移/(循环)右移指令 ·具有段寻址指令,方便
[单片机]
<font color='red'>51单片机</font>系列知识15--HD7279(1)
51单片机学习单片机之路总结
学习单片机有一学期了,现在也由51转到STM32了。一直想对51的学习做一个总结。也希望对别人有一些启发。也给后学者提供一些建议。当然本文是我对自己学习过程的总结,若有不对的地方,还请高手指出。 我想,再看本文之前,最好对单片机有了最基础的了解,最好能用单片机驱动起一个LED灯,否则,可能会不知所云。 首先我想问一个问题,你认为单片机有哪些内容呢?也许你现在手里有一块开发板,你已经开始从流水灯开始,一个一个外设在跑了。也许你已经看过一些单片机入门的书了。如果是这样,我估计你会回答,单片机包括了流水灯,键盘,数码管,定时器,中断,串口,AD,DA,液晶,DS18B20……其实这样的回答其实符合了大多数初学者的心态。因为天祥老
[单片机]
信息纽扣DS1991在51单片机系统中的应用
DS1991是Dallas公司的1-wire总线信息纽扣家庭中的一员,是一种加密存储器型信息纽扣。它内部集成了1Kbit是非易失性存储器及加密保护逻辑,封装于直径为16mm、厚约6mm的不锈钢外壳中,何种小巧、操作便捷,防潮、抗震、防灰尘,可在恶劣的环境中实现带密码保护的数据传送。 1 DS1991的特点   DS1991是一种很有特色的加密存储器型TM卡,为用户的保密数据提价节可靠的保护措施。DS1991内部有1152位的密码保护存储器区,512位的非密码保护存储器scratchpad。密码保护存储器被分为三个可独立操作的密钥子存储器(subkey),每区为384位,每个密钱子区都有自己的64位密码及64位的ID码,对密
[单片机]
信息纽扣DS1991在<font color='red'>51单片机</font>系统中的应用
51单片机的花样彩灯
#include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int char code SST516 _at_ 0x003b; uchar code display_P0 ={ 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x7F,0xBF,0xDF,0xEF,0xF7,
[单片机]
以80C51单片机为例讲述单片机如何运行
前言 要想理解单片机是如何运行程序的,首先需要了解单片机的组成。本文以80C51单片机为例,给大家讲一讲程序在单片机中是如何运行的。 单片机的组成 8051单片机的内部硬件结构包括: 中央处理器CPU:它是单片机内部的核心部件,决定了单片机的主要功能特性,由运算器和控制器两大部分组成。 存储器:8051单片机在系统结构上采用了哈佛型,将程序和数据分别存放在两个存储器内,一个称为程序存储器,另一个为数据存储器在物理结构上分程序存储器和数据存储器,有四个物理上相互独立的存储空间,即片内ROM和片外ROM,片内RAM和片外RAM。 定时器/计数器(T/C):8051单片机内有两个16位的定时器/计数器,每个T/C既可以设置成计数方式
[单片机]
以80C<font color='red'>51单片机</font>为例讲述单片机如何运行
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved