冰楓論壇

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

[討論] PIC18F46K22 微控制器

[複製鏈接]

2609

主題

0

好友

1009

積分

金牌會員

Rank: 6Rank: 6

UID
373967
帖子
9026
主題
2609
精華
0
積分
1009
楓幣
0
威望
986
存款
35994
贊助金額
0
推廣
0
GP
1205
閱讀權限
70
在線時間
461 小時
註冊時間
2023-1-12
最後登入
2024-12-25

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

跳轉到指定樓層
1
發表於 2023-5-5 18:34:23 |只看該作者 |倒序瀏覽
製作 CO2 焊接機器手臂所需的零件和連結腳位,以及相關的程式碼如下:

零件清單:
PIC18F46K22 微控制器
2 個伺服馬達
2 個光學編碼器
2 個編碼器編碼盤
2 個 H 橋馬達驅動器
2 個電容(0.1uF)
2 個電阻(10kΩ)
2 個電池(7.4V)
CO2 焊接槍
其他相關機械組件和線材

連結腳位:
以下是 PIC18F46K22 微控制器與其他零件的連結腳位:
RA0:光學編碼器 A 相信號輸入
RA1:光學編碼器 B 相信號輸入
RB0:編碼器編碼盤 A 相輸入
RB1:編碼器編碼盤 B 相輸入
RB2:H 橋驅動器 1 使能輸入
RB3:H 橋驅動器 1 方向輸入
RB4:H 橋驅動器 2 使能輸入
RB5:H 橋驅動器 2 方向輸入
RB6:CO2 焊接槍觸發輸入
RB7:舵機 PWM 輸出

程式碼:
以下是 PIC18F46K22 微控制器的部分 C 語言程式碼:


#include <xc.h>

// 設定微控制器時鐘頻率
#pragma config FOSC = INTIO67
#pragma config PLLCFG = OFF
#pragma config PRICLKEN = OFF
#pragma config FCMEN = OFF
#pragma config PWRTEN = OFF
#pragma config BOREN = SBORDIS
#pragma config WDTEN = OFF
#pragma config HFOFST = OFF
#pragma config MCLRE = EXTMCLR
#pragma config STVREN = ON
#pragma config BBSIZ = BB2K
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF

// 設定 PWM 時鐘頻率
#define _XTAL_FREQ 8000000
#define PWM_FREQ 50

// 定義控制舵機的函數
void servo_control(int degree) {
    int pwm_val = 1024 + (degree * 10.24);
    CCPR1L = (pwm_val >> 2);
    CCP1CON = ((pwm_val & 0x03) << 4) | 0x0C;
}

// 主程式

void main() {
    // 設定 I/O 腳位方向
    TRISA = 0b00000011;
    TRISB = 0b11000000;

    // 設定 PWM
    PR2 = ((_XTAL_FREQ / (4 * PWM_FREQ * 16)) - 1);
    T2CON = 0b00000100;
    CCP1CON = 0b00001100;
    CCPR1L = 0;

    // 設定 ADC
    ADCON0 = 0b00000000;
    ADCON1 = 0b00001110;

    // 初始化舵機
    servo_control(0);

    while (1) {
        // 讀取光學編碼器和編碼盤的數據
        int encoder_A = PORTAbits.RA0;
        int encoder_B = PORTAbits.RA1;
        int encoder_pos = (PORTBbits.RB0 << 1) | PORTBbits.RB1;

        // 根據編碼器數據控制伺服馬達
        if (encoder_A == 1 && encoder_B == 0) {
            // 正向轉動
            if (encoder_pos == 0b00) {
                servo_control(0);
            } else if (encoder_pos == 0b10) {
                servo_control(90);
            } else if (encoder_pos == 0b11) {
                servo_control(180);
            }
        } else if (encoder_A == 1 && encoder_B == 1) {
            // 反向轉動
            if (encoder_pos == 0b01) {
                servo_control(0);
            } else if (encoder_pos == 0b00) {
                servo_control(90);
            } else if (encoder_pos == 0b10) {
                servo_control(180);
            }
        }

        // 讀取 CO2 焊接槍觸發輸入
        int trigger = PORTBbits.RB6;

        // 如果 CO2 焊接槍觸發,啟動 H 橋馬達驅動器
        if (trigger == 1) {
            PORTBbits.RB2 = 1;
            PORTBbits.RB3 = 1;
            PORTBbits.RB4 = 1;
            PORTBbits.RB5 = 0;
        } else {
            PORTBbits.RB2 = 0;
            PORTBbits.RB3 = 0;
            PORTBbits.RB4 = 0;
            PORTBbits.RB5 = 0;
        }
    }
}
這個程式碼示例,可以讀取光學編碼器和編碼盤的數據,控制伺服馬達,並根據 CO2 焊接槍的觸發控制 H 橋馬達驅動器。

收藏收藏0 推0 噓0


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

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

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

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

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

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

GMT+8, 2024-12-25 16:25

回頂部