找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

有沒有大哥幫我看看我的PWM有什么問題,加入PWM電機(jī)就不受控制了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:703117 發(fā)表于 2020-4-22 22:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char pwm_M1_val ;//M1電機(jī)占空比值 取值范圍0-255,0最快
unsigned char pwm_M2_val;//M2電機(jī)占空比值 取值范圍0-255 ,0最快
unsigned char pwm_M3_val;//M3電機(jī)占空比值 取值范圍0-255,0最快
unsigned char pwm_M4_val;//M4電機(jī)占空比值 取值范圍0-255 ,0最快
unsigned char pwm_t;//周期
sbit led_right=P1^1;    // 定義右路尋跡為P1.1
sbit led_middle=P1^2;        // 定義中路尋跡為P1.2
sbit led_left=P1^3;            // 定義左路尋跡為P1.3
sbit PWM2A=P1^4;//定義M1電機(jī)為P1.4的I/O口,即為小車右邊第一個(gè)電機(jī)
sbit PWM2B=P1^5;//定義M2電機(jī)為P1.5的I/O口,即為小車左邊第一個(gè)電機(jī)
sbit PWM0B=P1^6;//定義M3電機(jī)為P1.6的I/O口,即為小車左邊第二個(gè)電機(jī)
sbit PWM0A=P1^7;//定義M4電機(jī)為P1.7的I/O口,即為小車右邊第二個(gè)電機(jī)
sbit SER  =P2^5;//定義74hc595芯片 DS腳數(shù)據(jù)線
sbit RCK  =P2^6;//定義 LATCH腳 輸出存儲(chǔ)器鎖存時(shí)鐘線
sbit SCK  =P2^7;//定義輸入時(shí)鐘線
void delay(unsigned int z)//毫秒級(jí)延時(shí)
{                                                                               
        unsigned int x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}       
void HC595SendData(u8 SendVal)
{
  u8 i;
  for(i=0;i<8;i=i++)
  {
   SER=SendVal&0x80;//1000 0000 1000 0000       
   SendVal=SendVal<<1;//0000 0000 0000 0000          每次取1位左移
   SCK=0; //先將串行時(shí)鐘輸入端SH_CP置成低電平
   _nop_();
   _nop_();        //兩個(gè)時(shí)鐘周期
   SCK=1;        //數(shù)據(jù)在串行時(shí)鐘輸入端SH_CP的上升沿輸入到移位寄存器
  }
   RCK=0; //鎖存
   _nop_();
   _nop_();       
   RCK=1; //移位寄存器上升沿時(shí),數(shù)據(jù)進(jìn)入存儲(chǔ)寄存器
}

