当前位置: 首页 > news >正文

C51---PWM 脉冲宽度调制

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

占空比简单来说:一个周期内,高电平占据时长的百分比。

2.场景举例:手机信号灯,呼吸机警报灯。

3.代码例子:(控制PWM占空比,来控制sg90舵机的转动角度)

#include "reg52.h"
#include<intrins.h>
int  cnt = 0;                    //cnt要定为全局变量
sbit sg90_con =P1^1;    //定义sg90的管脚
int jiaodu;                        //定义一个舵机转动的角度
void Time0Init()
{
//1.配置定时器0工作模式位16位计时
    TMOD = 0x01;
//2.给初值,定一个10ms出来
    TL0 = 0x33;        //设置定时初值
    TH0 = 0xFE;        //设置定时初值
//3.开始计时
    TR0 = 1;
    TF0 = 0;
//4.打开定时器中断
    ET0 = 1; 
//5.打开总中断EA
    EA = 1;
}

void Delay300ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    //_nop_();  //这个地方报错,是因为缺少一个头文件:#include<intrins.h>  添加即可,不添加可以把_nop_();注释掉,用到再添加
    i = 3;
    j = 26;
    k = 223;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


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 main()
{
    Delay300ms();//让硬件稳定一下
    Time0Init();//初始化定时器
    jiaodu = 1;//初始化角度0度,0.5ms,高电平
     cnt   = 0;
    sg90_con = 1;//一开始从高电平开始
    
    //每个两秒,切换一下角度
        while(1){
            jiaodu = 3;//90度
            cnt    = 0; 
             Delay2000ms();
            jiaodu = 1;//0度
            cnt    = 0; 
             Delay2000ms();        
    }
    
}

//封装一个中断函数
void Time0Handler() interrupt 1 
{
        cnt++;//统计爆表次数,cnt等于1的时候,爆表了一次
        //重新给初值
        TL0 = 0x33;        
        TH0 = 0xFE;    
        sg90_con = 1;
    
    //控制PWM波
        if(cnt < jiaodu){  //cnt 决定舵机转动的角度
                    sg90_con = 1;
        }else{
                    sg90_con = 0;
            }
    
        if(cnt == 40){//cnt爆表了40次,经过了20ms
            cnt = 0;//当经过了20ms,重新让cnt从0开始,计算下一次的20ms.
            
            
    }

}


 

4.舵机图:

 

http://www.lryc.cn/news/35198.html

相关文章:

  • 毕业设计 基于51单片机WIFI智能家居系统设计
  • Nginx服务优化措施与配置防盗链
  • Java 某厂面试题真题合集
  • 很特别的5G市场,5.75亿部手机,却有11亿5G用户,这是怎么了?
  • go modules
  • Baklib客户故事:快递助手ERP
  • MongoDB学习(java版)
  • RK3568平台开发系列讲解(显示篇)什么是DRM
  • Python蓝桥杯训练:基本数据结构 [二叉树] 上
  • vuex基础之初始化功能、state、mutations、getters、模块化module的使用
  • WebSphere中间件漏洞总结
  • Unity之ASE实现影魔灵魂收集特效
  • 半入耳式耳机运动会不会掉、佩戴超稳固的运动耳机推荐
  • 使用Tensorflow完成一个简单的手写数字识别
  • OpenGL三种向着色器传递数据的方法 attributes,uniform,texture以及中间产物
  • 详解package.json和package-lock
  • 02-CSS
  • JavaScript 中的类型转换机制以及==和===的区别
  • RocketMQ基础篇(一)
  • Android前沿技术—gradle中的build script详解
  • 深入浅出PaddlePaddle函数——paddle.zeros_like
  • 物料-零部件分类属性
  • TypeError: cannot pickle ‘module‘ object
  • [MySQL索引]3.索引的底层原理(二)
  • JavaScript混淆——逆向思维的艺术
  • 数据库管理-第六十期 监听(20230309)
  • 概率论与数理统计相关知识
  • SOC计算方法:卡尔曼滤波算法
  • 【C语言】自定义类型、枚举类型与宏定义
  • Java进阶(下篇2)