19-CubeMx+Keil+Proteus模擬STM32 - 直流電動機

来源:https://www.cnblogs.com/sheepeach/archive/2022/06/01/STM32F103_MotorDC.html
-Advertisement-
Play Games

本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 理解H橋電路的工作原理,結合前面幾個項目學習過的PWM、EXTI、串口通訊等,要求通過5個按鈕控制直流電動機的運 ...


本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》
源代碼:https://github.com/LanLinnet/STM33F103R6

項目要求

理解H橋電路的工作原理,結合前面幾個項目學習過的PWMEXTI串口通訊等,要求通過5個按鈕控制直流電動機的運行狀態,包括:電動機正轉、電動機反轉、電動機停止、電動機加速和電動機減速,其中電動機加速/減速以10%的PWM信號寬度占空比為遞增/遞減量。

硬體設計

  1. 第一節的基礎上,在Proteus中添加電路如下圖所示。其中我們添加了一個直流電動機H橋晶元L298,一個直流電動機MOTOR-DC

    此外,我們還添加了一個虛擬儀錶:虛擬終端VIRTUAL TERMINAL,將其波特率設置為19200bits/s。

  2. 直流電動機和H橋電路:直流電動機是一種常見的動力源,很多情況下需要用直流電動機帶動執行機構做各種複雜動作。直流電動機與H橋電路如下圖所示。

    • 當開關A、D閉合時,電動機左側接通驅動電源正極,右側接通驅動電源負極,直流電動機正轉;
    • 當開關B、C閉合時,電動機左側接通驅動電源負極,右側接通驅動電源正極,直流電動機反轉;
    • 當只有開關A、C閉合或只有開關B、D閉合時,電動機左、右側短路,直流電動機能耗制動,對於某些大功率直流電動機,還需要在短路迴路中串聯制動電阻,防止能耗制動過程中電流過大。
  3. 雙H橋晶元L298
    1)簡介:L298是意法半導體公司出品的雙H橋晶元,片內集成2個獨立的H橋,可同時驅動2個最大電壓為46V、最大電流為2A的直流電動機。
    2)引腳:L298控制信號為5VTTL電平,驅動電壓為5-46V,故在使用STM32控制時應當選用具備“FT”特性的GPIO引腳,並將引腳設為開漏輸出模式,同時外接上拉電阻到5V電源正極。控制電路由VSS供電,驅動電路由VS供電,晶元引腳和常用電路如下圖所示。

    • ENx:H橋A/B的使能引腳,高電平有效,往往與PWM信號相連,用於調節H橋A/B控制的直流電動機轉速。
    • ISENx:H橋A/B的驅動檢測引腳,用於進行過流檢測,並將檢測結果反饋給控制器以形成閉環控制,一般不用,可直接接地。
    • IN1-IN4:方向控制信號輸入端,其中IN1、IN2控制H橋A,其中IN3、IN4控制H橋B,具體如下表所示。
    • OUT1-OUT4:2個H橋的輸出端,用來連接2個直流電動機,其中OUT1、OUT2用來連接Motor1,OUT3、OUT4用來連接Motor2。
    • D1-D8:8個整流二極體,由於直流電動機為感性負載,為了避免L298在電動機轉換方向時受到反向電流的衝擊,加入整流二極體進行泄流。
  4. 打開CubeMX,建立工程。這一項目有很多設置都與前面涉及的項目相似,若不熟悉可以進行回顧。

    • 首先,設置具有“FT”功能的GPIO管腳PC8PC9GPIO_Output,設置GPIO mode為開漏輸出模式Output Open DrainGPIO Pull-up/Pull-down為不需要內部上拉和下拉電阻No pull-up and no pull-down,因為已經在電路中通過外部電阻上拉到+5V。
    • 隨後,設置PWM,可參考鏈接PWM,配置如下圖所示。
    • 然後,設置串口,可參考鏈接串口通訊,配置如下圖所示。
    • 最後,設置外部中斷,並將NVIC中的中斷使能都勾選上,可參考鏈接EXTI,配置如下圖所示。
  5. 點擊“Generator Code”生成Keil工程。

軟體編寫

