1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 单片机C语言PWM程序原理 初学单片机之PWM控制舵机的原理与C语言源程序

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

时间:2022-12-14 18:21:47

相关推荐

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

/***

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

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

**编写时间:.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黑下载附件…………

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。