PWM开发SG90

前言

2. PWM开发SG90

2.1 简介

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

2.2 如何实现 PWM 信号输出
        1. 通过芯片内部模块输出,一般观察手册或者芯片 IO 口都会标明这个是否是 PWM
如下图增强 51 STC15w CPU

        2. 如果没有集成 PWM 功能,可以通过 IO 口软件模拟,相对硬件 PWM 来说精准度略差

2.3 控制舵机

     1. 什么是舵机
         如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为 PWM 信号控制
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有 0-90° 0-180° 0-360°
     2. 怎么控制舵机
        向黄色信号线“ 灌入 ”PWM 信号。
  •         PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s20ms左右
                数据:
                0.5ms-------------0度; 2.5% 对应函数中占空比为 250
                1.0ms------------45度; 5.0% 对应函数中占空比为 500
                1.5ms------------90度; 7.5% 对应函数中占空比为 750
                2.0ms-----------135度; 10.0% 对应函数中占空比为 1000
                2.5ms-----------180度; 12.5% 对应函数中占空比为 1250
  •        定时器需要定时20ms, 关心的单位0.5ms, 40个的0.5ms,初值0.5m cnt++
                1s = 10ms * 100
                20ms = 0.5ms * 40
      3. 编程实现
#include "reg52.h"

sbit sg90_con = P1^1;
int jd;
int cnt = 0;

void Delay2000ms() //@11.0592MHz
{
    unsigned char i, j, k;
    i = 15;
    j = 2;
    k = 235;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}
void Time0Init()
{
    //1. 配置定时器0工作模式位16位计时
    TMOD = 0x01;
    //2. 给初值,定一个0.5出来
    TL0=0x33;
    TH0=0xFE;
    //3. 开始计时
    TR0 = 1;
    TF0 = 0;
    //4. 打开定时器0中断
    ET0 = 1;
    //5. 打开总中断EA
    EA = 1;
}
void Delay300ms() //@11.0592MHz
{
    unsigned char i, j, k;
    i = 3;
    j = 26;
    k = 223;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}
void main()
{
    Delay300ms();//让硬件稳定一下
    Time0Init(); //初始化定时器
    jd = 1; //初始角度是0度,0.5ms,溢出1就是0.5,高电平
    cnt = 0;
    sg90_con = 1;//一开始从高电平开始
    //每隔两秒切换一次角度
    while(1)
    {
        jd = 4; //135度 2ms高电平
        cnt = 0;
        Delay2000ms();
        jd = 1; //0度
        cnt = 0;
        Delay2000ms();
    }
}
void Time0Handler() interrupt 1
{
    cnt++; //统计爆表的次数. cnt=1的时候,报表了1
    //重新给初值
    TL0=0x33;
    TH0=0xFE;
    //控制PWM波
    if(cnt < jd)
    {
        sg90_con = 1;
    }
    else
    {
        sg90_con = 0;
    }
    if(cnt == 40)
    {
        //爆表40次,经过了20ms
        cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
        sg90_con = 1;
    }
}

2.4 遇见潇潇遇见你,不负代码不负卿

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值