久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7210|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

為什么運(yùn)行舵機(jī)就會(huì)導(dǎo)致單片機(jī)復(fù)位?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:125779 發(fā)表于 2016-7-22 21:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我在做基于舵機(jī)調(diào)整方向的超聲波避障的藍(lán)牙遙控智能小車,用的是stc12c5a60s2單片機(jī),超聲波用外部中斷和定時(shí)器1來測距,舵機(jī)用定時(shí)器0調(diào)整方向,小車的輪子轉(zhuǎn)動(dòng)是用單片機(jī)的內(nèi)置兩路PWM輸出的,單獨(dú)運(yùn)行超聲波時(shí)不會(huì)影響到PWM的輸出,而運(yùn)行舵機(jī)的時(shí)候就會(huì)導(dǎo)致單片機(jī)復(fù)位,求大神幫我看看原因啊!

  #include<at89x51.h>
#include<STC12C5A60S2_PWM.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int


/***自定義一些數(shù)據(jù)*/
#define leftdata  0x11
#define rightdata 0x22
#define forwarddata 0x33
#define backdata  0x44
#define stopdata  0x55

/*****接線定義******/
sbit IN1=P1^5;
sbit IN2=P1^6;
sbit IN3=P1^1;
sbit IN4=P1^2;
sbit EN1=P1^3;
sbit EN2=P1^4;

/*****獨(dú)立波特率發(fā)生器專用寄存器*******/
sfr AUXR=0x8e;//AUXR的SFR地址在0x8e
sfr BRT=0x9c;//BRT的SFR地址在0x9C
//*********************************************************************************************************
sbit trig   = P3^2;
sbit echo   = P3^3;
bit flagg; //中斷進(jìn)入標(biāo)志
#define         ControlPort      P1_0

unsigned char push_val_left = 11;
    unsigned char TimeOutCounter=0;   
   float dis=0;

         unsigned char posit=0;
                         unsigned long S=0;
                         unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff};
                         unsigned char const positon[3]={  0xbf,0xdf,0xef};
                         unsigned char disbuff[4]           ={ 0,0,0,0,};

    void Display(void)                                 //掃描數(shù)碼管
        {
         if(posit==0)
         {P0=(discode[disbuff[posit]])&0x7f;}
         else
         {P0=discode[disbuff[posit]];}
          P2=positon[posit];
          if(++posit>=3)
          posit=0;
        }
void delay_20us()
{  
uchar bt ;
for(bt = 0;bt<10;bt++);        
}
//*************************************************************************************************
void Forward(unsigned char Speed_Right,unsigned char Speed_Left); //申明一個(gè)“前進(jìn)函數(shù)”
void Stop(void);//申明一個(gè)“停止”函數(shù)


unsigned char SBUF_DATA,flag;

//void SendString(unsigned char *pt);
void Send_Char(unsigned char DATA);

//L 左
//R 右

void Forward(unsigned char Speed_Right,unsigned char Speed_Left)//Speed_Right,Speed_Left為左右電機(jī)對(duì)應(yīng)的速度參數(shù)0-255之間,255最快,0最慢。
{
                 IN1=0;
        IN2=1;
        IN3=0;
        IN4=1;
        
     PWM_Set(255-Speed_Right,255-Speed_Left);
}
void Back(unsigned char Speed_Right,unsigned char Speed_Left)//Speed_Right,Speed_Left為左右電機(jī)對(duì)應(yīng)的速度參數(shù)0-255之間,255最快,0最慢。
{
          IN1=1;
         IN2=0;
         IN3=1;
         IN4=0;

     PWM_Set(255-Speed_Right,255-Speed_Left);
}
void Turn_Left(unsigned char Speed_Right,unsigned char Speed_Left)
{
    IN1=1;
        IN2=0;
        IN3=0;
        IN4=1;
        PWM_Set(255-Speed_Right,255-Speed_Left);

}
void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left)
{
    IN1=0;
        IN2=1;
        IN3=1;
        IN4=0;
        PWM_Set(255-Speed_Right,255-Speed_Left);
}
void Stop(void)        //剎車
{

     IN1=0;
         IN2=0;
         IN3=0;
         IN4=0;
         PWM_Set(0,0);
}
void delayuus(unsigned char dela)
{
   while(dela--);
}
void delayms(unsigned char nn)
{
   while(nn--)
   {
   delayuus(245);
   delayuus(245);
   }
}

