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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2017|回復: 3
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:703117 發表于 2020-4-22 22:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#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();//左轉
                }       
       }
}
}

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

使用道具 舉報

沙發
ID:703117 發表于 2020-4-22 22:04 | 只看該作者
不加PWM還能實現左轉右轉直行的功能,加了之后M2\3\4這三個輪子向前,M1向后,而且觸摸尋跡探頭都沒反應的
回復

使用道具 舉報

板凳
ID:703117 發表于 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();//左轉
                }       
       }
}
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re在线视频 | 国产精品18hdxxxⅹ在线 | 久久精品国产免费看久久精品 | 国产成人精品一区二 | 精品久久久久久久久久久久久久 | 99九九视频 | 国产91久久久久蜜臀青青天草二 | 国产 日韩 欧美 在线 | 成人免费视频一区二区 | 91视视频在线观看入口直接观看 | 精品在线一区二区 | 精品99在线| 欧美中文字幕一区二区 | 精品国产一区二区国模嫣然 | 久久久国产一区 | 日韩a v在线免费观看 | 国产精品区二区三区日本 | 视频在线观看一区 | 一级做a爰片性色毛片16 | 亚洲乱码国产乱码精品精98午夜 | 久久里面有精品 | 久草视频网站 | 99精品欧美一区二区三区 | 中文字幕一区二区三区乱码图片 | 免费观看黄a一级视频 | 久久综合九九 | 亚洲一区二区三区在线播放 | 国产美女视频黄a视频免费 国产精品福利视频 | 91国内精精品久久久久久婷婷 | 亚洲精品一区二区三区免 | 精品国产99 | 国产精品久久久久久久久久久久 | 91精品91久久久 | 国产精品1区 | 精品免费视频一区二区 | 国产精品毛片一区二区在线看 | 精品日韩一区二区三区 | 免费观看视频www | 欧美h| 韩国精品在线 | 中文字幕91 |