基于C51的多路舵机PWM控制原理(有程序)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档