单片机C语言PWM程序原理,初学单片机之PWM控制舵机的原理与C语言源程序

/***

**项目名称:舵机使用介绍(测试程序部分)

**实现方法:使用PCA的16位软件定时器产生PWM控制

**编写时间:2017.07.06

**使用芯片:stc12c4052ad

**时钟频率:使用外部晶振频率12MHz

**联系方式:QQ群号-143867886

*****更多内容可在微信公众号(电子创客派 ID:e_diy_c)查看*****

***/

#include

#include

typedef unsigned char u8;

typedef unsigned short int u16;

sbit CTRL = P3^7;                                                                //舵机控制端口

void delay_100ms(u16 x);

u16 TIME = 20000;                                                                //PWM周期时间(单位us)

u16 Min = 800;                                                                        //高电平最小持续时间

u16 Max = 2200;                                                                        //高电平最大持续时间

u16 aTime = 800;                                                                //高电平持续时间

u8 Degree = 200;                                                                //单位时间宽度(最小是舵机死区设定大约10us)

void main()

{

CTRL = 0;

//PCA0配置

CCAPM0 = 0x48;                                                                //设置PWM0为16位软件定时器

CCAPM0 |= 0x01;                                                                //PCA0比较中断使能

CL = 0;                                                                                                //PCA计数器低8位

CH = 0;                                                                                                //PCA计数器高8位

CCAP0L = aTime;                                                                //PCA0比较寄存器低8位

CCAP0H = aTime >> 8;                                        //PCA0比较寄存器高8位

CR = 1;                                                                                                //使能PCA计数

EPCA_LVD = 1;                                                                        //使能PCA中断

EA = 1;                                                                                                //打开中断总开关

while(1)

{

//逆时针旋转

while(aTime < Max)

{

delay_100ms(5);

aTime += Degree;

}

//顺时针旋转

while(aTime > Min)

{

delay_100ms(5);

aTime -= Degree;

}

}

}

void Delay100ms()                //@12.000MHz

{

unsigned char i, j, k;

_nop_();

_nop_();

i = 5;

j = 144;

k = 71;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

void delay_100ms(u16 x)

{

while(x--)  Delay100ms();

}

//PCA中断

void _PCA_() interrupt 6 using 1

{

static u8 flag = 1;

//PWM0比较中断

if(CCF0)

{

CCF0 = 0;                                                                                //中断标志位要软件清零

if(flag)                                                                                //如果之前PWM0_CTRL是高电平,则接下来产生时间宽度为TIME-aTime的低电平

{

CTRL = 0;

CCAP0L = TIME;

CCAP0H = TIME >> 8;

}

else                                                                                                //如果之前PWM0_CTRL是低电平,则接下来产生时间宽度为aTime的高电平

{

CTRL = 1;

CL = 0;

CH = 0;

CCAP0L = aTime;

CCAP0H = aTime >> 8;

}

flag = 1 - flag;

}

}

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部