冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 622|回覆: 0
打印 上一主題 下一主題

[討論] PIC16F877A PIC12F508 PIC16F886

[複製鏈接]

2609

主題

0

好友

992

積分

高級會員

Rank: 4

UID
373967
帖子
8774
主題
2609
精華
0
積分
992
楓幣
2605
威望
969
存款
31556
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
451 小時
註冊時間
2023-1-12
最後登入
2024-11-4

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-4-17 20:10:55 |只看該作者 |倒序瀏覽
製作機器人需要設計和製造機械結構、電路連接、編寫控制程序等多方面的工作。以下是一些可能需要的零件和連接方式,以及相關的程式碼參考。

零件清單:
PIC16F877A 微控制器 x1
PIC12F508 微控制器 x1
PIC16F886 微控制器 x1
雙向直流馬達驅動器模塊 x2
直流馬達 x2
輪子 x2
9V 電池 x1
5V 電源模塊 x1
陀螺儀模塊 x1
超聲波模塊 x1
紅外線模塊 x1
其他機械結構和傳感器等
連接方式:
將三個微控制器按照需要連接,可以使用串行通信或其他方式進行通信。
馬達驅動器模塊需要與 PIC16F877A 微控制器連接,以控制馬達的轉動方向和速度。
陀螺儀、超聲波和紅外線模塊等傳感器需要與 PIC12F508 微控制器連接,以收集外部環境信息。
機械結構和其他傳感器需要與 PIC16F886 微控制器連接,以實現更複雜的控制功能。
程式碼參考:
以下是一些可能用到的控制程序示例,供參考:
馬達控制:使用 PWM 控制馬達速度和方向。

#include <16f877a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT
#use fast_io(B)

#byte TRISB = 0x86
#byte PORTB = 0x06

#byte CCP1CON = 0x17
#byte CCPR1L = 0x15
#byte T2CON = 0x12
#byte PR2 = 0x92

void main() {
   TRISB = 0b00000000;   // B0, B1 為輸出
   CCP1CON = 0b00001100; // PWM 模式,線性輸出,P1A 為 PWM 腳位
   T2CON = 0b00000110;   // TMR2 計數器,使用 1:16 預分頻
   PR2 = 249;            // PWM 周期為 20ms,TMR2 最大值為 249
  
while(1) {
// 控制馬達 1 正轉
PORTB = 0b00000001; // B0 設為高電位
CCPR1L = 100; // PWM 脈寬設為 100/255,控制馬達轉速
delay_ms(1000); // 持續 1 秒
// 控制馬達 1 反轉
PORTB = 0b00000010; // B1 設為高電位
CCPR1L = 150; // PWM 脈寬設為 150/255,控制馬達轉速
delay_ms(1000); // 持續 1 秒
// 停止馬達 1
PORTB = 0b00000000; // B0, B1 設為低電位
CCPR1L = 0; // PWM 脈寬為 0,馬達停轉
delay_ms(1000); // 持續 1 秒
}
}

#include <16f877a.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT
#use fast_io(B)

#byte TRISB = 0x86
#byte PORTB = 0x06

#use i2c(Master, SDA=PIN_C4, SCL=PIN_C3, FORCE_HW)

#define GYRO_ADDR 0x68

void main() {
   int16_t gyro_x = 0, gyro_y = 0, gyro_z = 0;
   int16_t gyro_x_offset = 0, gyro_y_offset = 0, gyro_z_offset = 0;
   int i = 0;
   TRISB = 0b00000000;
   i2c_start();
   i2c_write(GYRO_ADDR);
   i2c_write(0x6B);
   i2c_write(0x00);
   i2c_stop();
   delay_ms(1000);
   while(1) {
      i2c_start();
      i2c_write(GYRO_ADDR);
      i2c_write(0x43);
      i2c_start();
      i2c_write(GYRO_ADDR | 0x01);
      gyro_x = (int16_t)(i2c_read() << 8);
      gyro_x |= i2c_read();
      gyro_y = (int16_t)(i2c_read() << 8);
      gyro_y |= i2c_read();
      gyro_z = (int16_t)(i2c_read() << 8);
      gyro_z |= i2c_read();
      i2c_stop();
      if (i < 100) {
         gyro_x_offset += gyro_x;
         gyro_y_offset += gyro_y;
         gyro_z_offset += gyro_z;
         i++;
      }
      else {
         gyro_x -= gyro_x_offset / 100;
         gyro_y -= gyro_y_offset / 100;
         gyro_z -= gyro_z_offset / 100;

     // 控制動作
     if (gyro_y > 1000) {
        // 往前走
        PORTB = 0b00000011;    // B0, B1 設為高電位
        delay_ms(500);         // 持續 0.5 秒
        PORTB = 0b00000000;    // B0, B1 設為低電位
        delay_ms(500);         // 持續 0.5 秒
     }
     else if (gyro_y < -1000) {
        // 往後走
        PORTB = 0b00000110;    // B2, B3 設為高電位
        delay_ms(500);         // 持續 0.5 秒
        PORTB = 0b00000000;    // B2, B3 設為低電位
        delay_ms(500);         // 持續 0.5 秒
     }
     else if (gyro_x > 1000) {
        // 往右轉
        PORTB = 0b00000010;    // B1 設為高電位
        delay_ms(500);         // 持續 0.5 秒
        PORTB = 0b00000000;    // B1 設為低電位
        delay_ms(500);         // 持續 0.5 秒
     }
     else if (gyro_x < -1000) {
        // 往左轉
        PORTB = 0b00000001;    // B0 設為高電位
        delay_ms(500);         // 持續 0.5 秒
        PORTB = 0b00000000;    // B0 設為低電位
        delay_ms(500);         // 持續 0.5 秒
     }
     else {
        // 停止
        PORTB = 0b00000000;    // B0, B1, B2, B3 設為低電位
     }
  }
}
}
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1彩票
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-11-4 05:51

回頂部