C語言模塊化編程思維以及直流電機控制(第四天)

在這里插入圖片描述


👨?💻個人主頁:@開發者-削好皮的Pineapple!

👨?💻 hello 歡迎 點贊👍 收藏? 留言📝 加關注?!

👨?💻 本文由 削好皮的Pineapple! 原創

👨?💻 收錄于專欄:C語言到基于STM32 的智能礦探小車


請添加圖片描述

請添加圖片描述

文章目錄

    • ?前言?
    • 🎶一、模塊化編程思維
    • 🎶二、直流電機
      • 2.1 電機驅動模塊
    • 🎶三、小車運動控制代碼實現
      • 3.1 小車控制函數(`car.c`/`car.h`)
      • 3.2 程序下載與運行設置
      • 3.3 速度控制
        • 結束語🥇


?前言?

今天是實習培訓的新一天,學習聚焦于模塊化編程思維以及直流電機控制相關知識,包括電機驅動模塊的使用、小車運動控制代碼的實現以及PWM技術在速度調節中的應用,為后續智能礦探小車的開發進一步夯實基礎。


🎶一、模塊化編程思維


模塊化編程是按照不同功能將程序拆分為對應的源文件(.c)和頭文件(.h),以提高代碼的可維護性和復用性。

  • 源文件(.c):用于保存函數接口的具體實現。
    例如led.c
    void led_init(void)
    {// 初始化LED的具體代碼
    }
    void led_ctrl(...)
    {// 控制LED的具體代碼
    }
    
#include "led.h"
#include "stm32f4xx.h"void LED_Init(void)
{// 使能GPIOF和GPIOE外設時鐘RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOE, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;// 配置GPIOF的LED引腳(D1、D2)GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOF, &GPIO_InitStruct);// 配置GPIOE的LED引腳(D3、D4)GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;GPIO_Init(GPIOE, &GPIO_InitStruct);// 默認關閉所有LEDGPIO_SetBits(GPIOF, GPIO_Pin_9 | GPIO_Pin_10);GPIO_SetBits(GPIOE, GPIO_Pin_13 | GPIO_Pin_14);
}void LED_Control(LEDNUM led_num, LEDSTA state)
{switch(led_num){case LED_D1:if(state == LED_ON)GPIO_ResetBits(GPIOF, GPIO_Pin_9);elseGPIO_SetBits(GPIOF, GPIO_Pin_9);break;case LED_D2:if(state == LED_ON)GPIO_ResetBits(GPIOF, GPIO_Pin_10);elseGPIO_SetBits(GPIOF, GPIO_Pin_10);break;case LED_D3:if(state == LED_ON)GPIO_ResetBits(GPIOE, GPIO_Pin_13);elseGPIO_SetBits(GPIOE, GPIO_Pin_13);break;case LED_D4:if(state == LED_ON)GPIO_ResetBits(GPIOE, GPIO_Pin_14);elseGPIO_SetBits(GPIOE, GPIO_Pin_14);break;}
}
  • 頭文件(.h):用于保存函數聲明、構造類型定義、全局變量聲明等,且需添加防止重復包含的預處理指令。
    例如led.h
    #ifndef _LED_H  // 如果未定義_LED_H
    #define _LED_H  // 定義_LED_H,防止頭文件重復包含// 函數聲明
    void led_init(void);
    void led_ctrl(...);// 全局變量聲明
    // 構造類型定義#endif
    
#ifndef _LED_H
#define _LED_H#include <stdint.h>  // 添加此頭文件以使用uint8_ttypedef enum {LED_D1,LED_D2,LED_D3,LED_D4
} LEDNUM;typedef enum {LED_OFF,LED_ON
} LEDSTA;void LED_Init(void);
void LED_Control(LEDNUM led_num, LEDSTA state);#endif
  • 常見模塊示例
    • delay.c/delay.h:實現延時功能,如void delay_ms(uint16_t nms);(毫秒級延時)、void delay_us(uint16_t us);(微秒級延時)。

🎶二、直流電機


