基于C51的多路舵机PWM控制原理(有程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、 基本原理介绍
二、
演示机构采用的是舵机,每个需要一路PWM 波
和两路电源输入。电源输入标准为5V 1-8A ,采用
带输入和输出保护的50w 开关电源供电;PWM 波为
50Hz ,正脉冲时间为0.5-2.5ms ,对应-90°至90°
(实际使用中为了保护机械,为0.7-2.3ms ,舵机
旋转范围为-70°至70°)。
由于系统对于输出的频率有5
Hz 的限制,因此使用软件延迟来实现最多八路的
的PWM 波输出。PWM 波由MCU 通过软件延时产生,
算法概述如下(流程图见附件):
1. A 路输出
2.5ms 脉冲(输出正脉冲,不足
时间由低电平 补至2.5ms ),此时其他五
路无输出,相当于输出2.5ms 低电平; 2. B 路输出2.5ms 脉冲(同A 路,不足时间由低电平补齐),此时包括A 路的其他五路无输出,相当于输出2.5ms 低电平;
3. 同理,输出C,D,E,F 路
4. 此时,1-3步总时间为2.5*6=15ms ,其中每路由一个小于2.5ms 的正脉冲和低电平时间组成。由于输出周期为20ms ,故应再输出20ms-15ms=5ms 低电平时间,使得各路频率为50Hz 。
重复1-3步,得到输出波形如下图:(仅以4路为例,使用Proteus 仿真示波器,图
2.2.2)
可以看到,此时各路输出均为50Hz ,正脉冲时间为
0.5-2.5ms
图 2.2.1 舵机及其控制原理
图2.2.2 Proteus仿真
此算法在50Hz(20ms)频率的限制下,最多可输出8路PWM波形(8*2.5ms=20ms)
三、实际程序
程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit Out1=P2^0;
sbit Out2=P2^1;
sbit Out3=P2^2;
sbit Out4=P2^3;
sbit Out5=P2^4;
void PWM(uint a, uint b,uint c, uint d,uint e) {
uchar A,B,C,D,E;
uint M=984;
A=250-a;
B=250-b;
C=250-c;
D=250-d;
E=250-e;
do { Out1 = 1; } while(a--);
do { Out1 = 0; } while(A--);
do { Out2 = 1; } while(b--);
do { Out2 = 0; } while(B--);
do { Out3 = 1; } while(c--);
do { Out3 = 0; } while(C--);
do { Out4 = 1; } while(d--);
do { Out4 = 0; } while(D--);
do { Out5 = 1; } while(e--);
do { Out5 = 0; } while(E--);
do{ }while(M--);
}
main()
uchar a,b,c,d,e;
uint m;
a=170;
b=149;
c=d=e=149;
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD = 0x20; //定时器工作方式2
PCON = 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。
效验位无 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验
位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
while(1)
{
if(RI)
{
RI=0;
m=SBUF-48;
if(m==1)
{
if(a<=120) a=a+3; else a=a+1;
}
if(m==2)
{
if(a>=180)a=a-3; else a=a-1;
}
if(m==3) b=b+1;
if(m==4) b=b-1;
if(m==5) c=c+1;
if(m==6) c=c-1;
if(m==7) d=d+1;
if(m==8) d=d-1;
if(m==9) e=e+1;
if(m==0) e=e-1;
if(a<=69) a=69;
if(a>=229) a=228;
if(b<=69) b=69;
if(b>=229) b=228;
if(c<=69) b=69;
if(c>=229) b=228;
if(d<=69) b=69;
if(d>=229) b=228;