• 51单片机直流电机控制


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    提示:这里可以添加本文要记录的大概内容:

    我们学习了51单片机的定时器之后,已经定时1s,用按键控制定时的时间。
    之前产生的波形都是方波,就是高电平、低电平一样的波形。PWM


    提示:以下是本篇文章正文内容,下面案例可供参考

    一个学期都没搞懂的直流电机工作原理,一分钟讲解清楚!

    https://www.bilibili.com/video/BV1yV4y1o7Nd/?spm_id_from=333.337.search-card.all.click

    基于51单片机直流电机调速实验

    https://www.bilibili.com/video/BV1Eo4y1m774/?spm_id_from=333.337.search-card.all.click

    一、pwm波形?

    示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

    1.1高低电平交互,LED亮灭。

    接通电机会有效果?

    在这里插入图片描述

    1.2 驱动电机时?

    电压越高,电机转得越快

    1.3 怎么调节电机的速度?

    在这里插入图片描述
    在这里插入图片描述

    二、怎么用51单片机产生PWM波形

    2.1 t 怎么来?

    t=t0+t1;=50+10=60
    D=10/60%100

    2.2 t0怎么来?

    sbit motor=P1^0;

    t0=50ms ,motor=0;
    定时50ms,

    TH0=( 65536-50000)/256;
    TL0=( 65536-50000)%256;

    2.3 t1怎么来?

    t1=10ms
    定时10ms,motor=1;
    TH0=( 65536-10000)/256;
    TL0=( 65536-10000)%256;

    2.4 如何更好的写程序,只用一个时间基准1ms

    TH0=( 65536-1000)/256;
    TL0=( 65536-1000)%256;
    t0=150
    t1=1
    10

    50 10 ->num
    num<10 motor=1
    num>=10 motor=0
    num=60 num=0

    在这里插入图片描述

    2.5参考程序

    代码如下(示例):

    #include
    
    void main()
    {
    	//初始化定时器
    	while(1)
    	{
    		if(key0)
    		{
    		   10
    		}
    		
    		if(key1)
    		{
    		   60
    		}
    
    	}
    
    }
    
    void timer0()interrupt 1
    {
    
    	TH0=( 65536-1000)/256;
    	TL0=( 65536-1000)%256;
    	num++;
    	if(num<10)
    	{
    		motor=1;
    	}else if(num<60)
    	{
    	     motor=0;
    	}
    	else
    	{
    		num=0;
    	}
    	
    	
    /*	t0=1*50
    	t1=1*10
    
    	50 10   ->num
    	num<10   motor=1
    	num>=10 motor=0
    	num=60  num=0*/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    #include
    
    sbit motor=P1^0;
    sbit key0=P3^0;
    sbit key1=P3^1;
    
    sbit led0=P2^0;
    
    unsigned int num=0;
     int d=0;//占空比
    //unsigned int t=0;
    #define t 1000
    
    
    void delay(unsigned int ms)
    {
    	unsigned int x,y;
    	for(x=0;x<ms;x++)
    	{
    		for(y=0;y<100;y++);
    	}
    }
    
    
    
    void timer_init()
    {
    	TMOD=0X01;//方式1 16位
    	TH0=( 65536-1000)/256;
    	TL0=( 65536-1000)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	
    }
    
    void main()
    {
    	//初始化定时器
    	timer_init();
    	key0=1;
    	key1=1;
    	while(1)
    	{
    		if(!key0)
    		{
    		    delay(5);
    			if(!key0)
    			{
    				while(!key0);
    				d=d+100;
    				if(d>t)
    				{
    				  d=t;
    				}
    			}
    			
    		}
    		
    		if(!key1)
    		{
    		    delay(5);
    			if(!key1)
    		    {
    				while(!key1);
    				d=d-100;
    				if(d<0)
    				{
    					d=0;		
    				}
    			 }
    				
    		}
    
    	}
    
    }
    
    void timer0()interrupt 1
    {
    
    	TH0=( 65536-1000)/256;
    	TL0=( 65536-1000)%256;
    	num++;
    	if(num<d)
    	{
    		motor=1;
    	}else if(num<t)
    	{
    	     motor=0;
    	}
    	else
    	{
    		num=0;
    		led0=~led0;
    	}
    	
    	
    /*	t0=1*50
    	t1=1*10
    
    	50 10   ->num
    	num<10   motor=1
    	num>=10 motor=0
    	num=60  num=0*/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106

    三、电路连接图

    3.1电机连接图

    在这里插入图片描述

    3.2 ULN2003 逻辑图

    在这里插入图片描述

    3.3 按键连接图

    在这里插入图片描述

    四、 电机开机、关机

    
    
    //开机: TR0=1;
    
    if(!key2)
    {
    	TR0=1;
    }
    
    
    //关机:TR0=0;
    
    if(!key3)
    {
    	TR0=0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    五、思考

    5.1 如何控制电机正反转?

    5.2 如何控制多个电机?

    总结

    了解直流电机工作原理,熟悉定时器定时功能,掌握电机调速技术。

  • 相关阅读:
    愚人节礼物(C++)
    esaypoi导入excel工具模版
    将word中的表格无变形的弄进excel中
    Vue watch属性
    postman的简单使用
    Ubuntu系统初始设置
    弱网神器:quic-tun(在存在丢包的网络环境中成倍的提升 TCP 性能)
    【python】scikit-learn包:机器学习
    【POJ No. 1330】 最近公共祖先 Nearest Common Ancestors
    P04 Navicat 15 安装使用
  • 原文地址:https://blog.csdn.net/ganhui13000/article/details/134508216