void test(void)         
{
TH1  = 0x00;
TL1  = 0x00;
trig = 1;

delay_20us();
trig = 0;

while(!echo);
TR1 = 1;
EX1 = 1;
delayms(30);

if(flagg==1)
{                         flagg=0;
                    dis  = (TH1 * 256 + TL1);
                      S=(dis*1.7)/100;     //算出來是CM
         if(S>=700) //超出測量范圍顯示“-”
         {         
         
          disbuff[0]=10;           //“-”
          disbuff[1]=10;           //“-”
          disbuff[2]=10;           //“-”
         }
         else
         {
          disbuff[0]=S%1000/100;
          disbuff[1]=S%1000%100/10;                                                                                    
          disbuff[2]=S%1000%10 %10;        
          }
}
TH1=0;
TL1=0;
TR1=0;
EX1=0;

}
void ISR_INT1(void) interrupt 2
{
    TR1=0;
    EX1=0;
    flagg=1;
}



void serial() interrupt 4 //中斷法
{
        flag=1;        //如果產(chǎn)生了中斷,說明單片機(jī)串口接收到數(shù)據(jù),串口中斷標(biāo)志置1
        SBUF_DATA=SBUF;//將接收到的數(shù)據(jù)存放到a中
        RI=0;//中斷標(biāo)志
}
void time1()interrupt 1           //舵機(jī)PWM輸出
  {
          TH0=(65536-125)/256;
        TL0=(65536-125)%256;
        TimeOutCounter ++;
           
        switch(push_val_left)         
        {         
                case 6 :         
                {
                        if( TimeOutCounter <= 7)                //右:7
                        {
                                ControlPort = 1;
                        }
                        else
                        {
                                ControlPort = 0;
                        }
                        break;
                }
                        case 7 :          //
                {
                        if( TimeOutCounter <= 16)                        //左                                                        
                        {
                                ControlPort = 1;
                        }
                        else
                        {
                                ControlPort = 0;
                        }
                        break;
                }
                        case 8 :          //
                {
                        if( TimeOutCounter <= 12)                        //中                                                                 12:中
                        {
                                ControlPort = 1;
                        }
                        else
                        {
                                ControlPort = 0;
                        }
                        break;
                }
        
                default : break;
        }
        
        if( TimeOutCounter == 160 )         //周期20ms(理論值)
        {
                TimeOutCounter = 0;
        }
  }                                



