打印

机器人

[复制链接]
3451|3
手机看帖
扫描二维码
随时随地手机跟帖
沙发
airwill| | 2013-2-1 11:09 | 只看该作者
单片机通过控制驱动电路, 去控制多个舵机动作.
如何控制嘛, 就得根据动作要求来了

使用特权

评论回复
板凳
南宫云明| | 2013-2-1 14:52 | 只看该作者
我记得上学时用DSP,型号好像是TMS320F2812,可以控制6路PWM波,挺不错的。。。

使用特权

评论回复
地板
三少爷1991912| | 2013-12-29 10:36 | 只看该作者
我用51做过一个机器人,主要是利用定时中断来控制舵机的运行,刚开始开一下这个程序吧,也许对你会有帮助

#include "reg52.h"
sbit control_signal=P0^0;
sbit turn_left=P3^0;
sbit turn_right=P3^1;
unsigned char PWM_ON=15 ;//定义高电平时间
/******************************************************************/
/*                    延时函数                                    */
/******************************************************************/
void delay(unsigned int cnt)
{
while(--cnt);
}
void display()
{
if(PWM_ON>=5&&PWM_ON<=7) P1=0xFD;   //1灯亮,舵机接近或到达右转极限位置
if(PWM_ON>7&&PWM_ON<=10) P1=0xFB;    //2灯亮
if(PWM_ON>10&&PWM_ON<=13) P1=0xF7;    //3灯亮
if(PWM_ON>13&&PWM_ON<=16) P1=0xEF;    //4灯亮,舵机到达中间位置
if(PWM_ON>16&&PWM_ON<=19) P1=0xDF;   //5灯亮
if(PWM_ON>19&&PWM_ON<=22) P1=0xBF;   //6灯亮
if(PWM_ON>22&&PWM_ON<=25) P1=0x7F;   //7灯亮,舵机接近或到达左转极限位置
}
/******************************************************************/
/*                    主函数                                      */
/******************************************************************/
void main()
{
        //bit Flag;
        TMOD |=0x01;              //定时器设置 0.1ms in 11.0592M crystal
        TH0=(65536-78)/256;
        TL0=(65536-78)%256;      //定时0.1mS
    ET0=1;//定时器中断打开
    EA=1;//总中断
        //IE= 0x82;                 //打开中断
        TR0=1;
  //  PWM_ON=15    //的取值范围是6-25
        while(1)
        {  
        if(turn_left==0)
        {
           delay(1000);
           if(turn_left==0)
           {     
                           while(!turn_left){}
                 PWM_ON+=1;
                 if(PWM_ON>25)
                   PWM_ON=25;
                }
                }
                if(turn_right==0)
        {
           delay(1000);
           if(turn_right==0)
           {   
                            while(!turn_right){}
                 PWM_ON-=1;
                 if(PWM_ON<6)
                   PWM_ON=6;
                }
                }
                display();

     }
}
/******************************************************************/
/*                    定时器中断函数                              */
/******************************************************************/
void tim(void) interrupt 1 using 1
{
        static unsigned char count;
        TH0=(65536-78)/256;
        TL0=(65536-78)%256;     //定时0.1mS,经过示波器的测量
        if (count<PWM_ON)
    {
     control_signal = 1;            //给高电平
    }
        else
        {
          control_signal=0 ;
        }
        count++;
        if(count == 200)
    {
       count=0;    //20ms一个周期
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