點擊“Open Project”在Keil中打開工程,打開“main.c”,添加代碼如下。

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"		//引入標準輸入輸出庫頭文件
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint16_t cmpv = 80;		//捕獲比較值,即CRR2的設定值
uint8_t rf = 0;		//中斷標誌位
/* USER CODE END PV */
/* USER CODE BEGIN 1 */
char str[4];		//用於存放CRR2值轉換的字元串
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);		//定時器3運行併在通道2輸出PWM函數
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, cmpv);		//給定時器3設定通道2的捕獲比較寄存器值(CRR2)
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);		
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
  if(rf == 1)
  {
    HAL_UART_Transmit(&huart1, (uint8_t *)&"PWM:", 4, 4);		//串口發送字元串(PWM比較寄存器值,值越大轉速越快)
    sprintf(str, "%d", cmpv);
    HAL_UART_Transmit(&huart1, (uint8_t *)str, 3, 3);
    HAL_UART_Transmit(&huart1, (uint8_t *)&"\n\r", 2, 2);
    rf = 0;		//標誌位清零
  }
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
/* USER CODE BEGIN 4 */
//外部中斷回調函數
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == GPIO_PIN_0)		//正轉按鈕
  {
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
    rf = 1;
  }
  else if(GPIO_Pin == GPIO_PIN_1)		//反轉按鈕
  {
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
    rf = 1;
  }
  else if(GPIO_Pin == GPIO_PIN_2)		//停止按鈕
  {
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
  }
  else if(GPIO_Pin == GPIO_PIN_3)		//加速按鈕(增加PWM信號波形占空比)
  {
    if(cmpv<100) cmpv+=10;
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, cmpv);		//給定時器3設定通道2的捕獲比較寄存器值(CRR2)
    rf = 1;
  }
  else if(GPIO_Pin == GPIO_PIN_4)		//減速按鈕(減小PWM信號波形占空比)
  {
    if(cmpv>0) cmpv-=10;
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, cmpv);		//給定時器3設定通道2的捕獲比較寄存器值(CRR2)
    rf = 1;
  }
}
/* USER CODE END 4 */

聯合調試

  1. 點擊運行,生成HEX文件。
  2. 在Proteus中載入相應HEX文件,點擊運行。按下不同的按鍵,可以看到電動機轉速的變化,並且在虛擬終端中可以看到PWM占空比的設定值。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 本文講述如何查找資料庫里重覆的行。這是初學者十分普遍遇到的問題。方法也很簡單。這個問題還可以有其他演變,例如,如何查找“兩欄位重覆的行”(#mysql IRC 頻道問到的問題) 如何查找重覆行 第一步是定義什麼樣的行才是重覆行。多數情況下很簡單:它們某一列具有相同的值。本文采用這一定義,或許你對“重 ...
  • 📕 C++輸入輸出 目的:解決ACM模式下的輸入輸出問題 題目來源:牛客OJ練習場 第一題:計算多組a+b 輸入描述:輸入包括兩個正整數a,b(1 ⇐ a, b ⇐ 10^9),輸入數據包括多組。 輸出描述:輸出a+b的結果 示例 輸入: 1 5 10 20 輸出: 6 30 代碼: #inclu ...
  • 一、前言 小編最近公司有個新的需求,數據量比較大,要涉及到分庫分表。大概瞭解了一些主流的中間件,使用和網上資料比較多的是Mycat和sharding-jdbc,小編比較傾向於Mycat。原因很簡單就是參考的資料比較多,教學比較多,小編經過一天的嘗試,終於完成了!這篇主要是實戰,一些知識點請自行百度, ...
  • 介紹 Elastic Stack 是一個可以幫助我們構建搜索體驗、解決問題並取得成功的搜索平臺。核心產品包括 Elasticsearch、Kibana、Beats 和 Logstash(也稱為 ELK Stack)等等。能夠安全可靠地獲取任何來源、任何格式的數據,然後實時地對數據進行搜索、分析和可視 ...
  • 一、開發背景 產品出設計稿要求做一個仿原生app簡訊驗證碼組件,花了兩小時搞出來一個還可以的組件,支持屏幕自適應,可以用於彈出框,或自己封裝的vue組件里,希望可以幫助那些被產品壓榨的同學,哈哈。😄 其核心思想就是利用一個輸入框使用css3,translate屬性,每輸入一次後向右位移一個單位位置 ...
  • 文件上傳和導入 控制器代碼 [Route("api/[controller]")] [ApiController] public class UpdController : ControllerBase { private readonly IWebHostEnvironment env; priv ...
  • 為什麼要使用Vuepress VuePress由兩部分組成:一個極簡的靜態站點生成器,帶有一個vue支持的主題系統和Plugin API,以及一個為編寫技術文檔而優化的預設主題。創建它是為了支持Vue自己的子項目的文檔需求。 由VuePress生成的每個頁面都有自己的預渲染靜態HTML,提供了良好的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...