单片机控制松下伺服电机正反转程

发布者:csZhou最新更新时间:2012-09-15 来源: 51hei关键字:单片机控制  伺服电机  正反转 手机看文章 扫描二维码
随时随地手机看文章
//***************************************************************************     
//     
//  文 件 名: download.c     
//     
  
//     
//  目标对象: AT89S52     
//     
//  编 译 器: ISP     
//     
//  功能描述: 下料部单独控制程序     
//     
//  修改版本: 0.0     
//     
//  创建日期:2009-03-09     
//     
//***************************************************************************     
    
#include      
#include     
#include      
#define uchar unsigned char     
#define uint  unsigned int     
    
//***************************************************************************     
    
sbit    DOWNLOAD_HS30806_Y_PULSE1       =   P1^0;//HS30806_Y电机脉冲-     
sbit    DOWNLOAD_HS30806_Y_DIR      =   P1^1;//HS30806_Y电机方向-     
sbit    DOWNLOAD_HS30806_X_PULSE1       =   P1^2;//HS30806_X电机脉冲-     
sbit    DOWNLOAD_HS30806_X_DIR      =   P1^3;//HS30806_X电机方向-     
sbit    SERVO_PULSE1        =   P3^0;//伺服电机脉冲-     
sbit    SERVO_DIR       =   P3^3;//伺服电机方向-     
sbit    SERVO_ON    =   P3^2;//伺服ON使能     
sbit    QIGANG=P3^1;    
sbit    SERVO_POINT=P2^0;    
sbit    Y_POINT=P2^1;    
sbit    S2 = P3^2;    
sbit    S3 = P3^3;    
sbit    S4 = P3^4;    
sbit    S5 = P3^5;    
    
//****************************************************************************     
    
//延时1us     
    
//****************************************************************************     
    
 void mDelay(uchar DelayTime1)    
{       
        uchar i=0;    
        for(;DelayTime1>0;DelayTime1--)    
        {       
            for(i=0;i<0x16;i++)    
                {    
                    
                }    
        }    
}    
//具体延时时间=DelayTime1*[10+3*m]+10个指令周期     
/* void mDelay(uint DelayTime1)    
{       
    for(;DelayTime1>0;DelayTime1--)    
        {       
                
        }    
}    
*/    
void Delay()    
{    
        
    ;    
;    
    
}    
//***************************************************************************     
    
//下料部Y右转程序     
    
//***************************************************************************     
    
void RIGHT_MOVE_DOWNLOAD_HS30806_Y(uint Pluse1_num)    
{       
            
    DOWNLOAD_HS30806_Y_DIR=1;    
    DOWNLOAD_HS30806_Y_PULSE1   =   1;//脉冲负     
        
    mDelay(20);         
    for(;Pluse1_num>0;Pluse1_num--)    
    {    
        DOWNLOAD_HS30806_Y_PULSE1   =   ~DOWNLOAD_HS30806_Y_PULSE1;//脉冲负     
        mDelay(20);     
        DOWNLOAD_HS30806_Y_PULSE1   =   ~DOWNLOAD_HS30806_Y_PULSE1;//脉冲负     
        mDelay(20);     
    }    
}       
    
//***************************************************************************     
    
//下料部Y左转程序     
    
//***************************************************************************     
    
void LEFT_MOVE_DOWNLOAD_HS30806_Y(uint Pluse2_num)    
{       
        DOWNLOAD_HS30806_Y_DIR=0;    
        DOWNLOAD_HS30806_Y_PULSE1   =   1;//脉冲负     
        mDelay(20);         
    for(;Pluse2_num>0;Pluse2_num--)    
    {    
        DOWNLOAD_HS30806_Y_PULSE1   =   ~DOWNLOAD_HS30806_Y_PULSE1;//脉冲负     
        mDelay(20);    
        DOWNLOAD_HS30806_Y_PULSE1   =   ~DOWNLOAD_HS30806_Y_PULSE1;//脉冲负     
        mDelay(20);     
    }    
}       
    
//***************************************************************************     
    
//下料部Y停止程序     
    
//***************************************************************************     
    
void DOWNLOAD_HS30806_Y_Stop()    
{    
        DOWNLOAD_HS30806_Y_DIR=0;    
        DOWNLOAD_HS30806_Y_PULSE1   =   1;//脉冲负     
        mDelay(20);         
}    
    
//***************************************************************************     
    
//下料部X右转程序     
    
//***************************************************************************     
    
void RIGHT_MOVE_DOWNLOAD_HS30806_X(uint Pluse1_num)    
{       
            
    DOWNLOAD_HS30806_X_DIR=1;    
    DOWNLOAD_HS30806_X_PULSE1   =   1;//脉冲负     
        
    mDelay(20);         
    for(;Pluse1_num>0;Pluse1_num--)    
    {    
        DOWNLOAD_HS30806_X_PULSE1   =   ~DOWNLOAD_HS30806_X_PULSE1;//脉冲负     
        mDelay(20);     
        DOWNLOAD_HS30806_X_PULSE1   =   ~DOWNLOAD_HS30806_X_PULSE1;//脉冲负     
        mDelay(20);     
    }    
}       
    
//***************************************************************************     
    
//下料部X左转程序     
    
//***************************************************************************     
    
void LEFT_MOVE_DOWNLOAD_HS30806_X(uint Pluse2_num)    
{       
        DOWNLOAD_HS30806_X_DIR=0;    
        DOWNLOAD_HS30806_X_PULSE1   =   1;//脉冲负     
        mDelay(20);         
    for(;Pluse2_num>0;Pluse2_num--)    
    {    
        DOWNLOAD_HS30806_X_PULSE1   =   ~DOWNLOAD_HS30806_X_PULSE1;//脉冲负     
        mDelay(20);    
        DOWNLOAD_HS30806_X_PULSE1   =   ~DOWNLOAD_HS30806_X_PULSE1;//脉冲负     
        mDelay(20);     
    }    
}       
//***************************************************************************     
    
//下料部X停止程序     
    
//***************************************************************************     
    
void DOWNLOAD_HS30806_X_Stop()    
{    
        DOWNLOAD_HS30806_X_DIR=0;    
        DOWNLOAD_HS30806_X_PULSE1   =   1;//脉冲负     
        mDelay(20);         
}    
    
//***************************************************************************     
    
//伺服电机右转程序     
    
//***************************************************************************     
    
void RIGHT_MOVE_SERVO(uint Pluse1_num)    
{       
    //SERVO_ON  =   0;     
    //mDelay(100);     
    SERVO_DIR   =   1;    
    mDelay(3);    
    SERVO_PULSE1    =   1;//脉冲负     
        
                
    for(;Pluse1_num>0;Pluse1_num--)    
    {    
        SERVO_PULSE1    =   ~SERVO_PULSE1;//脉冲负     
         mDelay(3);    
    //  mDelay(2);       
        SERVO_PULSE1    =   ~SERVO_PULSE1;//脉冲负     
         mDelay(3);    
    //  mDelay(2);       
    }    
}       
    
//***************************************************************************     
    
//伺服电机左转程序     
    
//***************************************************************************     
    
void LEFT_MOVE_SERVO(uint Pluse2_num)    
{       
//  SERVO_ON    =   0;     
//  mDelay(100);     
    SERVO_DIR   =   0;    
    mDelay(33);    
    SERVO_PULSE1    =   1;//脉冲负     
            
    for(;Pluse2_num>0;Pluse2_num--)    
    {    
        SERVO_PULSE1    =   ~SERVO_PULSE1;//脉冲负     
        //Delay();     
        mDelay(3);    
        SERVO_PULSE1    =   ~SERVO_PULSE1;//脉冲负     
        //Delay();//     
        mDelay(3);      
    }    
}       
    
//***************************************************************************     
    
//伺服电机停止程序     
    
//***************************************************************************     
    
void SERVO_PULSE1_Stop()    
{    
        SERVO_DIR=0;    
        SERVO_PULSE1    =   1;//脉冲负     
        mDelay(20);         
}    
//***************************************************************************     
    
//键盘处理程序     
    
//***************************************************************************     
    
uchar Key()    
{       
    uchar KValue;    
    uchar tmp;    
    P3|=0x3c;           //将P3口的接键盘的中间四位置1     
    KValue=P3;    
    KValue|=0xc3;       //将未接键的4位置1     
    if(KValue==0xff)    //中间4位均为1,无键按下       
        return(0);      //返回     
    mDelay(10);     //延时10ms,去键抖     
    KValue=P3;    
    KValue|=0xc3;       //将未接键的4位置1     
    if(KValue==0xff)    //中间4位均为1,无键按下       
        return(0);      //返回     
//如尚未返回,说明一定有1或更多位被按下     
    for(;;)    
    {   tmp=P3;         
        if((tmp|0xc3)==0xff)    
            break;      //等待按键释放     
    }    
    return(KValue);    
}    
    
void KProce(uchar KValue)   //键值处理     
{       
    if((KValue&0x04)==0)    
        
    LEFT_MOVE_SERVO(10000);    
    
    //RIGHT_MOVE_DOWNLOAD_HS30806_X(2000);     
    //QIGANG=0;     
    if((KValue&0x08)==0)    
        
        RIGHT_MOVE_SERVO(10000);    
    //LEFT_MOVE_DOWNLOAD_HS30806_X(2000);     
    //QIGANG=1;     
    if((KValue&0x10)==0)    
    SERVO_ON    =   0;    
    mDelay(100);    
//  RIGHT_MOVE_DOWNLOAD_HS30806_Y(2000);     
    if((KValue&0x20)==0)    
    SERVO_ON    =   1;    
    mDelay(100);    
    //LEFT_MOVE_DOWNLOAD_HS30806_Y(2000);     
}    
    
//***************************************************************************     
    
//初始化程序     
    
//***************************************************************************     
    
void    init()    
{    
//  P0=0xFF;     
//  P1=0xFF;     
//  P2=0xFF;     
//  P3=0xFF;     
    P3=0xFD;    
    mDelay(1000);    
    while(S2==1)    
    {    
            LEFT_MOVE_DOWNLOAD_HS30806_Y(1);    
    }    
    RIGHT_MOVE_DOWNLOAD_HS30806_Y(1600);    
        while(S3==1)    
    {    
            LEFT_MOVE_DOWNLOAD_HS30806_X(1);    
    }    
    RIGHT_MOVE_DOWNLOAD_HS30806_X(1600);    
}    
    
//***************************************************************************     
    
//主函数     
    
//***************************************************************************     
    
/*    
void main()    
{    
    uchar KValue,m;//,n,flag;               //存放键值;     
//g init();//     
//SERVO_ON  =   0;     
//mDelay(100);//延时0.00111300s     
mDelay(1);    
mDelay(2);    
mDelay(3);    
mDelay(4);    
mDelay(10);    
mDelay(20);    
for(m=0;m<100;m++)    
{    
RIGHT_MOVE_SERVO(25000);    
//mDelay(20);//延时0.00023s     
LEFT_MOVE_SERVO(25000);    
mDelay(20);    
}    
while(1)    
{    
//  for(m=0;m<100;m++)     
//  {     
//  RIGHT_MOVE_DOWNLOAD_HS30806_Y(800);     
//  }     
        
    for(;;)    
    {   KValue=Key();           //调用键盘程序并获得键值     
        if(KValue)              //如果该值不等于0     
        {    
            KProce(KValue); //调用键盘处理程序     
        }    
    }    
    
}    
    
 }    
    
*/    
void Initia()    
{    
    LEFT_MOVE_SERVO(1);     
    mDelay(6);    
}    
    
void main()    
{    
    Initia();    
    RIGHT_MOVE_SERVO(100);    
    while(SERVO_POINT==0)    
        while(1)    
        {    
            while(S2==0)    
            {    
                while(1)    
                {       
                    RIGHT_MOVE_SERVO(100);    
                    mDelay(20);    
                    LEFT_MOVE_SERVO(100);       
                    mDelay(20);    
                }    
            }    
        }    
}   
关键字:单片机控制  伺服电机  正反转 引用地址:单片机控制松下伺服电机正反转程

上一篇:基于51单片机的频率计程序
下一篇:NEC制式红外线解码程序

推荐阅读最新更新时间:2024-03-16 13:08

