使用51单片机输出PWM控制舵机

2019-08-23来源: eefocus关键字:51单片机  输出PWM  控制舵机

SCU 的电子信息学院的某个社团会每年举办船模大赛。

因为去年的船模比赛时候懒,所以就买了成品的遥控器(天地飞6)来参赛,控制自己制作的遥控船上面的电调和舵机。最近有心情想在今年的船模比赛中自己制作遥控器,先从第一步开始吧:使用单片机来控制舵机(控制电调的原理类似)。


0x01.什么是舵机?


        其实舵机就是一种伺服电机,根据要求旋转一定的角度,在我看来,知道这些就够了~~

0x02.舵机有什么用?


        就拿模型来说吧,船要转弯的话,可以采用的一种方式就是改变船后面舵片的角度来改变两侧对水的阻力,以此来让船转向,这个也是舵机一词的由来。


0x03.怎么控制?


        PWM波,这是什么东西呢?其实就是一种方波,其频率为50Hz,周期就是20ms,在每个周期里面,高电平的占空比在0.5ms到2.5ms之间。而0.5ms代表的是0度,2.5ms代表的是180度。其他的度数可以直接按照比例换算过去*(这个有点想ARDUINO里面的map函数的意思)


0x04.如何实现PWM?


        实现脉冲宽度调制波有很多种方法,很多单片机已经有“原生支持”的pwm输出引脚,用来输出pwm波形。


        我采用比较土的一种方法,如下图:


就用这玩意输出了,他是STC公司生产的89C52RC型号的单片机,内核是51单片机,运用其中的定时器中断方式输出pwm波。




0x05.实现效果


       是用单片机的P2^7引脚输出PWM波形,使用P2^4,P2^5引脚操作独立按键来控制舵机的角度




使用KEIL 4平台,代码如下:


主函数:






// GYZ

// 1路PWM波形输出,可以控制舵机和电调

 

#include

 

//引脚位定义

sbit key1 = P2^5;

sbit key2 = P2^4;  //独立按键引脚

sbit pwm1 = P2^7;

 

//全局变量定义 

unsigned int target =6,percent = 0;

 

// 头文件包含

#include

#include

#include

 

//函数声明

void Timer0Initial();

void initial_Timer();

void delay(unsigned int x);

void keyscan();

 

 

void main()

{

initial();

while(1)

{

keyscan();

}

}



独立按键扫描


key.h


void keyscan()

{

if(key1 == 0)

{

delay(3);

if(key1 == 0)

{

if(target >= 7)

{

target -= 1;

}

while(key1 == 0)

{P1 = 0x00;}

}

P1 = 0xFF;

}

 

if(key2 == 0)

{

delay(3);

if(key2 == 0)

{

if(target <= 26)

{

target += 1;

}

while(key2 == 0)

{P1 = 0x00;}

}

P1 = 0xFF;

}

}//按键检测程序

 

void initial()

{

key1 = 1;

key2 = 1;

P1 = 0xff;

initial_Timer();

}


定时器程序


Timer.h


//Timer Configuration

//使用12Mhz晶振

//理论上,12Mhz晶振12分频之后

//应该是100次计数时间是100us

//通过示波器实测

//选用65次计数产生一次中断

 

void Timer0Initial()

{

TH0 = (65536-65)/256;

TL0 = (65536-65)%256;

} //该初值使每0.1ms产生一次中断

 

void initial_Timer()

{

EA = 1;    //开启总中断

ET0 = 1;    //允许T0中断

TMOD = 0x01; //定时器模式,T0使用工作方式1

Timer0Initial();   //装初值,0.1ms产生一次中断

TR0 = 1;   //打开T0定时器

}

 

void delay(unsigned int x)

{

unsigned int i,j;

for(i = 0;i< x; ++i)

for(j = 120; j >0 ; --j)

;

}


最后,中断的程序


interrupt.h


void Timer0() interrupt 1 using 0

{

percent += 1;

if(percent == 200)

{

percent = 0;

pwm1 = 1;//拉高电平的引脚,来维持50hz的频率

}

if(percent == target)

{

pwm1 = 0;

}

Timer0Initial();

 

}


关键字:51单片机  输出PWM  控制舵机

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472313.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机 小车 L298N pwm调速 串口控制 按键控制
下一篇:51单片机 矩阵键盘

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

两年专利纠纷 这家国内原厂最终胜诉台湾企业

分公司及设计团队,并服务于家用电器、无人机、无线充电、电子烟、电动工具、无线通信、个人健康护理、传感测量、智能家居、电机控制、电池电源管理等不同领域客户。未来,深圳中微仍将务实于芯片的自主研发,须臾不松懈,坚持科技兴国战略的责任和信念,坚持“做强中国芯,服务全世界”,共同推动中国“芯”闪耀世界舞台。
发表于 2019-09-13

STM32F030F4P6单片机由外部时钟改为内部时钟

static void SetSysClock(void){  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;    /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/  /* Enable HSE */    //  RCC->CR |= ((uint32_t)RCC_CR_HSEON);//使用外部8M时钟 RCC->CR |= ((uint32_t)RCC_CR_HSION
发表于 2019-09-09
STM32F030F4P6单片机由外部时钟改为内部时钟

单片机中Sprint函数

;};char s2={'T','Y','x'};sprintf(str,"%.*s%.*s",2,s1,3,s2);sprintf(s, "%*.*f", 10, 2, 3.1415926); 8、sprintf(s, "%p", &i);可以打印出i的地址上面的语句相当于sprintf(s, "%0*x", 2 * sizeof(void *), &i);9、sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度单片机中Sprint
发表于 2019-09-07

单片机串口发送和接受程序

ResendDataLen = 0 ;/************************************************************************函 数 名: 串口初始化功能描述: STC10L08XE 单片机串口初始化函数返回函数: none其他说明: none**************************************************************************/void UartIni(void){TMOD = 0x20; // 设置 T1 为波特率发生器SCON = 0x50; // 0101,0000 8位数据位, 无奇偶校验PCON = 0x00
发表于 2019-09-07

简单的PCB制作——单片机的最小系统

单片机的最小系统:1、芯片:AT89C51   2、晶振电路(相当于心脏)12MHZ。3、复位(g高电平复位,低电平复位)制作简单的PCB:(一)、新建PCB工程,原理库和PCB,然后保存,可以修改名字但是后缀名不变,可以修改地址,但是三个地址保存在同一个文件夹中。(二)、在空白处右击,opinion--->document opinion,修改纸张大小。(三)、找系统的默认库文件(点开右侧的library之后,在点开libraries可以安装库文件。(四)、在总工程上右击,点“add existing  to  project” 将自己的库加载到工程文件中,同时要保证自己的库与所新建
发表于 2019-09-07
简单的PCB制作——单片机的最小系统

利用STM32单片机串口发送字符串

最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。其实发送字符串的本质还是发送一个个字符,所以只需在字符串结束标志之前,循环发送字符即可。不罗嗦,上程序。//程序功能:利用串口发送一个字符串// 参数:USARTx USART编号 可取 USART1、USART2、USART3、USART4、 USART5(STM32F103ZET6)str 需要发送的字符串#include “stm32f10x.h”void Usart_SendString(USART_TypeDef* USARTx,char *
发表于 2019-09-07

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved