• (十五)51单片机——呼吸灯与直流电机调速(PWM)


     

    目录

    学习目标

    成果展示 

    引言

    代码

    硬件知识

    介绍

    驱动电路

    大功率器件直接驱动 

    H桥驱动

    PWM介绍

    产生PWM

    模型结构

    波形 

    代码 

    总结 


    学习目标

            今天我们的学习目标就是实现一个简单的呼吸灯,之后再用PWM实现直流电机的调速功能,驱动我们的电机,制造一个可以调速的小电风扇。

    成果展示 

    呼吸灯

    直流电机

    引言

            首先,我们要解决一个问题,就是我们如何去调节LED灯的亮度?第一时间想到的肯定是调电压,只要电压低,亮度不久下来了吗?确实是这样的,但是在单片机中调节电压不现实,所以我们采用让灯亮一下,灭一会,我们通过控制供电的时间,来达到控制LED灯的亮度。其实PWM也是这样类似的思想,那我们从控制灯的亮度开始,来慢慢理解PWM的工作原理吧!

    代码

    1. #include
    2. sbit LED = P2^0;
    3. void Delay(unsigned int t)
    4. {
    5. while(t--);
    6. }
    7. void main(){
    8. unsigned int Time,i;
    9. while(1){
    10. for(Time = 0; Time < 100; Time++){//改变亮灭时间,由暗到亮
    11. for(i = 0; i < 20; i++){//计次延时
    12. LED = 0;//LED亮
    13. Delay(Time); //延时Time
    14. LED = 1;//LED灭
    15. Delay(100 - Time);//延时100-Time
    16. }
    17. }
    18. for(Time = 100; Time > 0; Time--){//改变亮灭时间,由亮到暗
    19. for(i = 0; i < 20; i++){
    20. LED = 0;
    21. Delay(Time);
    22. LED = 1;
    23. Delay(100 - Time);
    24. }
    25. }
    26. }
    27. }

            运行结果如上所示,起到了控制LED灯亮度的功能。 

    硬件知识

    介绍

    • 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
    • 直流电机主要由永磁体(定子)、线圈(转子)和换向器组成
    • 除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等

    驱动电路

    大功率器件直接驱动 

            ULN2003D在我们之前介绍过,后面那个相当三极管,起到放大电路的作用,下面的二极管起到保护电路的作用,因为电机可能感应出来比较大电压,从而烧坏电路,

     

    H桥驱动

            就是通过导通Q1、Q4形成正向电流或者Q2、Q3形成反向电流,但就是需要确保反向电流不会损坏电路。

     

    PWM介绍

    • PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域
    • PWM重要参数:

         频率 = 1 / TS            占空比 = TON / TS           精度 = 占空比变化步距

            其实就是通过不断给电压,不给电压,来调节频率,和之前的呼吸灯类似。 

     

    产生PWM

    模型结构

    波形 

     

            其实核心原理还是一样的,只不过我们使用定时器来实现PWM。我们结合我们的代码来理解要好一点。 

    代码 

    1. #include "Nixie.h"
    2. #include "Time0.h"
    3. sbit Motor = P1^0;
    4. unsigned char Counter,Compare;//计数值和比较值,用于输出PWM
    5. unsigned char KeyNum,Speed;
    6. void main(){
    7. Timer0_Init();
    8. Compare = 4;
    9. while(1){
    10. KeyNum = Key();
    11. if(KeyNum == 1){
    12. Speed++;
    13. Speed %= 4;
    14. if(Speed==0){Compare=0;} //设置比较值,改变PWM占空比
    15. if(Speed==1){Compare=45;}
    16. if(Speed==2){Compare=70;}
    17. if(Speed==3){Compare=90;}
    18. }
    19. Nixie(1,Speed);
    20. }
    21. }
    22. void Timer0_Routine() interrupt 1
    23. {
    24. static unsigned int T0Count;
    25. TL0 = 0xAD; //设置定时初始值
    26. TH0 = 0xFF;
    27. Counter++;
    28. Counter%=90;
    29. if(Counter < Compare){
    30. Motor = 1;
    31. }else
    32. Motor = 0;
    33. }

    总结 

            总体来说本节知识不难,希望对大家有所帮助,如果有错误也希望能及时指出,谢谢大家。 

  • 相关阅读:
    Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7
    亏损扩大/毛利偏低,北斗智联与「智能座舱第一阵营」的不等号
    可视化工具Datart踩(避)坑指南(5)——先清空回收再删除
    MATLAB循环结构之while语句
    Day28_vuex模块化+namespaced_2
    git提交三板斧(如何把项目代码提交到gitee上——命令行版)
    OPPO 文件传输 - 将文件从 OPPO 手机传输到 PC 的 5 种方法
    Java设计模式之访问者模式
    【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二)
    面试背诵版—操作系统
  • 原文地址:https://blog.csdn.net/weixin_66578482/article/details/126130678