void forward()        //小車前進(jìn)
{

PWM2A=1; //M1電機(jī)使能
PWM2B=1; //M2電機(jī)使能
PWM0B=1; //M3電機(jī)使能
PWM0A=1; //M4電機(jī)使能
HC595SendData(0x95);//1001 0101 M1,M2反轉(zhuǎn) M3,M4正轉(zhuǎn),小車前進(jìn)
delay(3000) ;
}
void left_run() //小車左轉(zhuǎn)
{

PWM2A=1; //M1電機(jī)使能
PWM2B=1; //M2電機(jī)使能
PWM0B=1; //M3電機(jī)使能
PWM0A=1; //M4電機(jī)使能
HC595SendData(0x95);//0000 0101  右側(cè)電機(jī)前進(jìn),左側(cè)電機(jī)不動(dòng)
delay(3000) ;
}
void right_run() //小車右轉(zhuǎn)
{

PWM2A=1; //M1電機(jī)使能
PWM2B=1; //M2電機(jī)使能
PWM0B=1; //M3電機(jī)使能
PWM0A=1; //M4電機(jī)使能
HC595SendData(0x95);//1001 0000  左側(cè)電機(jī)前進(jìn),右側(cè)電機(jī)不動(dòng)
delay(3000) ;
}
void turn_back() //小車后退
{
PWM2A=1; //M1電機(jī)使能
PWM2B=1; //M2電機(jī)使能
PWM0B=1; //M3電機(jī)使能
PWM0A=1; //M4電機(jī)使能
HC595SendData(0x6a);//0110 1010 左側(cè)電機(jī)前進(jìn),右側(cè)電機(jī)后退
delay(3000) ;
}
void stop() //小車停止
{
PWM2A=0; //M1電機(jī)不使能
PWM2B=0; //M2電機(jī)不使能
PWM0B=0; //M3電機(jī)不使能
PWM0A=0; //M4電機(jī)不使能
delay(3000) ;
}
//定時(shí)器0中斷
void timer0() interrupt 1
{
pwm_t++;//周期計(jì)時(shí)加
if(pwm_t == 255)
                pwm_t=PWM2A=PWM2B=PWM0A=PWM0B=0;
if(pwm_M1_val == pwm_t)//M1電機(jī)占空比       
                PWM2A = 1;               
if(pwm_M2_val == pwm_t)//M2電機(jī)占空比
                PWM2B = 1;       
if(pwm_M3_val == pwm_t)//M3電機(jī)占空比       
                PWM0B = 1;               
if(pwm_M4_val == pwm_t)//M4電機(jī)占空比
                PWM0A = 1;
}       
void main()
{
TMOD |= 0x02;//定時(shí)器工作方式2,8位自動(dòng)重裝模塊
        TH0 = 220;
        TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
        TR0 = 1;//啟動(dòng)定時(shí)器0
        ET0 = 1;//允許定時(shí)器0中斷
        EA        = 1;//總中斷允許
        while(1)

     { //沒有檢測到黑線,小車不動(dòng)
      if(led_right==1&&led_middle==1&&led_left==1)  //沒有檢測到黑線
      {
             stop()        ;//調(diào)用小車停止函數(shù)
      }
          else
          {
                if(led_right==0&&led_middle==0&&led_left==0) //左邊檢測到黑線
                {
                 forward();//前進(jìn)
                }
          
            if(led_right==0&&led_middle==1&&led_left==1) //右邊檢測到黑線
                {
                 right_run();//右轉(zhuǎn)
                }       
                if(led_right==1&&led_middle==1&&led_left==0) //左邊檢測到黑線
                {
                 left_run();//左轉(zhuǎn)
                }       
       }
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:703117 發(fā)表于 2020-4-22 22:04 | 只看該作者
不加PWM還能實(shí)現(xiàn)左轉(zhuǎn)右轉(zhuǎn)直行的功能,加了之后M2\3\4這三個(gè)輪子向前,M1向后,而且觸摸尋跡探頭都沒反應(yīng)的
回復(fù)

使用道具 舉報(bào)

板凳
ID:703117 發(fā)表于 2020-4-22 22:05 | 只看該作者
這是最開始的程序

#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char pwm_M1_val=100 ;//M1電機(jī)占空比值 取值范圍0-255,0最快
unsigned char pwm_M2_val=100;//M2電機(jī)占空比值 取值范圍0-255 ,0最快
unsigned char pwm_M3_val=100;//M3電機(jī)占空比值 取值范圍0-255,0最快
unsigned char pwm_M4_val=100;//M4電機(jī)占空比值 取值范圍0-255 ,0最快
unsigned char pwm_t;//周期
sbit led_right=P1^1;    // 定義右路尋跡為P1.1
sbit led_middle=P1^2;        // 定義中路尋跡為P1.2
sbit led_left=P1^3;            // 定義左路尋跡為P1.3
sbit PWM2A=P1^4;//定義M1電機(jī)為P1.4的I/O口,即為小車右邊第一個(gè)電機(jī)
sbit PWM2B=P1^5;//定義M2電機(jī)為P1.5的I/O口,即為小車左邊第一個(gè)電機(jī)
sbit PWM0B=P1^6;//定義M3電機(jī)為P1.6的I/O口,即為小車左邊第二個(gè)電機(jī)
sbit PWM0A=P1^7;//定義M4電機(jī)為P1.7的I/O口,即為小車右邊第二個(gè)電機(jī)
sbit SER  =P2^5;//定義74hc595芯片 DS腳數(shù)據(jù)線
sbit RCK  =P2^6;//定義 LATCH腳 輸出存儲(chǔ)器鎖存時(shí)鐘線
sbit SCK  =P2^7;//定義輸入時(shí)鐘線
void delay(unsigned int z)//毫秒級(jí)延時(shí)
{                                                                               
        unsigned int x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}       
void HC595SendData(u8 SendVal)
{
  u8 i;
  for(i=0;i<8;i=i++)
  {
   SER=SendVal&0x80;//1000 0000 1000 0000       
   SendVal=SendVal<<1;//0000 0000 0000 0000          每次取1位左移
   SCK=0; //先將串行時(shí)鐘輸入端SH_CP置成低電平
   _nop_();
   _nop_();        //兩個(gè)時(shí)鐘周期
   SCK=1;        //數(shù)據(jù)在串行時(shí)鐘輸入端SH_CP的上升沿輸入到移位寄存器
  }
   RCK=0; //鎖存
   _nop_();
   _nop_();       
   RCK=1; //移位寄存器上升沿時(shí),數(shù)據(jù)進(jìn)入存儲(chǔ)寄存器
}

void forward()        //小車前進(jìn)
{

PWM2A=1; //M1電機(jī)使能
PWM2B=1; //M2電機(jī)使能
PWM0B=1; //M3電機(jī)使能
PWM0A=1; //M4電機(jī)使能
HC595SendData(0x95);//1001 0101 M1,M2反轉(zhuǎn) M3,M4正轉(zhuǎn),小車前進(jìn)
delay(3000) ;
}
void left_run() //小車左轉(zhuǎn)
{

PWM2A=1; //M1電機(jī)使能
PWM2B=1; //M2電機(jī)不使能
PWM0B=1; //M3電機(jī)不使能
PWM0A=1; //M4電機(jī)使能
HC595SendData(0x05);//0000 0101  右側(cè)電機(jī)前進(jìn),左側(cè)電機(jī)不動(dòng)
delay(3000) ;
}
void right_run() //小車右轉(zhuǎn)
{
PWM2A=1; //M1電機(jī)不使能
PWM2B=1; //M2電機(jī)使能
PWM0B=1; //M3電機(jī)使能
PWM0A=1; //M4電機(jī)不使能
HC595SendData(0x90);//1001 0000  左側(cè)電機(jī)前進(jìn),右側(cè)電機(jī)不動(dòng)
delay(3000) ;
}
void turn_back() //小車后退
{
PWM2A=1; //M1電機(jī)使能
PWM2B=1; //M2電機(jī)使能
PWM0B=1; //M3電機(jī)使能
PWM0A=1; //M4電機(jī)使能
HC595SendData(0x6a);//0110 1010 左側(cè)電機(jī)前進(jìn),右側(cè)電機(jī)后退
delay(3000) ;
}
void stop() //小車停止
{
PWM2A=0; //M1電機(jī)不使能
PWM2B=0; //M2電機(jī)不使能
PWM0B=0; //M3電機(jī)不使能
PWM0A=0; //M4電機(jī)不使能
delay(3000) ;
}

void main()
     {
                 //沒有檢測到黑線,小車不動(dòng)
      if(led_right==1&&led_middle==1&&led_left==1)  //沒有檢測到黑線
      {
             stop()        ;//調(diào)用小車停止函數(shù)
      }
          else
          {
                if(led_right==0&&led_middle==0&&led_left==0) //左邊檢測到黑線
                {
                 forward();//前進(jìn)
                }
          
            if(led_right==0&&led_middle==1&&led_left==1) //右邊檢測到黑線
                {
                 right_run();//右轉(zhuǎn)
                }       
                if(led_right==1&&led_middle==1&&led_left==0) //左邊檢測到黑線
                {
                 left_run();//左轉(zhuǎn)
                }       
       }
}
回復(fù)

使用道具 舉報(bào)

地板
ID:703117 發(fā)表于 2020-4-23 10:36 | 只看該作者
在加入PWM之后,M2、M3、M4輪子向前走,M1輪子向后轉(zhuǎn),而且無法實(shí)現(xiàn)尋跡功能,這是怎么回事
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表