標題: 有沒有大哥幫我看看我的PWM有什么問題,加入PWM電機就不受控制了 [打印本頁]

作者: brad1111    時間: 2020-4-22 22:03
標題: 有沒有大哥幫我看看我的PWM有什么問題,加入PWM電機就不受控制了
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char pwm_M1_val ;//M1電機占空比值 取值范圍0-255,0最快
unsigned char pwm_M2_val;//M2電機占空比值 取值范圍0-255 ,0最快
unsigned char pwm_M3_val;//M3電機占空比值 取值范圍0-255,0最快
unsigned char pwm_M4_val;//M4電機占空比值 取值范圍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電機為P1.4的I/O口,即為小車右邊第一個電機
sbit PWM2B=P1^5;//定義M2電機為P1.5的I/O口,即為小車左邊第一個電機
sbit PWM0B=P1^6;//定義M3電機為P1.6的I/O口,即為小車左邊第二個電機
sbit PWM0A=P1^7;//定義M4電機為P1.7的I/O口,即為小車右邊第二個電機
sbit SER  =P2^5;//定義74hc595芯片 DS腳數據線
sbit RCK  =P2^6;//定義 LATCH腳 輸出存儲器鎖存時鐘線
sbit SCK  =P2^7;//定義輸入時鐘線
void delay(unsigned int z)//毫秒級延時
{                                                                               
        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_CP置成低電平
   _nop_();
   _nop_();        //兩個時鐘周期
   SCK=1;        //數據在串行時鐘輸入端SH_CP的上升沿輸入到移位寄存器
  }
   RCK=0; //鎖存
   _nop_();
   _nop_();       
   RCK=1; //移位寄存器上升沿時,數據進入存儲寄存器
}

void forward()        //小車前進
{

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

PWM2A=1; //M1電機使能
PWM2B=1; //M2電機使能
PWM0B=1; //M3電機使能
PWM0A=1; //M4電機使能
HC595SendData(0x95);//0000 0101  右側電機前進,左側電機不動
delay(3000) ;
}
void right_run() //小車右轉
{

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

     { //沒有檢測到黑線,小車不動
      if(led_right==1&&led_middle==1&&led_left==1)  //沒有檢測到黑線
      {
             stop()        ;//調用小車停止函數
      }
          else
          {
                if(led_right==0&&led_middle==0&&led_left==0) //左邊檢測到黑線
                {
                 forward();//前進
                }
          
            if(led_right==0&&led_middle==1&&led_left==1) //右邊檢測到黑線
                {
                 right_run();//右轉
                }       
                if(led_right==1&&led_middle==1&&led_left==0) //左邊檢測到黑線
                {
                 left_run();//左轉
                }       
       }
}
}


作者: brad1111    時間: 2020-4-22 22:04
不加PWM還能實現左轉右轉直行的功能,加了之后M2\3\4這三個輪子向前,M1向后,而且觸摸尋跡探頭都沒反應的
作者: brad1111    時間: 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電機占空比值 取值范圍0-255,0最快
unsigned char pwm_M2_val=100;//M2電機占空比值 取值范圍0-255 ,0最快
unsigned char pwm_M3_val=100;//M3電機占空比值 取值范圍0-255,0最快
unsigned char pwm_M4_val=100;//M4電機占空比值 取值范圍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電機為P1.4的I/O口,即為小車右邊第一個電機
sbit PWM2B=P1^5;//定義M2電機為P1.5的I/O口,即為小車左邊第一個電機
sbit PWM0B=P1^6;//定義M3電機為P1.6的I/O口,即為小車左邊第二個電機
sbit PWM0A=P1^7;//定義M4電機為P1.7的I/O口,即為小車右邊第二個電機
sbit SER  =P2^5;//定義74hc595芯片 DS腳數據線
sbit RCK  =P2^6;//定義 LATCH腳 輸出存儲器鎖存時鐘線
sbit SCK  =P2^7;//定義輸入時鐘線
void delay(unsigned int z)//毫秒級延時
{                                                                               
        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_CP置成低電平
   _nop_();
   _nop_();        //兩個時鐘周期
   SCK=1;        //數據在串行時鐘輸入端SH_CP的上升沿輸入到移位寄存器
  }
   RCK=0; //鎖存
   _nop_();
   _nop_();       
   RCK=1; //移位寄存器上升沿時,數據進入存儲寄存器
}

void forward()        //小車前進
{

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

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

void main()
     {
                 //沒有檢測到黑線,小車不動
      if(led_right==1&&led_middle==1&&led_left==1)  //沒有檢測到黑線
      {
             stop()        ;//調用小車停止函數
      }
          else
          {
                if(led_right==0&&led_middle==0&&led_left==0) //左邊檢測到黑線
                {
                 forward();//前進
                }
          
            if(led_right==0&&led_middle==1&&led_left==1) //右邊檢測到黑線
                {
                 right_run();//右轉
                }       
                if(led_right==1&&led_middle==1&&led_left==0) //左邊檢測到黑線
                {
                 left_run();//左轉
                }       
       }
}

作者: brad1111    時間: 2020-4-23 10:36
在加入PWM之后,M2、M3、M4輪子向前走,M1輪子向后轉,而且無法實現尋跡功能,這是怎么回事




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1