冰楓論壇

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

[討論] STM32F103C8T6製作空拍無人機

[複製鏈接]

2609

主題

0

好友

945

積分

高級會員

Rank: 4

UID
373967
帖子
7402
主題
2609
精華
0
積分
945
楓幣
1002
威望
925
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
405 小時
註冊時間
2023-1-12
最後登入
2024-4-29

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

跳轉到指定樓層
1
發表於 2023-4-2 09:38:38 |只看該作者 |倒序瀏覽

材料:

STM32F103C8T6微控制器
電池和充電器
電機和電調(電機速度控制器)
遙控器(可以使用藍牙模塊或射頻模塊)
IMU(慣性測量單元,例如陀螺儀、加速度計等)
GPS模塊
無線傳輸模組(可選)
連接腳位:
以下是STM32F103C8T6與其他常見元件的連接腳位:

電池和充電器:電池正負極分別連接至STM32F103C8T6的VBAT和GND腳位,充電器則連接至電池正負極。
電機和電調:電機連接至電調,電調則連接至STM32F103C8T6的PWM輸出引腳,例如PA0、PA1、PB0、PB1等。
遙控器:可以使用UART、SPI或其他通信協議連接到STM32F103C8T6。
IMU:可以使用I2C或SPI協議連接到STM32F103C8T6。
GPS模塊:可以使用UART協議連接到STM32F103C8T6。
無線傳輸模組:可以使用UART、SPI或其他通信協議連接到STM32F103C8T6。
時鐘校正:
STM32F103C8T6具有內部時鐘,您可以通過修改寄存器來進行時鐘校正。以下是一個簡單的時鐘校正程式碼示例:


#include "stm32f10x.h"

void clock_init(void)
{
    RCC_DeInit(); // 復位 RCC 寄存器
    RCC_HSICmd(ENABLE); // 啟用內部高速時鐘
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); // 等待時鍾啟動
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9); // 設置 PLL
    RCC_PLLCmd(ENABLE); // 啟用 PLL
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // 等待 PLL 啟動
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 將 PLL 輸出設置為系統時鐘
    while(RCC_GetSYSCLKSource() != 0x08); // 等待系統時鐘穩定

#include "stm32f10x.h"

void init(void)
{
    // 復位 RCC 寄存器
    RCC_DeInit();
   
    // 啟用內部高速時鐘
    RCC_HSICmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
   
    // 設置 PLL
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9);
   
    // 啟用 PLL
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
   
    // 將 PLL 輸出設置為系統時鐘
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    while(RCC_GetSYSCLKSource() != 0x08);
   
    // 使能GPIO時鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
   
    // 配置 GPIO 輸出速度為最大速度
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   
    // 配置其他 GPIO 引腳等
    // ...
}
在此之後,您還需要編寫具體的控制邏輯,包括接收遙控器信號,讀取IMU數據,處理GPS數據等。這些都需要根據您的具體設計和應用來編寫相應的代碼。

#include "stm32f10x.h"
#include "math.h"

// 定義PID控制參數
float kp = 1.0, ki = 0.0, kd = 0.0;
float integral = 0.0, derivative = 0.0, error = 0.0, last_error = 0.0;

// 定義變量
float roll = 0.0, pitch = 0.0, yaw = 0.0;
float gyro_x = 0.0, gyro_y = 0.0, gyro_z = 0.0;
float accel_x = 0.0, accel_y = 0.0, accel_z = 0.0;
float throttle = 0.0;
float motor1 = 0.0, motor2 = 0.0, motor3 = 0.0, motor4 = 0.0;

// PID控制函數
float PID(float setpoint, float input)
{
    error = setpoint - input;
    integral += error;
    derivative = error - last_error;
    last_error = error;
    return (kp * error + ki * integral + kd * derivative);
}

// 初始化函數
void init(void)
{
    // 配置 GPIO 引腳等
    // ...
}

// 主循環
int main(void)
{
    // 初始化
    init();

    // 主循環
    while(1)
    {
        // 讀取傳感器數據
        gyro_x = read_gyro_x();
        gyro_y = read_gyro_y();
        gyro_z = read_gyro_z();
        accel_x = read_accel_x();
        accel_y = read_accel_y();
        accel_z = read_accel_z();

        // 計算姿態角
        roll = atan2(accel_y, accel_z) * 180.0 / M_PI;
        pitch = atan2(-accel_x, sqrt(accel_y * accel_y + accel_z * accel_z)) * 180.0 / M_PI;

        // 計算PID輸出值
        float roll_output = PID(0.0, roll);
        float pitch_output = PID(0.0, pitch);
        float yaw_output = PID(0.0, yaw);

        // 計算電機輸出值
        motor1 = throttle + roll_output + pitch_output + yaw_output;
        motor2 = throttle - roll_output + pitch_output - yaw_output;
        motor3 = throttle - roll_output - pitch_output + yaw_output;
        motor4 = throttle + roll_output - pitch_output - yaw_output;

        // 更新電機輸出
        set_motor1(motor1);
        set_motor2(motor2);
        set_motor3(motor3);
        set_motor4(motor4);
    }
}
[發帖際遇]: 洪嵐峰 為了與「黃金十二猛漢」蕉流蕉流,花費 2 楓幣 幸運榜 / 衰神榜
收藏收藏0 推0 噓0


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

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

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

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

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

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

GMT+8, 2024-4-29 17:32

回頂部