直流电机_直流电机驱动 - CSDN
  • 直流电机的原理及驱动

    千次阅读 2019-07-10 14:40:23
    文章目录直流电机的原理直流电机的种类有刷电机无刷电机空心杯直流减速电机减速器 直流电机的原理 在了解直流电机工作原理之前,先复习一下高中几个物理知识 第一.左手定则 通电导线处于磁场中时,所受安培力 F (或...

    直流电机的原理

    在了解直流电机工作原理之前,先复习一下高中几个物理知识

    第一.左手定则
    在这里插入图片描述
    通电导线处于磁场中时,所受安培力 F (或运动)的方向、磁感应强度B的方向 以及通电导体棒的电流I三者方向之间的关系的定律。
    简而言之,让磁感线穿过手掌正面,手指方向为电流方向,大拇指方向为产生磁力的方向

    第二.右手定则
    在这里插入图片描述
    右手定则,是产生感生电动势,也是发电机的原理
    让磁感线穿过掌心,大拇指方向为运动方向,手指方向为产生的电动势方向。

    直流电机工作原理

    在这里插入图片描述
    直流电机里边固定有环状永磁体,电流通过转子上的线圈产生安培力,当转子上的线圈与磁场平行时,再继续转受到的磁场方向将改变,因此此时转子末端的电刷跟转换片交替接触,从而线圈上的电流方向也改变,产生的洛伦兹力方向不变,所以电机能保持一个方向转动。

    直流发电机的工作原理就是把电枢线圈中感应的交变电动势,靠换向器配合电刷的换向作用,使之从电刷端引出时变为直流电动势的原理。感应电动势的方向按右手定则确定(磁感线指向手心,大拇指指向导体运动方向,其他四指的指向就是导体中感应电动势的方向)。导体受力的方向用左手定则确定。这一对电磁力形成了作用于电枢一个力矩,这个力矩在旋转电机里称为电磁转矩,转矩的方向是逆时针方向,企图使电枢逆时针方向转动。如果此电磁转矩能够克服电枢上的阻转矩(例如由摩擦引起的阻转矩以及其它负载转矩),电枢就能按逆时针方向旋转起来。

    直流电机的种类

    转子定子的概念在步进电机里已经有了很详细的阐述,传送门

    有刷电机

    在这里插入图片描述
    有刷电机,顾名思义,就是有刷子,主要作用就是让中间的转子与电源有电气连接,还可以转动
    为了让两者之间既有接触,能导电;又有转动,实现电流的变相,一般的常见做法是在碳刷加一个弹簧。这样,换向器与碳刷便有了频繁的摩擦。所以碳刷很容易磨损,必须经常进行更换。并且磨损掉的碳渣渣在电机里面形成了积碳,需要经常清理。

    早期电机都是有刷电机,后来为了解决磨损,有了无刷电机

    无刷电机

    无刷电机的解决思路就是让磁铁转动
    分两种外转子内转子

    在这里插入图片描述
    图左为内转子,图右为外转子

    空心杯

    空心杯和传统电机不同,采用的是无铁芯转子,也叫空心杯型转子。也分有刷和无刷
    在这里插入图片描述

    直流减速电机

    了解了直流电机原理和种类之后,开始学习直流减速的电机的驱动
    直流减速电机相比较直流电机加了减速器

    减速器

    一般直流电机的转速都是一分钟几千上万转的,所以一般需要安装减速器。减速器是一种相对精密的机械零件,使用它的目的是降低转速,增加转矩。减速后的直流电机力矩增大、可控性更强。按照传动级数不同可分为单级和多级减速器;按照传动类型可分为齿轮减速器蜗杆减速器行星齿轮减速器
    在这里插入图片描述
    齿轮减速器体积较小,传递扭矩大,但是有一定的回程间隙。
    蜗轮蜗杆减速机的主要特点是具有反向自锁功能,可以有较大的减速比,但是一般体积较大,传动效率不高,精度不高。
    行星减速器其优点是结构比较紧凑,回程间隙小、精度较高,使用寿命很长,额定输出扭矩可以做的很大,但价格略贵。

    常用的是下面这个多级齿轮电机
    在这里插入图片描述

    驱动很简单,只要正负极加电压就行了

    减速电机驱动器

    常用的有L298N,TB6612FNG
    这里我用的是tb6612fng
    datasheet下载地址

    TB6612FNG is a driver IC for DC motor with output transistor in LD MOS
    structure with low ON-resistor. Two input signals, IN1 and IN2, can
    choose one of four modes such as CW, CCW, short brake, and stop mode.

    TB6612FNG是直流电机的驱动器IC,输出晶体管采用LD MOS结构,具有低导通电阻。两个输入信号IN1
    和IN2,可以选择四种模式中的一种,如CW,CCW,短制动和停止模式。

    特征
    ·电源电压:VM = 15V(最大值)
    ·输出电流:IoUT = 1.2 A(ave)/3.2 A(峰值)
    ·输出低导通电阻:0.5Q(上限+下限典型值@VM≥5V)
    ·待机(省电)系统
    ·CW / CCW /短制动/停止功能模式
    ·内置热关断电路和低压检测电路
    ·小面积封装(SSOP24:0.65 mm引脚间距)

    几个参数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    VM:如上图,电机供电,范围2.5-13.5v
    VCC:芯片供电,范围2.7-5.5v
    GND接地
    AIN1,AIN2:电机方向控制,接单片机
    BIN1,BIN2同A
    PWMA,PWMB:电机调速控制,接单片机
    AO1AO2:接电机的正负
    BO1,BO2:同A

    51版验证程序

    #include<reg52.h>
    
    typedef unsigned char u8;
    typedef unsigned int u16;
    typedef unsigned long u32;
    
    u8 TR0H;
    u8 TR0L;
    bit flag_1s=0;
    
    u32 PeriodCnt = 0;
    u8 HighRH = 0;
    u8 HighRL = 0;
    u8 LowRH = 0;
    u8 LowRL = 0;
    u8 T1RH = 0;
    u8 T1RL = 0;
    
    sbit AIN1=P0^2;//AIN1引脚定义
    sbit AIN2=P0^1;//AIN2引脚定义
    sbit PWMA=P0^0;//PWM输出引脚定义
    
    
    
    void ConfigPWM(u16 fr, u8 dc);//配置PWM,fr频率,dc占空比
    void ConfigTimer1(u8 ms);
    void MotorForward()
    {
    	 AIN1=1;
    	 AIN2=0;
    }
    
    void MotorReverse()
    {
    	 AIN1=0;
    	 AIN2=1;
    }
    延时程序 11.0592mhz
    /oid delayms(u16 t)
    //{
    //	u16 i,j;
    //	for(i=t;i>0;i--)
    //		for(j=114;j>0;j--);
    //}
    void main()
    {
    	
    
    //	ConfigTimer1(100);
    	MotorReverse();
    	ConfigPWM(100,80);//pwn配置
    	EA = 1;//打开总中断
    	
    	
    	while(1)
    	{
    //		if(flag_1s==1)
    //		{
    //			flag_1s=0;
    //			if(DIR)
    //			{
    //				DIR=0;
    //			}
    //			else
    //			{
    //				DIR=1;
    //			}
    //		}
    	}
    	
    	
    
    }
    
    void ConfigTimer1(u8 ms)
    {
    	u32 temp;
    
    	temp=11059200/12;
    	temp=(temp*ms)/1000;
    	temp=65535-temp;
    	TR0H=(u8)(temp>>8);
    	TR0L=(u8)temp;
    	TMOD&=0XF0;
    	TMOD|=0x10;
    	TH1=TR0H;
    	TL1=TR0L;
    	ET1=1;
    	TR1=1;
    
    
    }
    //pwm配置程序
    void ConfigPWM(u16 fr, u8 dc)
    {
        u16 high, low;
    
        PeriodCnt = (11059200/12)/fr;
        high = (PeriodCnt*dc)/100;
        low = PeriodCnt - high;
        high = 65536 - high;
        low = 65536 - low;
        HighRH = (u8)(high>>8);
        HighRL = (u8)high;
        LowRH = (u8)(low>>8);
        LowRL = (u8)low;
    
        TMOD &= 0xF0;
        TMOD |= 0x01;
        TH0 = HighRH;
        TL0 = HighRL;
        ET0 = 1;
        TR0 = 1;
        PWMA = 1; 
    }
    
    //pwm中断程序
    void InterruptTimer0() interrupt 1
    {
        if(PWMA == 1)
        {
            TH0 = LowRH;
            TL0 = LowRL;
            PWMA = 0;
        }
        else
        {
            TH0 = HighRH;
            TL0 = HighRL;
            PWMA = 1;
        }
    }
    
    void Timer1()interrupt 3
    {
    	static u8 times=0;
    
    	TH1=TR0H;
    	TL1=TR0L;
    	times++;
    	if(times>200)
    	{
    		times=0;
    		flag_1s=1;
    	}
    }
    

    验证完成
    在这里插入图片描述

    展开全文
  • 直流电机控制(一)

    千次阅读 多人点赞 2013-08-10 21:54:51
    做硬件会经常的和直流电机打交道,很多直流电机体积小,应用广泛,就我所涉及的领域,机器人就会设计很多直流电机的精确控制。这里参照《电力拖动自动控制系统——运动控制系统》一书,对直流电动机的控制从理论入手...

    做硬件会经常的和直流电机打交道,很多直流电机体积小,应用广泛,就我所涉及的领域,机器人就会设计很多直流电机的精确控制。这里参照《电力拖动自动控制系统——运动控制系统》一书,对直流电动机的控制从理论入手,结合所做项目设计的电机控制方法,让理论“接地气”,从而让技术人员走的更远,思考更有深度。

    《电力拖动自动控制系统——运动控制系统》这本书其本质就涉及两大块的内容:直流电机的控制系统的设计,交流电机的控制系统的设计。直流电机的控制大家可能会很熟悉,单片机的pwm控制,调节占空比,从而调节转速……交流电机的控制技术的研究主要是由于交流电动机寿命长,维护成本低,可直接用于电网……这里从直流电机开始!


    先来一个公式:直流电动机转速和其他参量之间的稳态关系

    n=(U-IR)/(Keφ)

    n——转速;

    U——电枢电压;

    I——电枢电流;

    R——电枢回路总电阻;

    φ——励磁磁通;
    Ke——常数(由电机结构决定);

    首先电枢电流是由电机负载决定的,电机负载大,则电枢电流大。Ke是常数,有电机结构决定的,基本不会影响到调速。所以目前来看调速只能通过控制电枢电压,电枢回路的电阻,降低励磁磁通来决定了。

    如果负载一定的话,我们通过调节U,R,φ,都可以调节转速,电阻调速简单,但耗能。励磁磁通的产生是由于励磁电流,有一些小的直流电机使用的是永磁体,所以改变磁通不是一个调速的好方法。

    所以改变电枢电压调速成为现在直流调速的主体。其优点是调速性能更稳定,更平滑,更快。

    调节电枢电压也就是调节电机输入的电压大小。电机作为一个执行器,我们希望它能够实现精确的速度控制,加速度控制(转矩控制)。我们设想一下,电机负载一定的情况,我们给出一个电压,电机稳态的转速理论上是可以确定的,但是受各种因素的影响,这种理想情况很难达到,所以结合经典自动控制理论,可以实现这一目的。经典自动控制理论最重要的思想是反馈调节,这个理论能做什么呢?这些理论都是作为设计,制造实际产品的工具,没有书上写的那么玄乎,我们重点知道他们能解决什么问题。首先经典自控理论所描述的方法是针对线性环节,先来一张闭环控制系统的原理框图:

    每个矩形框里面都是一个环节,都可以用数学描述为一个方程。例如温度的自动控制系统框图可根据这个原理描述为:

    经典控制理论的特点是以输入输出特性(主要是传递函数)为系统数学模型,采用频率响应法和根轨迹法这些图解分析方法,分析系统性能和设计控制装置。

    重点是最后一句,分析系统的性能和设计控制装置,性能无非是,系统稳定性,动态特性,静态特性。我们所关心的是控制器,我们可以设计一款控制器是我们的执行器直流电机打到我们的要求就行了。

    展开全文
  • 直流电机控制系统

    千次阅读 2017-11-16 10:44:32
    在这里,和大家分享一下我用单片机做的一个直流电机控制系统。这是我在计算机学院的一个实训中做出来的,当时我是机械学院的,对嵌入式很感兴趣,就跨专业选了这个实训(教务网允许)。初衷嘛,我是想实现一个四旋翼...

    在这里,和大家分享一下我用单片机做的一个直流电机控制系统。这是我在计算机学院的一个实训中做出来的,当时我是机械学院的,对嵌入式很感兴趣,就跨专业选了这个实训(教务网允许)。初衷嘛,我是想实现一个四旋翼飞行器,若能很好的控制4个高速电机的转速,就可以使飞行器飘起来。为此,我使用3D打印技术,制作了一个四旋翼的机架,将四个电机分别安装到4个翅膀上。下面就开始实施我的计划了!!(下面有成果图)
    实现的效果是:电机的转速分为7个等级,对于4个电机,可以使用旋钮使整体调速,也可以用遥杆单独调速(在旋钮整体调速的基础上),并在显示屏上显示转速等级。
    这里写图片描述
    目录
    1.课题简介 1
    2.风扇控制系统的总体设计 1
    3.电路设计 1
    3.1 LED1602液晶显示屏电路图 1
    3.2 旋钮的控制电路 2
    3.3摇杆的控制电路 2
    3.4显示模块:LCD1602液晶显示屏 2
    4.程序设计 4
    4.1单片机1主函数的流程图 4
    4.2单片机1子函数1流程图 5
    4.3单片机1子函数2流程图 6
    4.4单片机2主函数设计 6
    4.5单片机2 pwm中断程序设计 7
    5 系统测试 8
    5.1测试的原理 8
    5.2测试的过程 8
    6.附录 10
    附录A:实物照片 10
    附录B:源代码 10
    7.总结 22
    8.感谢 22
    9. 参考文献 22

    1.课题简介
    随着时代的发展,科技的进步,微电子技术也在不断的发展。单片机的应用也越来越贴近生活,用单片机来实现一些电子设计也变得很容易。直流电机的控制在生产生活中很常见,本次设计是用单片机来控制简单的直流电机系统,通过控制模块来调节单片机的转速。
    2.风扇控制系统的总体设计
    这里写图片描述

    3.电路设计
    3.1 LED1602液晶显示屏电路图
    (此处略,网上有各种资料)

    3.2 旋钮的控制电路
    介绍:旋钮模块一共有五个引脚,其中两根为电源和接地引脚。SW引脚的作用是旋钮按下去时,给单片机低电平的信号。另外两个引脚CLK与DT相互作用,来表示旋钮的正反转,当两个引脚的信号变化为11——01——00——10时,表示顺时针旋转。当两个引脚的信号变化为11—–10—–00—–01时,表示逆时针旋转。单片机检测整个模块传来的电信号,进行数据处理。

    3.3摇杆的控制电路
    摇杆模块一共有五个引脚,其中两根为电源和接地,SW引脚判断摇杆是否按下,VRx与VRy引脚是用来表示x方向与y方向的位移大小。在单片机系统设计中,其实是用数模转换模块PCF8591,通过I2C总线传输的方式进行数据传输,并在串口调试助手中一直检测x方向和y方向的电阻值变化

    4.程序设计(这里本来有许多图,还不会用这个博客,图片弄不上去。。。。)

    4.1单片机1主函数的流程图
    这里写图片描述

    4.2单片机1子函数1流程图
    这里写图片描述

    4.3单片机1子函数2流程图
    这里写图片描述

    4.4单片机2主函数设计
    这里写图片描述

    4.5单片机2 pwm中断程序设计
    这里写图片描述

    5 系统测试
    5.1测试的原理
    整个系统一共有两个控制模块,旋钮和摇杆,当旋钮顺时针旋转时,电机的转速逐渐升高,在LCD显示屏中显示电机的转速级别,逆时针旋转时,电机转速逐渐降低,直至为0.当按下旋钮时,电机的转速直接跳转为0。摇杆的作用是分别控制四个电机的转速,摇杆的方向分别为上,下,左,右时,对应的控制电机序号分别为一,二,三,四。按下旋钮,各个电机的转速增量变为0。同时,摇杆和旋钮可以共同作用,一起控制电动机的转速。
    5.2测试的过程
    (1)旋钮和摇杆的控制
    这里写图片描述

    6.附录
    附录A:实物照片

    附录B:源代码
    单片机1源代码

    #include <I2C.H>
    #include "lcd.h"
    #define uchar unsigned char
    #define  PCF8591 0x90    
    unsigned char AD_CHANNEL;
    unsigned long xdata  LedOut[8];
    unsigned char  D[32];
    sbit aPin=P1^0;
    sbit bPin=P1^1;
    sbit press=P1^2;
    sbit P2_0 = P2^0;
    sbit P2_1 = P2^1;
    sbit p22 = P2^2;//
    sbit p23 = P2^3;//
    sbit p24 = P2^4;//
    sbit p12 = P1^2;
    sbit p13 = P1^3;//
    sbit p14 = P1^4;//
    sbit p15 = P1^5;//
    sbit p16 = P1^6;
    sbit p17 = P1^7;
    unsigned char peng[]="0123456789";
    unsigned char date;
    unsigned int num;
    unsigned int suv;
    int a;
    unsigned char count;
    //unsigned char jd=8;
    //sbit pwm0=P2^2;
    //sbit pwm1=P2^3;
    //sbit pwm2=P2^4;
    //sbit pwm3=P2^3;
    sbit jia=P3^2;
    sbit jian=P3^3;
    unsigned char jd;
      // 
    int scan();
    void display(int m);
    void delay(int i);
    bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val);
    bit ISendByte(unsigned char sla,unsigned char c);
    unsigned char IRcvByte(unsigned char sla);
    void Initial_com(void);
    void xuanniu_process();
    void yaogan_process();
    void xuanniu_process()//
    {
        a=a+scan();
            if(a<0) a=0;
            if(a>7) a=7;
             display(a);
            jd=a;
            if(p12==0) a=0;
            switch (jd) 
            {
                case 0:p24=0;p23=0;p22=0;break;
                case 1:p24=0;p23=0;p22=1;break;
                case 2:p24=0;p23=1;p22=0;break;
                case 3:p24=0;p23=1;p22=1;break;
                case 4:p24=1;p23=0;p22=0;break;
                case 5:p24=1;p23=0;p22=1;break;
                case 6:p24=1;p23=1;p22=0;break;
                case 7:p24=1;p23=1;p22=1;break;
            }
        }
        void yaogan_process()//
        {
            switch(AD_CHANNEL)
            {
                case 0: ISendByte(PCF8591,0x41);
                     D[0]=IRcvByte(PCF8591);  //
                     break;  
    
                case 1: ISendByte(PCF8591,0x42);
                     D[1]=IRcvByte(PCF8591);  //
                     break;  
                case 2: ISendByte(PCF8591,0x43);
                     D[2]=IRcvByte(PCF8591);  //
                     break;  
                        case 3: ISendByte(PCF8591,0x40);
                     D[3]=IRcvByte(PCF8591);  //ADC3   
                     break;  
                            case 4: DACconversion(PCF8591,0x40, D[4]); //
                     break;
                    }
            D[4]=D[3];  //
                       if(++AD_CHANNEL>4) AD_CHANNEL=0;
               delay(200);
            delay(200);
         SBUF=D[0];
         delay(200);
         SBUF=D[3];
         delay(200);        
            if (D[0]<=130) num=0;//80
    else if (D[0]>130&&D[0]<136) num=1;
    else if (D[0]>=136) num=2;  
            if (D[3]<=110) suv=0;//80
    else if (D[3]>110&&D[0]<=134) suv=1;
    else if (D[3]>134)  suv=2;  //i have try a lot,but it seems that
            if(num==0&&suv==1) {p15=0;p14=0;p13=0;} //right
            if(num==2&&suv==1) {p15=0;p14=1;p13=0;}//left
            if(num==1&&suv==0) {p15=0;p14=1;p13=1;}//up
            if(num==1&&suv==2) {p15=1;p14=0;p13=1;}//down
            if(num==1&&suv==1) {p15=0;p14=0;p13=1;}//center
         if(RI)
        {
            date=SBUF;    //
    
            SBUF=date;    //
        RI=0;
        }    
       }
    int scan()
    {
        static int oldA=0;
        static int oldB=0;
        int result =0;
        int newA =aPin,newB=bPin;
        if(oldA!=newA||oldB!=newB)//something has changed
        {
            /*if (oldA==0&&oldB==0)
            {
               if (newA==1) result=1;
                else result =-1;
            }
             else if (oldA==1&&oldB==1)
                {
               if (newA==1) result=-1;
                else result =1;
                if (oldA==0&&newA==1)
                result = -(oldB * 2 - 1);
                        //else result=0;
                }
        oldA=newA;
             oldB=newB;
     return result;
    }
    void display(int m)
    {
                   LcdWriteCom(0x80);
                     LcdWriteData(peng[m]);
    }
    main()
    { 
           a=0;
         count=0;
        //Time0_Init();
        LcdInit();
        Initial_com();
    
        while(1)
        {
    xuanniu_process();//
    yaogan_process();// 
       //unsigned int num1;
            }
    }
    void delay(int i)
    {
      uchar j,k; 
      for(j=i;j>0;j--)
        for(k=125;k>0;k--);
    }
    bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
    {
       Start_I2c();              //Æô¶¯×ÜÏß
       SendByte(sla);            //•¢ËÍÆ÷¼þµØÖ•
       if(ack==0)return(0);
       SendByte(c);              //•¢ËÍ¿ØÖÆ×Ö½Ú
       if(ack==0)return(0);
       SendByte(Val);            //•¢ËÍDACµÄÊýÖµ  
       if(ack==0)return(0);
       Stop_I2c();               //½áÊø×ÜÏß
       return(1);
    }
    bit ISendByte(unsigned char sla,unsigned char c)
    {
       Start_I2c();              //
       SendByte(sla);            //
       if(ack==0)return(0);      //
       SendByte(c);              //
       if(ack==0)return(0);
       Stop_I2c();               //
       return(1);
    }
    unsigned char IRcvByte(unsigned char sla)
    {  unsigned char c;
       Start_I2c();          //
       SendByte(sla+1);      //
       if(ack==0)return(0);//
       c=RcvByte();          //
       Ack_I2c(1);           //
       Stop_I2c();           //
       return(c);
    }
    void Initial_com(void)
    {
     EA|=1;        //
     ES|=1;        //
     ET1|=1;        //
     TMOD|=0x20;   //
     PCON|=0x00;   //SMOD=0
     SCON|=0x50;   //
     TH1=0xfd;    //
     TL1=0xfd;
     TR1=1;       //
    }
    单片机2代码
    #include<reg51.h>   
    unsigned char count;
    sbit pwm0=P0^0;
    sbit pwm1=P0^1;
    sbit pwm2=P0^2;
    sbit pwm3=P0^3;//ÓÃÀ´¿ØÖƵç»úµÄËĸöÒý½Å
    sbit p07=P0^7;
    sbit p25=P2^5;
    sbit p26=P2^6;
    sbit p27=P2^7;
    sbit jia=P3^2;
    sbit jian=P3^3;
    sbit p10=P1^0;
    sbit p22 = P2^2;
    sbit p23 = P2^3;
    sbit p24 = P2^4;
    sbit p13 = P0^4;
    sbit p14 = P0^5;
    sbit p15 = P0^6;
    sbit p16 = P1^6;
    sbit p17 = P1^7;
    sbit p30=P3^0;
    sbit p31=P3^1;
    unsigned char wu[]=" I Love You!     ";
    unsigned char peng[]="000045090135180";
     unsigned char jd;
     unsigned char jd0;
     unsigned char jd1;
     unsigned char jd2;
     unsigned char jd3;
    int DisplayData[4]={0,1,2,3};
    void Time0_Init()
    {
      TMOD=0x01;
        IE=0x82;//
        TH0=0xfe;
        TL0=0x33;
        TR0=1;
        }
    void Time0_Int()interrupt 1
    {
      TH0=0xfe;
        TL0=0x33;
            if(count<jd+jd0) 
               pwm0=1;
        else 
               pwm0=0;
        if(count<jd+jd1) 
               pwm1=1;
        else 
               pwm1=0;
        if(count<jd+jd2) 
               pwm2=1;
        else 
               pwm2=0;
        if(count<jd+jd3) 
               pwm3=1;
        else 
               pwm3=0;
        count=(count+1);
        count=count%7;
        }
    /keyscan//
    void bottomscan()
    {
      if(p10==0)
        {
          jd0=0;jd1=0;jd2=0;jd3=0;
        }
    }
    void keyscan()
    {
        int a,b,c;
        a=p22;b=p23;c=p24;
        jd=(a*1+b*2+c*4);
    }
    /handle/
    void handlescan()
    {  int m=0;
      static int old0=0,old1=0,old2=0;
        int new0,new1,new2;
        int jd00=0,jd11=0,jd22=0,jd33=0;//everytime it become zero
        new0=p13;new1=p14;new2=p15; 
        //jd0=jd;jd1=jd;jd2=jd;jd3=jd;
        if(old0!=new0||old1!=new1||old2!=new2)//something has changed
        {
      if(p15==0&&p14==0&&p13==0) m=0;
        if(p15==0&&p14==0&&p13==1) m=1;
        if(p15==0&&p14==1&&p13==0) m=2;
        if(p15==0&&p14==1&&p13==1) m=3;
        if(p15==1&&p14==0&&p13==0) m=4;
        if(p15==1&&p14==0&&p13==1) m=5;
        if(p15==1&&p14==1&&p13==0) m=6;
        if(p15==1&&p14==1&&p13==1) m=7;
                switch (m)
            {
                case 0:{jd00=1;break;}
                case 1:break;
                case 2:{jd22=1;break;}
                case 3:{jd11=1;break;}
                case 4:break;
                case 5:{jd33=1;break;}
            }
                }
        old0=new0;old1=new1;old2=new2;
        jd0+=jd00;jd1+=jd11;jd2+=jd22;jd3+=jd33;
    }
    void main()
    {
        jd=0;
         count=0;
         Time0_Init();
        p16=0;p17=0;p30=0;p31=0;
         while(1)
         {bottomscan();
             handlescan();
           keyscan();
         }
     }

    `
    7.总结
    本次风扇系统的设计实现了对电机单独控制和集体控制的效果。实际上在工程中或车间里,经常会应用到各式各样的电机,为了满足生产生活的要求,需要对电机进行实时的控制,而我正是模拟了这样的控制。
    由于风扇的扇叶是使用的飞行器的机翼,在转速较高的情况下,可产生较高的升力。原本希望在旋翼在转动时可以带动机体,可是由于自身重力等原因,飞不起来,可是任然能产生较大的升力。
    在实时操控的模块中,摇杆的信号是通过串口的数据检测并判断的,所以有较小的延时,不能达到真正的实时控制。如果做进一步的改进的话,用中断的控制方法更为快速。

    展开全文
  • Arduino Uno控制直流电机

    万次阅读 2018-08-12 09:06:21
    Arduino Uno控制直流电机 这是我本科毕业设计的部分内容,之前回答别人相关问题时留下了QQ号,这几年总有人加我问相关的问题。今天也有一个本科生咨询,趁这个机会,就把相关资料贴出来吧。 其实,三年前的东西都...

    Arduino Uno控制直流电机

    这是我本科毕业设计的部分内容,之前回答别人相关问题时留下了QQ号,这几年总有人加我问相关的问题。今天也有一个本科生咨询,趁这个机会,就把相关资料贴出来吧。
    其实,三年前的东西都已经记不清楚了。研究生没有做硬件,相关的都快看不懂了!为了让大家看得懂程序,将总的系统设计思路贴出来,如下:
    这里写图片描述
    整个系统是实现“太阳能智能控制环保路灯控制器设计”,主要是用直流电机控制太阳能电池板转动,确保其在每个时间段能够实现最高的发电效率,仿向日葵实现东西转动。
    Arduino Uno手册上有其关于控制直流电机的详细介绍,如果仔细阅读,实现起来很简单的。可以结合本文的系统,对其进一步理解,则可以编写响应的代码。

    主程序

    //#include
    int pinI1=8;
    int pinI2=9;
    int pinI3=2;
    //int pinI4=3;
    int pinI5=4;
    //int pinI6=5;
    //int pinI7=6;
    int speedin=11;
    volatile int state=LOW;
    void setup()
    {
    pinMode(pinI1,OUTPUT);
    pinMode(pinI2,OUTPUT);
    pinMode(pinI3,INPUT);
    // pinMode(pinI4,OUTPUT);
    pinMode(pinI5,OUTPUT);
    // pinMode(pinI6,OUTPUT);
    // pinMode(pinI7,OUTPUT);
    pinMode(speedin,OUTPUT);
    // myPID.SetMode(AUTOMATIC);
    // attachInterrupt(0,light,HIGH);
    }
    void loop()
    {
    while(1)
    {
    int m=analogRead(A0);
    int n=analogRead(A1);
    int err,err1,err2;
    int pidspeed1;
    float kp=0.1 ,ki=0,kd=0;
    err=m-n;
    pidspeed1=(int)(err*kp-err1*ki+err2*kd);
    err1=err;
    err2=err1;
    state=digitalRead(pinI3);
    digitalWrite(pinI5,state);
    if (m>n)
    {
    // while(1)
    // {
    digitalWrite(pinI1,LOW);
    digitalWrite(pinI2,HIGH);
    analogWrite(speedin,100+pidspeed1);
    // }
    // delay(2000);
    }
    else if(m
    {
    // while(1)
    // {
    digitalWrite(pinI1,HIGH);
    digitalWrite(pinI2,LOW);
    analogWrite(speedin,100-pidspeed1);
    // delay(2000);
    // }

    }
    

    else

    {
    // while(1)
    // {
    digitalWrite(pinI1,HIGH);
    digitalWrite(pinI2,HIGH);
    //delay(2000);
    // }
    }
    }
    }

     这是我本科毕业设计的部分内容,之前回答别人相关问题时留下了QQ号,这几年总有人加我问相关的问题。今天也有一个本科生咨询,趁这个机会,就把相关资料贴出来吧。
     其实,三年前的东西都已经记不清楚了。研究生没有做硬件,相关的都快看不懂了!为了让大家看得懂程序,将总的系统设计思路贴出来,如下:
    

    PID算法控制程序

    该部分系统原理图如下,有助于理解代码,可根据应用环境不同修改代码:
    这里写图片描述这里写图片描述
    这里写图片描述
    int m=analogRead(A0);

    int n=analogRead(A1);

    int err,err1,err2;

    int pidspeed1;

    float kp=0.1 ,ki=0,kd=0;

    err=m-n;

    pidspeed1=(int)(err*kp-err1*ki+err2*kd);

    err1=err;

    err2=err1;

    void light();

    SetMotor(Output);

    void SetMotor()

    {

    if (m>n)

     {       
    
        digitalWrite(pinI1,LOW);
    
       digitalWrite(pinI2,HIGH);
    

    analogWrite(speedin,100+pidspeed1);}

    else if(m

    { digitalWrite(pinI1,HIGH);
    
       digitalWrite(pinI2,LOW);
    
     analogWrite(speedin,100-pidspeed1);}
    

    else

    {digitalWrite(pinI1,HIGH);

    digitalWrite(pinI2,HIGH);}

    }

    最近开始上班了,决定在CSDN记录我的程序员人生。这是我之前在新浪写的一篇博客,把它搬过来,顺便熟悉一下CSDN的用法,原博客地址:
    http://blog.sina.com.cn/s/blog_bfb629e50102xrau.html

    展开全文
  • 直流电机驱动芯片

    万次阅读 多人点赞 2019-03-03 18:41:27
    由于单片机属于信息类电路,带负载能力极差,不可能直接用来控制电机的运动。因此电机的驱动就显得尤为重要。本文汇总了自己用过的几个电机驱动芯片及其注意事项等等,以后有机会还会继续修正增加等。大家有其他的...
  • 直流电机内部有磁铁、转子和碳刷等组件组成,将电机的+、-极和电池相连,即可正转或逆转。 电机在运转时,碳刷和整流子之间会产生火花,进而引发干扰,影响到微处理器或无线遥控器的运行。为了消除噪声,通常在碳刷...
  • 直流电机

    2019-04-05 19:47:34
  • 直流电机maxon

    2020-04-20 23:31:58
    大家可以对maxon电机有一定的认识,可以对自己的工作有帮助!
  • 直流有刷电机与无刷电机的区别

    万次阅读 2019-03-28 10:26:07
    首先介绍有刷电机与无刷电机工作原理,最后从调速方式及性能差异这两个方面详细的阐述了有刷电机与无刷电机的区别。  有刷电机与无刷电机工作原理  1、有刷电机  电机工作时,线圈和换向器旋转,磁钢和碳刷...
  • 在做BLDC电机转速PID控制的时候,需要检测BLDC反馈回来的实际转速,跟目标转速进行比较,通过PID算法,修改驱动PWM脉冲的占空比,实现速度闭环控制。 转速到频率的计算 我们假设转速用n表示,单位RPM。 RPM就是每...
  • 无刷直流电机(BLDC)建模与仿真

    万次阅读 多人点赞 2020-04-28 23:18:48
    按照最常用的定义,无刷直流电机有两种,一种是梯形波反电动势无刷直流电机,也就是通常说的BLDC,另一种是正弦波反电动势无刷直流电机,也就是PMSM。本文只研究梯形波反电动势无刷直流电机,也就是BLDC的建模和仿真...
  • 有刷直流电机控制

    千次阅读 2017-10-29 21:47:37
    有刷直流电机介绍:有刷直流电机(Brushed DC,BDC)是一种直流电机,有刷电机的定子上安装有固定的主磁极和电刷,转子上安装有电枢绕组和换向器。直流电源的电能通过电刷和换向器进入电枢绕组,产生电枢电流,电枢...
  • 直流电机/步进电机/舵机区别

    千次阅读 2019-03-09 10:42:17
    直流电机/步进电机/舵机区别一、什么是步进电机 直流电机分为直流有刷电机和直流无刷电机,一般大家说的直流电机一般是指直流有刷电机。直流有刷电机只要加上合适的电压就会转,而且转得圈数难以精确控制;而步进电机...
  • 直流电机和步进电机

    千次阅读 2018-01-15 18:52:30
    1 直流电机 1.1 什么是电机 … 1.2 常见电机 (1)交流电机:两相、三相。 (2)直流电机:永磁、励磁。 (3)步进电机、伺服电机。 1.3 直流电机详解 (1)外观。 (2)接线和工作原理。 (3)直流电机的驱动...
  • Arduino开发板控制直流电机

    万次阅读 2018-11-14 19:51:29
    在本篇文章中,我们将学习到如何使用Arduino开发板控制直流电机。我们将看看控制直流电机的一些基本技术,然后列举两个例子,通过例子我们将学习到如何使用L298N驱动器和Arduino开发板控制直流电机。我们可以通过...
  • 直流电机的PWM调速

    万次阅读 多人点赞 2016-09-19 21:24:19
    直流电机的PWM调速原理与交流电机调速原理不同,它不是通过调频方式去调节电机的转速,而是通过调节驱动电压脉冲宽度的方式,并与电路中一些相应的储能元件配合,改变了输送到电枢电压的幅值,从而达到改变直流...
  • 无刷直流电机构成及工作原理详解

    万次阅读 多人点赞 2018-02-25 21:30:45
    直流电机主要有直流有刷电机和无刷直流电机两种,特别是无刷直流电机以其出色的工作特性在工业生产及日常生活中应用广泛,本文对无刷直流电机构成及工作原理进行介绍。一无刷直流电机简介 无刷直流电机(BLDC)以电子...
  • 永磁无刷直流电机控制论文-基于Matlab的双闭环直流电机调速系统的仿真.pdf 基于PWM控制的直流电机调速系统的设计.pdf 基于PWM_ON_PWM改进型无刷直流电机的控制.pdf ...
  • 树莓派控制直流电机

    2019-08-03 23:25:27
    1、直流电机 直流电机是一种将直流电能转换为机械能的装置,被广泛的用于驱动各种设备,如电风扇、遥控小车、电动车窗等,在控制设备运转领域中,它是不可或缺的一种设备。 小型直流电机的的电压范围通常是1.5V~30V...
  • 永磁无刷直流电机控制论文-基于Matlab的无刷直流电机的建模与仿真.pdf 基于PWM控制的直流电机调速系统的设计.pdf 基于PWM_ON_PWM改进型无刷直流电机的控制.pdf ...
1 2 3 4 5 ... 20
收藏数 9,569
精华内容 3,827
关键字:

直流电机