单片机控制松下伺服电机反转
//*************************************************************************** // // 文 件 名: download.c // // // 目标对象: AT89S52 // // 编 译 器: ISP // // 功能描述: 下料部单独控制程序 // // 修改版本: 0.0 // // 创建日期:2009-03-09 // //***************************************************************************
[单片机]
瑞萨电子发布RZ/T2M电机控制MPU,实现对伺服电机快速、高精度控制
瑞萨电子发布RZ/T2M电机控制MPU,实现对伺服电机快速、高精度控制 在单芯片上结合电机控制功能与符合TSN标准的工业以太网网络, 同时支持功能安全 2022 年 6 月 7 日,中国北京讯 - 全球半导体解决方案供应商瑞萨电子(TSE:6723)今日宣布,推出瑞萨高性能的RZ/T2M电机控制微处理器单元(MPU),应用于交流伺服驱动器和工业机器人等领域。RZ/T2M在单芯片上结合了快速、高精度的实时电机控制能力以及对最新的工业以太网协议的支持,同时实现功能安全操作。通过为电机控制提供所有必要的外设功能,RZ/T2M能够为用户显著减少外部元件数量,从而缩减BOM成本和产品尺寸。 瑞萨电子工业自动化事业部副总裁坪
[工业控制]
瑞萨电子发布RZ/T2M电机控制MPU,实现对<font color='red'>伺服电机</font>快速、高精度控制
基于单片机控制的LED水族照明装置设计
1 引言   生态水族的主角是鱼、水草,视觉欣赏是其主要功能。光照是其首要解决的三大技术问题之一。   常用的水族照明光源主要有荧光灯、水银灯、卤钨灯等,但其发射光谱与水生物选择性吸收光谱不匹配,用于水生动植物补光,针对性差、光效低、耗能大、大量发热影响水温。发光二极管( LED)以其高效、多色、窄带、直流、显色性好、节能、环保等优点,被认为是未来主要的、较为理想的人工水生动植物补光光源。但目前市场上的LED 水族光源,存在光谱和强度被预制固化、不可调、显色性差、静态等问题,不能满足水生动植物对光谱的动态需求,因此,智能LED 水族光源成为科学工作者竞相研究的重点。   2 设计原理    2. 1 观赏性水草的生长发育对
[模拟电子]
基于<font color='red'>单片机控制</font>的LED水族照明装置设计
单片机控制的直流调速系统
1 引言 直流电动机具有良好的起、制动性能,宜于在广泛范围内平滑调速,在轧钢机、矿井卷扬机、挖掘机、高层电梯等需要高性能可控电力拖动的领域中应用历史悠久。大功率直流调速系统通常采用三相全控桥式整流电路对电动机进行供电,从而控制电动机的转速,传统的控制系统采用模拟元件,虽在一定程度上满足了生产要求,但是因为元件容易老化和在使用中易受外界干扰影响,并且线路复杂、通用性差,控制效果受到器件性能、温度等因素的影响,故系统的运行可靠性及准确性得不到保证,甚至出现事故。 目前,直流电动机调速系统数字化已经走向实用化,其主要特点是:结构简单、维修方便、动态参数调整方便、系统可靠性高、可采用数字滤波来提高系统的抗干扰性能、可采用数字反
[单片机]
<font color='red'>单片机控制</font>的直流调速系统
哪几种情况下会造成伺服电机抖动?
在哪几种情况下会造成伺服电机抖动?怎样才能解决这些伺服电机抖动带来的问题?分别是怎么解决的? 例如:加减速时间设置得过小,伺服电机在突然的启动或者停止的时候会产生高惯性抖动......分别把加减速时间调大可以解决这个问题。 下面精选整理网友对伺服电机抖动原因进行的分析,供大家了解借鉴: 观点一 当伺服电机在零速时发生抖动,应该是增益设高了,可减小增益值。如果启动时抖动一下即报警停车了,最大可能是电机相序不正确。 观点二 1、PID增益调节过大的时候,容易引起电机抖动,特别是加上D后,尤其严重,所以尽量加大P,减少I,最好不要加D。 2、编码器接线接错的情况下也会出现抖动。 3、负载惯量过大,更换更大的电机和驱动器。 4、模
[嵌入式]
哪几种情况下会造成<font color='red'>伺服电机</font>抖动?
基于PIC单片机控制温度传感器测温的设计
试温度,并用1602显示屏显示温度//1、第一行显示:Temperature//2、第二行显示:实测温度值//********** //************************************************** //实验目的: //熟悉使用单片机运用DS18B20温度传感器测试温度,并用1602显示屏显示温度 //1、第一行显示:Temperature //2、第二行显示:实测温度值 //************************************************** //************************************************** //硬件
[单片机]
基于PIC<font color='red'>单片机控制</font>温度传感器测温的设计
伺服电机怎么测量好坏_伺服电机选型计算实例
  伺服电机怎么测量好坏   测量伺服电机好坏的方法主要有以下几种:   静态测试:静态测试通常使用负载测量仪或者力矩传感器,测量电机输出的转矩和电流,以判断电机是否符合规格参数要求。   动态测试:动态测试是通过对电机进行加速和减速操作,测试其输出的速度和加速度响应,以评估电机的动态性能。   反馈器测试:伺服电机通常采用编码器或者绝对值编码器等反馈器,通过测试反馈器的输出信号,可以判断电机的位置控制精度和稳定性。   声音测试:通过听取电机运行时的声音,可以判断电机是否存在异常噪音或震动,从而评估电机的运行状态。   以上测试方法可以结合使用,以全面评估伺服电机的性能和状态。在进行测量时,需要注意测试环境的温度、湿度等因素,以
[嵌入式]
<font color='red'>伺服电机</font>怎么测量好坏_<font color='red'>伺服电机</font>选型计算实例
单片机控制红外编码探测障碍物
1 探测障碍的原理 在室内自动感知障碍的设备中,常使用红外线探测障碍物的存在与否。探测的基本原理是:在测量的范围内,主动向探测方向发射红外信号,如果存在障碍物,就会把发射的信号反射回发送端。在发送端,如果收到反射的信号,就确认障碍物的存在。 但是在实际应用中,红外干扰源较多;而且在有反射光的情况下,由于光线的干扰,很容易判断失误,出现虚警。因此,有些设备在发射信号时,改进为发送一串连续的红外脉冲,然后接收反射的信号。如果接收到的红外脉冲数量超过某一门限值时,就判断障碍存在。这种方法尽管在一定程度上可以降低虚警率,但实验表明,在较强的反射光和使用电子镇流器方式的日光灯起辉时,仍很容易出现干扰现象。 本文提出解决干扰的方案是:由
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved