历史上的今天
今天是:2025年10月20日(星期一)
2022年10月20日 | 【51单片机STC89C52】IO口模拟PWM控制SG90舵机
2022-10-20 来源:csdn

一、PWM
PWM ,英文名 Pulse Width Modulation ,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通 过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的 时间占据整个信号周期的百分比,例如方波的占空比就是50%.
占空比 : 一个周期内,高电平占据时长的百分比

STC89C52没有集成PWM功能,可以通过IO口软件模拟,相对硬件PWM来说精准度略差
二、关于舵机控制原理

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。
以180度角度伺服为例,那么对应的控制关系是这样的:

定时器需要定时20ms, 单位为0.5ms,初值0.5ms,cnt++,通过计数cnt=40个的0.5ms即为20ms
三、编程实现
初始化定时器0
void Timer0Init(void) //500微秒@11.0592MHz
{
//AUXR &= 0x7F;
TMOD &= 0xF0; //设置定时器模式16位
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初始值0.5ms
TH0 = 0xFE; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断EA
}
定时器0中断服务函数
void Time0Handler() interrupt 1
{
cnt++; //统计溢出的次数
//重新给初值
TL0 = 0x33;
TH0 = 0xFE;
//控制PWM波
if(cnt < angle){
sg90_con = 1;
}else{
sg90_con = 0;
}
if(cnt == 40){ //当溢出40次,经过了20ms
cnt = 0;
sg90_con = 1;
}
}
整体代码
#include "reg52.h"
#include "intrins.h"
sbit sg90_con = P1^1;
int angle;
int cnt = 0;
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0Init(void) //500微秒@11.0592MHz
{
//AUXR &= 0x7F;
TMOD &= 0xF0; //设置定时器模式16位
TMOD |= 0x01; //设置定时器模式
TL0 = 0x33; //设置定时初始值0.5ms
TH0 = 0xFE; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断EA
}
void main()
{
Delay300ms();//让硬件稳定一下
Timer0Init(); //初始化定时器
angle = 1; //初始角度是0度,0.5ms,溢出1就是0.5,高电平
cnt = 0;
sg90_con = 1;//一开始从高电平开始
//每隔两秒切换一次角度
while(1){
angle = 3; //90度 1.5ms高电平
cnt = 0;
Delay2000ms();
angle = 1; //0度
cnt = 0;
Delay2000ms();
}
}
void Time0Handler() interrupt 1
{
cnt++; //统计溢出的次数
//重新给初值
TL0 = 0x33;
TH0 = 0xFE;
//控制PWM波
if(cnt < angle){
sg90_con = 1;
}else{
sg90_con = 0;
}
if(cnt == 40){ //当溢出40次,经过了20ms
cnt = 0;
sg90_con = 1;
}
}
史海拾趣
|
豪华的单片机开发系统498元 可稳定视频输出的: S3C2410 ARM9开发板780元DSP5402学习开发板II200元 暑期大优惠:S3C44B0开发板(标准版)350元 单片机以太网开发板 180元 DSP5402学习开发板II200元 LABTOOL-48UXP &nbs ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 新浪科技讯 2005年11月24日,由中国计算机用户协会多媒体应用专业委员会主办,智达市场策略顾问有限公司承办的中国IPTV产业政策及技术、标准研讨会在北京新世纪饭店召开。在此次会议上,将首次 ...… 查看全部问答> |
|
网络化、信息化的要求随着因特网技术的成熟、带宽的提高日益提高,使得航天时代不仅促进了运载火箭技术,应用卫星技术与深空探测技术的迅猛发展,而且也使因特网发展成了太空网,延伸到了1亿2000万公里的火星,促进了嵌入式技术在航天应用的迅 ...… 查看全部问答> |
|
国内首个LED路灯地方标准将于7月1日开始在广东实施,珠三角LED路灯行业自此将有章可循。 近日,广东省质量技术监督局审核通过了由东莞勤上光电股份有限公司提出并组织起草的《广东省LED路灯地方标准》,并将于7月1日起实施,制定此类标准在广东 ...… 查看全部问答> |
|
小弟新学DSP,现在想自己画一块DSP的开发板。找了很多参考资料,有几个疑问,我觉得可能初学者都会问的。 问题如下: 1.DSP程序的串口下载方式。 这种方式可以省了买仿真器的一笔很大的花费,这个电路上有什么特别之处么?跟一般的串口通讯电 ...… 查看全部问答> |
|
wince 6下在eboot中把flash分成了两个分区,一个给bin镜像: BP_OpenPartition(NEXT_FREE_LOC, ( g_burnSize + sector_size) / sector_size, PART_BINFS, TRUE, PART_CREATE_NEW); 一个分成fat供用户使用: BP_OpenPartition(NEXT_FREE_LOC, USE ...… 查看全部问答> |
|
cycloneIII EP3C5E144C8N 中时钟的问题 时钟CLK[0..3] 和CLK[4..7] 如何连接,如果想通过pll输出一个时钟,那么输出的时钟应该锁定在那个引脚上呢,请各位大侠帮帮忙啊!!!!!!… 查看全部问答> |
|
【活动贴】一起学器件指标第三弹内容讨论先简述下活动方式: 1、每周我们发布一个器件类型,并公布部分学习的器件指标。说是部分,主要是因为大家肯定还会补充一些器件指标。2、在每周发布一个器件类型的同时,我们讨论下一周的器件类型,以及该器 ...… 查看全部问答> |
|
【手机工具】FPGA高手必看资料,Xilinx的ISE软件高级设计功能的使用,强烈推荐!!! FPGA高手必看资料,Xilinx的ISE软件高级设计功能的使用,节选自经典书籍的经典章节,完全按照中国工程师和中国学生的思维方式,让人知其然,更知其所以然,非常具有针对性,所介绍的功能相 ...… 查看全部问答> |