2.1 電機驅動模塊

  • 接線說明

    • 兩個綠色端子:直接連接直流電機。
      在這里插入圖片描述

    • 6個排針:

      • VCC:接5V或3.3V(5V驅動時小車力度大,狀態改變較難;3.3V驅動時力度小,狀態改變相對容易)。
      • GND:接GND(注意正負極不可接反)。
      • 控制引腳:B-1AB-1B用于控制一個電機,A-1AA-1B用于控制另一個電機,具體對應哪個電機需看實物綠色端子的連接。以下是本次實訓所用驅動電路板。
        在這里插入圖片描述
        引腳依次是:B-1A、B-1B、GND、VCC、A-1A、A-1B
  • 電機轉動原理:直流電機由兩個引腳驅動,當兩個引腳電平狀態不同時電機轉動。

    • 假設B-1A為高電平、B-1B為低電平時,電機向前轉動;則B-1A為低電平、B-1B為高電平時,電機向后轉動。
    • B-1AB-1B均為低電平或均為高電平時,電機停止轉動。
  • 可用GPIO引腳:在CAMERA處有部分GPIO引腳可用于連接控制,如2腳(GND)、4腳(PD6)、6腳、8腳、10腳…1腳(3V3)、3腳(PB7)、5腳、7腳、9腳…根據原理圖(GEC-M4原理圖2016-07-29.pdf)可得:
    在這里插入圖片描述


🎶三、小車運動控制代碼實現