void main(void)
{
unsigned char sudu=130;
    PWM_ini();
        //*****************************************************************************************************
         TMOD=0x11;
        TH1=0x00; //
        TL1=0x00;
        TH0=(65536-125)/256;
        TL0=(65536-125)%256;
                         //TR0=1;
                                ET0=1;
        //*********************************************************************************************************
        SCON=0x50;// 0   1   0   1   0   0  0  0
                  //SM0 SM1 SM2 REN TB8 RB8 TI RI
                          //從上面化成二進(jìn)制之后可以看到SCON的各位設(shè)置
                          //①SMO SM0=01 ,說明串口工作在方式1
                          //②REN=1,允許串口接收數(shù)據(jù)
        BRT=0xfd;//9600波特率的初值
        AUXR=0x11;//12T,BRTR=1啟動(dòng)獨(dú)立波特率發(fā)生器
              //S1BRS=1,串口1選著獨(dú)立波特率發(fā)生器作為波特率發(fā)生器
                    
   PS=1;                                          //中斷太多,置串口為高優(yōu)先級(jí)中斷

        ES=1;//允許串行中斷
        EA=1;//開總中斷
        IT1=1;         //IT1=1表示邊沿觸發(fā)
                                TR0=1;
                                push_val_left=8;
                                delayms(240);
                                delayms(240);
                                TR0=0;
                while(1)
                {

                        if(SBUF_DATA==0x15)
                        {
                        TR0=0;
                           test();          //超聲波測距
                        Display();                   //數(shù)碼管顯示
                        if(S<=10)
                        {
                                TR0=1;
                                push_val_left=6;
                                delayms(240);
                                delayms(240);
                                        delayms(240);
                                        delayms(240);
        
                                push_val_left=7;
                                delayms(240);
                                delayms(240);
                                delayms(240);
                                delayms(240);
                                delayms(240);
                                delayms(240);
                                TR0=0;
               
                        }
                        else
                        {
                                TR0=0;
                           test();
                        Display();
                        }
                        }
                   if(flag==1)//如果產(chǎn)生過中斷,證明串口接收到了數(shù)據(jù)
                   {                EX1=1;
                     flag=0;
                          
                           switch(SBUF_DATA)          //小車行駛方向控制 pwm
                           {
                                         case leftdata: Turn_Left(sudu,sudu); break;
                                         case rightdata: Turn_Right(sudu,sudu); break;
                                         case forwarddata: Forward(sudu,sudu); break;
                                         case backdata: Back(sudu,sudu); break;
                                         case stopdata: Stop();         break;
                                
                                                 default: break;                                 
                                       
                            }
                  
                   }


                  
                }

}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:84652 發(fā)表于 2016-7-23 07:51 | 只看該作者
舵機(jī)的功率很大嗎?會(huì)不會(huì)是電源功率太小了。把舵機(jī)從小車上拆下來空轉(zhuǎn)看看會(huì)不會(huì)復(fù)位。要么就換個(gè)小點(diǎn)的舵機(jī)試試。有示波器的話看單片機(jī)的Vcc口,在舵機(jī)啟動(dòng)的時(shí)候電壓有沒有突然降到很低,導(dǎo)致單片機(jī)復(fù)位。
回復(fù)

使用道具 舉報(bào)

板凳
ID:97438 發(fā)表于 2016-7-23 08:39 | 只看該作者
程序看起來沒有什么錯(cuò)誤,應(yīng)該是舵機(jī)啟動(dòng)時(shí),啟動(dòng)電流特別大,你要做舵機(jī)和單片機(jī)的分別供電。
回復(fù)

使用道具 舉報(bào)

地板
ID:134697 發(fā)表于 2016-7-23 10:17 | 只看該作者
電源問題可能性大,電機(jī)工作瞬間啟動(dòng)電流大,使得電源電壓瞬間拉低,結(jié)果就造成單片機(jī)復(fù)位了。建議單片機(jī)使用獨(dú)立的電源供電,盡量不要和別的電路混在一起,尤其是功率大的外設(shè)。
回復(fù)

使用道具 舉報(bào)

5#
ID:111634 發(fā)表于 2016-7-23 12:34 | 只看該作者
舵機(jī)啟動(dòng)時(shí)電流很大,導(dǎo)致電源電壓瞬間下降,單片機(jī)失電復(fù)位。
回復(fù)

使用道具 舉報(bào)

6#
ID:130180 發(fā)表于 2016-7-24 10:24 | 只看該作者
各位都是對(duì)的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区 | 中文字幕视频一区二区 | 成人动漫视频网站 | 一区二区三区视频在线观看 | 精品久久av | 视频一区二区三区四区五区 | 中文久久 | 欧美精品一区二区在线观看 | 成人免费网视频 | 久久久久久成人网 | 国产欧美一级二级三级在线视频 | 欧美一二三四成人免费视频 | 美日韩免费 | 自拍偷拍精品 | 日韩毛片| 精国产品一区二区三区四季综 | 色频| 91精品一区二区三区久久久久 | 久久久久资源 | 激情av免费看 | 欧美性精品 | 欧美一区二区在线 | 天天弄天天操 | 欧美一区二区在线 | 四虎永久免费黄色影片 | 国产精品污www一区二区三区 | 亚洲福利网站 | 欧美日韩精品一区二区三区视频 | 亚洲精品68久久久一区 | 91网视频| 精久久久 | 福利在线看 | 精品久久久久久久人人人人传媒 | 日韩精品成人网 | 成人伊人网 | 人人cao| 四虎永久免费在线 | 一区二区视频在线 | 狠狠爱免费视频 | 日日夜夜精品免费视频 | 欧美一区二区三区在线视频 |