单片机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黑下载附件…………

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值