找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9009|回复: 5
收起左侧

跪求单片机控制直流电机的程序啊~~~

[复制链接]
ID:6005 发表于 2008-10-18 13:22 | 显示全部楼层 |阅读模式
本设计以AT89C51单片机为核心,以4*4矩阵键盘做为输入达到控制直流电机的启停、速度和方向,完成了基本要求和发挥部分的要求。在设计中,采用了PWM技术对电机进行控制,通过对占空比的计算达到精确调速的目的。
 

采用由达林顿管组成的H型PWM电路。用单片机控制达林顿管使之工作在占空比可调的开关状态,精确调整电动机转速。这种电路由于工作在管子的饱和截止模式下,效率非常高;H型电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也极佳,是一种广泛采用的PWM调速技术。


单极性工作制。单极性工作制是单片机控制口一端置低电平,另一端输出PWM信号,两口的输出切换和对PWM的占空比调节决定电动机的转向和转速。
我们采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定;并且在采用单片机产生PWM脉冲的软件实现上比较方便。
采用软件延时方式,这一方式在精度上不及方案一,特别是在引入中断后,将有一定的误差。但是基于不占用定时器资源,且对于直流电机,采用软件延时所产生的定时误差在允许范围,
回复

使用道具 举报

ID:851291 发表于 2020-12-2 00:42 | 显示全部楼层
怎么没有仿真图呀
回复

使用道具 举报

ID:63588 发表于 2014-7-7 13:28 | 显示全部楼层
#include<reg52.h>   
#include<intrins.h>                        
#define uchar unsigned char       
#define uint unsigned int
               
/**********************************************************************
                                                        L298n接口定义
**********************************************************************/  
sbit MOTOR_A_1=P3^6;
sbit MOTOR_A_2=P3^7;                                                                                                                                  
sbit k1=P1^0;                //定义k1为p1.0口
sbit k2=P1^1;   //定义k2为p1.1口
sbit k3=P1^2;   //定义k3为p1.2口
sbit k4=P1^3;   //定义k4为p1.3口
uchar T=0;           //定时标记
uchar W=0;           //脉宽值         0~100
uchar A=0;           //方向标记 0,1
uchar k=0;           //按键标记 0,1
uchar i=0;             //计数变量

uchar code table1[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

uchar code table2[]={0xfe,0xfb,0xfd,0xf7};
                 
void delayms(uint t);                                                                  
/**********************************************************************
                                                数码管显示
**********************************************************************/
void disp(void)
{
        P2=table2[3];                                       
        P0=table1[W%10];                        //显示占空比个位
        delayms(1);                                         //延时1ms
        P2=0xff;                                                        //P0清1

        P2=table2[2];
        P0=table1[W/100];                 //显示占空比百位
        delayms(1);                                         //延时1ms
        P2=0xff;                                                        //P0清1
  
        P2=table2[1];
        P0=table1[W/10%10];  //显示占空比十位
        delayms(1);                                  //延时1ms
        P2=0xff;                                            //P0清1

        P2=table2[0];
        P0=table1[A];                          //显示方向
        delayms(1);                                 //延时1ms
        P2=0xff;                                                //P0清1
}

/**********************************************************************
                                                        定时器变量定义
**********************************************************************/


void init(void)
{
        //启动中断
        TMOD=0x01;       
        EA=1;                                               
        ET0=1;
        TR0=1;
        //设置定时时间
        TH0=0xff;
        TL0=0xf6;
}

void timer0() interrupt 1
{                                    
        //重置定时器时间
        TH0=0xff;
        TL0=0xf6;
        T++;                         //定时标记加1
        disp();                //数码管显示
        if(k==0)
        {
        if(T>W)
                MOTOR_A_1 =0;
        else
                MOTOR_A_1 =1;
        }
        else
        {
        if(T>W)
                MOTOR_A_2 =0;
        else
                MOTOR_A_2 =1;
        }
          
        if(T==100)
                T=0;
}                       
/**********************************************************************
                                                        延时1ms
**********************************************************************/
void delayms(uint t)
{
        uchar j;
        while(t--)
        {
                for(j=0;j<250;j++)                        //循环250次
                {
                   _nop_();             //系统延时         
               _nop_();                                                        //系统延时
               _nop_();                                                        //系统延时
               _nop_();                                                        //系统延时
                }
        }
}
/**********************************************************************
                                                        独立按键检测
**********************************************************************/
void key(void)           //按键判断程序
{
        if(k1==0)                                                        //按键1按下
        {
                while(k1==0);                                //按键1抬起
                if(W==100)                                        //如果脉宽为100
                        W=0;                                                        //脉宽置0
                else
                        W+=1;                                                        //否则加1
        }
        else if(k2==0)                                //按键2按下
        {                                 
                while(k2==0);                                //按键2抬起
                if(W==0)                                                //如果脉宽为0
                        W=100;                                                //脉宽设置成100
                else
                        W-=1;                                                        //否则减1
        }
        else if(k3==0)                                //按键3按下
        {                          
                while(k3==0);                                //按键3抬起
                A=!A;                                                                //方向标记取反
                k=!k;                                                                //按键标记取反
        }
        else if(k4==0)                                //按键4按下
        {                          
                while(k4==0);                                //按键4抬起
                W=0;                                                                //脉宽清0                                                                       
        }
}

void main(void)
{

        init();                        /////////系统初始化
        while(1)         
        {
        if(k==0)
            MOTOR_A_2=0;
        else
                MOTOR_A_1=0;                        
                key();                        ////////查询按键
        }
}

/**********************************************************************
                                                          END
**********************************************************************/
回复

使用道具 举报

ID:61326 发表于 2014-5-4 11:46 | 显示全部楼层
我也不知到
回复

使用道具 举报

ID:12795 发表于 2009-5-14 00:27 | 显示全部楼层
一看就是复制,粘贴的,真BS你
回复

使用道具 举报

ID:8189 发表于 2008-12-28 19:26 | 显示全部楼层
LZ你太懒惰了,BS你!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表