3.1 小車控制函數(car.c/car.h

  • 小車初始化函數
 void car_Init(void)
{//1.時鐘使能RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD , ENABLE);//2.初始化GPIO ---> 推挽輸出模式 GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_Init(GPIOD, &GPIO_InitStruct);// 配置GPIOE的LED引腳GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7| GPIO_Pin_6;GPIO_Init(GPIOB, &GPIO_InitStruct);//3.默認狀態:小車停止GPIO_SetBits(GPIOD, GPIO_Pin_6 | GPIO_Pin_7);//左GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7);//右
}
  • 基本運動控制函數
    • 前進:
 int speed = 100;
void car_up(void)		
{//左輪電機前轉GPIO_ResetBits(GPIOD, GPIO_Pin_6 );//A-1BGPIO_SetBits(GPIOD, GPIO_Pin_7 );//	A-1A//右輪電機前轉GPIO_ResetBits(GPIOB, GPIO_Pin_6 );//B-1AGPIO_SetBits(GPIOB, GPIO_Pin_7 );//B-1Bdelay_ms(speed);GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7);//右delay_ms(100-speed);	
}
  • 后退:
void car_back(void)
{//左輪電機后轉GPIO_ResetBits(GPIOD, GPIO_Pin_7 );GPIO_SetBits(GPIOD, GPIO_Pin_6 );			//右輪電機后轉GPIO_ResetBits(GPIOB, GPIO_Pin_7 );GPIO_SetBits(GPIOB, GPIO_Pin_6 );			
}
  • 左轉:
    void car_left(void)
{//左輪不轉 (后轉)GPIO_SetBits(GPIOD, GPIO_Pin_6 | GPIO_Pin_7);//右輪前進GPIO_ResetBits(GPIOB, GPIO_Pin_6 );GPIO_SetBits(GPIOB, GPIO_Pin_7 );
}
- 右轉:
void car_right(void)
{//右輪不轉 (后轉)GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7);//左輪前進GPIO_ResetBits(GPIOD, GPIO_Pin_6 );GPIO_SetBits(GPIOD, GPIO_Pin_7 );
}
  • 停止:
void car_stop(void)
{//右輪和左輪子都不轉GPIO_SetBits(GPIOD, GPIO_Pin_6 | GPIO_Pin_7);GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7);
}

3.2 程序下載與運行設置

  • 下載程序時BOOT0接3V3,BOOT1接GND,按下復位鍵,CPU執行引導程序,程序可下載到開發板。
  • 下載完成后BOOT0接GND,BOOT1接GND,重新上電或按復位鍵,程序重新運行。

3.3 速度控制

  • 簡單速度調節(上面已經實現):通過控制電機轉動與停止的時間比例來調節速度。

    int speed = 100;
    void car_up(void)
    {// 左輪電機前轉// 右輪電機前轉(右輪速度調節)B-1A = 1;B-1B = 0;  // 右輪轉動delay_ms(speed);B-1B = 1;  // 右輪停止轉動delay_ms(100 - speed);
    }
    
  • PWM(脈沖寬度調制):通過調節有效電平時間與整個周期的比例(占空比)來精確控制電機轉速、蜂鳴器鳴叫等。

    • 占空比 = 有效電平時間 / 整個周期。
    • 例如:有效電平時間50ms,周期100ms,占空比為50%。
    • 注意:使用PWM調節的周期不能太長。
  • 主函數示例

    int main()
    {while(1){car_up();  // 小車前進}
    }
    
  • 練習目標:調節小車輪子速度,使小車前進1m左右。
    在這里插入圖片描述
    在這里插入圖片描述

請添加圖片描述

結束語🥇

🔥 訂閱專欄持續學習:C語言到基于STM32的智能礦探小車
💬 歡迎點贊、收藏、留言討論,一起攻克嵌入式開發!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88292.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PTA】數據結構與算法0001:1025 反轉鏈表

文章大綱寫在前面測試用例ac代碼學習代碼知識點小結寫在前面 實現思路 結構體封裝數據 根據order重新排序k區間值迭代翻轉 n整除k&#xff0c;則最后地址輸出"-1"非整除&#xff0c;最后剩余區間&#xff0c;原序輸出。最后地址輸出"-1" 題目有難度&…

深入解析 .NET 泛型:從原理到實戰優化

在現代軟件開發中&#xff0c;代碼復用性和性能優化是開發者永恒的追求。.NET 泛型作為一項強大的語言特性&#xff0c;不僅能夠幫助我們消除重復代碼&#xff0c;還能顯著提升代碼的類型安全性和運行效率。本文將帶你全面了解 .NET 泛型&#xff0c;從基本概念到高級用法&…

Excel 處理軟件 內容復制工具:工作表批量復制 + 合并拆分簡潔操作零門檻

各位辦公小能手們&#xff01;今天給你們介紹一款超牛的軟件——Excel內容復制工具。軟件下載地址安裝包 這可是專門為了讓Excel數據處理效率蹭蹭往上漲而設計的輔助軟件呢&#xff01;它的主要功能可多啦&#xff0c;能批量復制工作表&#xff0c;還能把好多表格合并到同一個…

【機器學習實戰筆記 14】集成學習:XGBoost算法(一) 原理簡介與快速應用

《XGBoost算法》 推薦的學習路徑&#xff1a; 【快速實現XGBoost、跑通代碼】- 第一部分 【快速掌握XGBoost應用、達到自由調參水平】- 第一部分~第三部分 【快速掌握XGBoost原理、面試得以通關】- 第一部分1 第二部分1.2、2.2 第四部分 目錄《XGBoost算法》一 XGBoost的基…

.NET AI 模板

引言 隨著人工智能技術的快速發展&#xff0c;AI應用開發已成為開發者必備的技能之一。然而&#xff0c;對于許多.NET開發者來說&#xff0c;如何快速上手AI開發仍然是一個挑戰。微軟推出的.NET AI模板預覽版正是為了解決這一問題而生&#xff0c;為開發者提供了構建智能聊天應…

EFK9.0.3 windows搭建

背景 最近某個功能要使用到ELK&#xff08;ElasticSearch、Logstash、Kibana&#xff09;采集日志&#xff0c;對數據進行分析&#xff0c;網上百度了一下&#xff0c;目前推薦不使用Logstash而使用Filebeat ,即EFK。 下載鏈接 Elasticsearch Kibana Filebeat 安裝前提 …

上海新華醫院奉賢院區:以元宇宙技術重構未來醫療生態

引言&#xff1a;當醫療遇上元宇宙在數字化轉型的浪潮中&#xff0c;上海新華醫院奉賢院區以"智慧醫院"為定位&#xff0c;率先構建了"元宇宙醫院"雛形。通過AI大模型、三維影像分析、AR手術導航等前沿技術的深度融合&#xff0c;醫院正在打造一個覆蓋全周…

知識競賽答題pk小程序用戶操作手冊

知識競賽答題 PK 小程序用戶操作手冊 一、注冊與登錄 用戶首次使用答題pk小程序需上傳頭像&#xff0c;輸入昵稱&#xff0c;并選擇加入團隊。如果是企業內部人員使用可開啟白名單功能。二、進入答題 PK 模式 登錄后&#xff0c;在小程序首頁&#xff0c;您可以看到 “單人挑戰…

等大小譜聚類

聚類是一種將具有相似特征的數據點進行分組的方法。它廣泛應用于探索性數據分析&#xff0c;并已被證明在模式識別、市場和客戶細分、推薦系統、數據壓縮以及生物數據分析等許多應用中都發揮著重要作用。 盡管聚類算法種類繁多&#xff0c;但沒有一種能夠生成點數均衡的聚類。…

〔從零搭建〕數據湖平臺部署指南

&#x1f525;&#x1f525; AllData大數據產品是可定義數據中臺&#xff0c;以數據平臺為底座&#xff0c;以數據中臺為橋梁&#xff0c;以機器學習平臺為中層框架&#xff0c;以大模型應用為上游產品&#xff0c;提供全鏈路數字化解決方案。 ?杭州奧零數據科技官網&#xff…

Java 導出pdf 寫出demo 1、需要設置自定義頁眉和文字 2、可以插入表格 3、可以插入圖片

以下是一個使用 iText 7 庫實現 PDF 導出的 Java 示例&#xff0c;包含自定義頁眉、文字、表格和圖片功能&#xff1a; 添加 Maven 依賴 <dependencies><!-- iText 7 Core --><dependency><groupId>com.itextpdf</groupId><artifactId>ite…

Ntfs!LfsReadRestart函數分析得到Ntfs!LFS_RESTART_PAGE_HEADER

第一部分&#xff1a;0: kd> p Ntfs!LfsPinOrMapData0x8c: f71797f6 ff15a40016f7 call dword ptr [Ntfs!_imp__CcPinRead (f71600a4)] 0: kd> t nt!CcPinRead: 80bf9a5a 6a2c push 2Ch 0: kd> kc# 00 nt!CcPinRead 01 Ntfs!LfsPinOrMapData 02 N…

skywalking-agent-docker鏡像

FROM centos:7.9.2009 USER root# 定義 Arthas 目錄環境變量 ENV ARTHAS_HOME/opt/arthas# 更改 YUM 源并清理緩存 RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak && \rm -rf /etc/yum.repos.d/* && \curl -o /etc/yum.rep…

數據庫開發運維的集成:彌合開發與運維之間的鴻溝

在傳統的軟件開發工作流程中&#xff0c;數據庫變更往往是事后才考慮的問題。應用程序代碼遵循定義明確的開發運維實踐&#xff0c;包括版本控制、自動測試和持續部署&#xff0c;而數據庫變更則經常是由數據庫管理員手動執行的高風險操作。這種脫節造成了瓶頸&#xff0c;帶來…

PiscTrace應用:從 YOLO-Pose 到深蹲與引體向上計數:實時健身動作分析與實現

隨著健身行業的發展&#xff0c;越來越多的智能應用涌現&#xff0c;用于幫助健身者更好地記錄和分析運動情況。特別是在體能訓練中&#xff0c;俯臥撐和引體向上是兩個非常常見的動作&#xff0c;它們通常用來鍛煉上半身力量和耐力。為了使訓練更加科學和高效&#xff0c;實時…

【unity】webCanvas.enabled = false;和webCanvas.gameObject.SetActive(false);的優缺點比較

在 Unity 中&#xff0c;webCanvas.gameObject.SetActive(false) 和 webCanvas.enabled false 是兩種不同的隱藏 UI 的方式&#xff0c;它們的核心區別在于作用范圍和對組件狀態的影響。理解這些差異能幫助你避免初始化失敗、性能問題和邏輯錯誤。 1核心區別 gameObject.SetAc…

深入探索 pnpm:高效磁盤利用與靈活的包管理解決方案

引言 在現代 JavaScript 開發中&#xff0c;依賴管理效率直接影響開發體驗。傳統工具如 npm 和 yarn 在大型項目中常面臨磁盤冗余和性能瓶頸。pnpm&#xff08;Performant npm&#xff09;通過創新的硬鏈接和符號鏈接機制&#xff0c;解決了這些痛點。本文將深入解析 pnpm 的核…

Hive MetaStore的實現和優化

在大數據領域&#xff0c;數據管理與存儲至關重要&#xff0c;Hive MetaStore&#xff08;HMS&#xff09;作為 Hive 數據倉庫的核心組件&#xff0c;承擔著元數據管理的關鍵職責。隨著數據規模不斷膨脹&#xff0c;其性能與穩定性面臨挑戰。本文將深入剖析 HMS 的實現機制&…

一文讀懂動態規劃:多種經典問題和思路

一、動態規劃算法的思想與核心概念框架 1. 動態規劃的基本思想 動態規劃&#xff08;Dynamic Programming, DP&#xff09;是一種通過將復雜問題分解為重疊子問題&#xff0c;并利用子問題的解來高效解決原問題的方法。其核心思想是避免重復計算&#xff0c;通過存儲中間結果&a…

阿幸課堂隨機點名

代碼功能 這個是一個HTML網頁端&#xff0c;簡單來說就是可以雙擊之后運行進行點名。 當然&#xff0c;不局限于課堂點名 代碼功能 Excel 導入增強&#xff1a; 增加了列選擇器&#xff0c;可以指定從哪一列讀取學生姓名 增加了起始行選擇器&#xff0c;可以跳過標題行或其…