简介
PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进
行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通
过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的
时间占据整个信号周期的百分比,例如方波的占空比就是50%。
如何实现pwm信号输出
-
通过芯片内部模块输出,一般观察手册或者芯片IO口都会标明这个是否是PWM口
如下图增强51,STC15w的CPU -
如果没有集成PWM功能,可以通过IO口软件模拟,相对硬件PWM来说精准度略差
舵机
- 什么是舵机
如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有0-90°、0-180°、0-360°
- 怎么控制舵机
编程实现
#include "reg52.h"
#include "intrins.h"
sbit STEERING = P2^3;
int cnt = 0;
int jd; //舵机旋转角度
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;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Timer0Init_500us(void) //0.5??@11.0592MHz
{
// AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x33;
TH0 = 0xFE;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0_Rountine() interrupt 1
{
cnt++; //定时次每次爆表,cnt自加1
TL0 = 0x33;
TH0 = 0xFE;
//控制pwm波输出
if(cnt < jd)
{
STEERING = 1;
TL0 = 0x33;
TH0 = 0xFE;
}
else
{
STEERING = 0;
TL0 = 0x33;
TH0 = 0xFE;
}
if(cnt == 39) //定时器爆表40次,0.5ms * 40 = 20mos
{
STEERING = 1;
cnt = 0;
}
}
void main()
{
Delay300ms(); //稳定硬件
Timer0Init_500us(); //初始化定时器
STEERING = 1; // 一开始给高电平
jd = 1;
while(1)
{
jd = 1; //0度
cnt = 0;
Delay2000ms();
jd = 4; //135度 2ms高电平
Delay2000ms();
cnt = 0;
}
}