洪嵐峰 發表於 2023-5-5 18:34:23

PIC18F46K22 微控制器

製作 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 橋馬達驅動器。

頁: [1]
查看完整版本: PIC18F46K22 微控制器