0基礎 | STM32 | TB6612電機驅動使用

TB6612介紹及使用

單片機通過驅動板連接至電機

原因:單品機I/O口輸出電流I

驅動板:從外部引入高電壓,控制電機驅動

電源部分

VM電機驅動電源輸入,輸入電壓范圍建議為3.712V

GND邏輯電源和電機驅動電源的公共地

VCC邏輯電源輸入,輸入電壓為

2.7-5.5V

電機接口

A0 B0可以接兩個電機

電機控制端口

PWMA? B分別為兩個電機控制的使能端

(可使用PWM調速)

AIN1\AIN2BIN1\BIN2

STBY

使能引腳

IN1

IN2

PWM

STBY

O1

O2

H

H

H/L

H

L

L

制動

L

H

H

H

L

H

反轉

L

H

L

H

L

L

制動

H

L

H

H

H

L

正轉

H

L

L

H

L

L

制動

L

L

H

H

OFF

-

停止

H/L

H/L

H/L

L

OFF

-

待機

main.c

#include "stm32f10x.h"

#include "led.h"

#include "usart.h"

#include "delay.h"

#include "oled.h"

#include "Motor.h"

#include "key.h"

int key = 0;

int key_state = 0;

int main(void)

{ SystemInit();//系統時鐘為72M??

????? delay_init(72);

????? LED_Init();

????? LED_On();

????? MOTOR_Init();

USART1_Config();//串口初始化

????? Key_Init();

????? OLED_Init();

????? printf("Start \n");

????? delay_ms(1000);

?????

OLED_Clear();//顯示電機轉速

OLED_ShowChinese(0,0,0,16,1);

OLED_ShowChinese(16,0,1,16,1);

OLED_ShowChinese(32,0,2,16,1);

OLED_ShowChinese(48,0,3,16,1);

OLED_ShowChar(64,0,':',16,1);

? while (1)

? {key = Key_GetData();

?????????? if(key)

???????????????? key_state++;

?????????? if(key_state%4==1)

?????????? {Motor_SetSpeed(60);

OLED_ShowNum(56,24,1,1,16,1);

?????????? }if(key_state%4==2)

?????????? {Motor_SetSpeed(80);

OLED_ShowNum(56,24,2,1,16,1);}

?????????? if(key_state%4==3)

?????????? {Motor_SetSpeed(100);

OLED_ShowNum(56,24,3,1,16,1);}

?????????? if(key_state%4==0)

?????????? {Motor_SetSpeed(0); OLED_ShowNum(56,24,0,1,16,1);?????? //0}}}

Motor.c

#include "Motor.h"

void MOTOR_Init(void)

{

????? GPIO_InitTypeDef GPIO_InitStructure;

????? RCC_APB2PeriphClockCmd(MOTOR_CLK, ENABLE ); //配置時鐘

????? GPIO_InitStructure.GPIO_Pin = MOTOR_AIN1_GPIO_PIN;

????? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

????? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

????? GPIO_Init(MOTOR_AIN1_GPIO_PORT,&GPIO_InitStructure);

????? GPIO_InitStructure.GPIO_Pin = MOTOR_AIN2_GPIO_PIN;

????? GPIO_Init(MOTOR_AIN2_GPIO_PORT,&GPIO_InitStructure);

????? PWM_Init();

}

void PWM_Init(void)

{

????? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

????? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);??? //開啟GPIOA的時鐘

/*GPIO初始化*/

????? GPIO_InitTypeDef GPIO_InitStructure;

????? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

????? GPIO_InitStructure.GPIO_Pin = MOTOR_PWMA_GPIO_PIN;

????? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

????? GPIO_Init(MOTOR_PWMA_GPIO_PORT, &GPIO_InitStructure);??????????? ???????????????? //PA1PA2引腳初始化為推挽輸出

????? TIM_InternalClockConfig(TIM2);//配置實際單元

????? TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

????? TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;????????? //時鐘分頻

????? TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;?????????? //計數模式

????? TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;?????????????? //自動重裝ARR????? 分辨率

????? TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;????? //預分頻PSC???

????? TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;

????? TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

????? TIM_OCInitTypeDef TIM_OCInitStructure;

????? TIM_OCStructInit(&TIM_OCInitStructure);??????? //給結構體賦予初值

????? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

????? TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

????? TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

????? TIM_OCInitStructure.TIM_Pulse = 0;?????????????? //CCR

????? TIM_OC3Init(TIM2,&TIM_OCInitStructure);

????? TIM_Cmd(TIM2,ENABLE);}?

void PWM_SetCompare3(uint16_t compare)

{TIM_SetCompare3(TIM2,compare);

}void Motor_SetSpeed(int8_t Speed)

{if(Speed >= 0)

????? {

????? GPIO_SetBits(MOTOR_AIN1_GPIO_PORT,MOTOR_AIN1_GPIO_PIN);

????? GPIO_ResetBits(MOTOR_AIN2_GPIO_PORT,MOTOR_AIN2_GPIO_PIN);

????? PWM_SetCompare3(Speed);

????? }else{

????? GPIO_ResetBits(MOTOR_AIN1_GPIO_PORT,MOTOR_AIN1_GPIO_PIN);

????? GPIO_SetBits(MOTOR_AIN2_GPIO_PORT,MOTOR_AIN2_GPIO_PIN);

?????????? PWM_SetCompare3(-Speed);}}

Motor.h

#ifndef __MOTOR_H

#define??? __MOTOR_H

#include "stm32f10x.h"

#include "delay.h"

#include "sys.h"

/***************根據自己需求更改****************/

// TB6612FNG電機驅動模塊 GPIO宏定義

#define??? MOTOR_CLK??????????? ????? ?????????? RCC_APB2Periph_GPIOA

#define MOTOR_AIN1_GPIO_PIN ?????????????????? GPIO_Pin_0

#define MOTOR_AIN2_GPIO_PIN ?????????????????? GPIO_Pin_1

#define MOTOR_AIN1_GPIO_PORT ??????????????????? GPIOA

#define MOTOR_AIN2_GPIO_PORT ??????????????????? GPIOA

#define MOTOR_PWMA_GPIO_PIN ??????????????????? GPIO_Pin_2

#define MOTOR_PWMA_GPIO_PORT ???????????????????? GPIOA

/*********************END**********************/

void MOTOR_Init(void);

void PWM_Init(void);

void Motor_SetSpeed(int8_t Speed);

#endif

代碼放在下述連接里面,通過網盤分享的文件:TB6612電機調速資料

鏈接: https://pan.baidu.com/s/1D_d506c3pwiRzHCaSq2_Aw?pwd=HHRR 提取碼: HHRR

--來自百度網盤超級會員v5的分享

此外還有一種電機驅動,介紹如下

微型雙路直流電機驅動基于TB6612FNG驅動IC設計,采用特殊邏輯控制方式,僅需4根管腳即可實現雙路電機控制,相比純芯片而言,減少了兩個IO管腳,為Arduino等控制器節約了寶貴的IO資源,可以應用在更多領域中。
TB6612FNG是一塊雙路全橋驅動芯片,單通道最大連續驅動電流可達1.2A,峰值2A/3.2A(連續脈沖/單脈沖),可驅動一些微型直流電機。控制邏輯與L298N類似,代碼上可直接兼容DFRobot L298N電機驅動。標準XH2.54排針可直插面包板,無論是DIY制作,還是新產品開發,都是非常理想的一個選擇!

產品參數

  • 邏輯部分輸入電壓VCC3.3~5V
  • 驅動部分輸入電壓VM2.5~12V
  • 驅動電機路數:2通道
  • 單通道最大連續驅動電流:1.2A
  • 啟動峰值:2A/3.2A(連續脈沖/單脈沖)
  • 接口方式:2.54mm間距排針

模塊尺寸:20 × 19.5(mm)

細節說明

電機接口:M1M2 可接入兩個電機,其中標注了“+”“-”表示兩個電機的接線方向。

指示燈:正面指示燈:電源指示燈

電源部分

VCC:邏輯電源輸入,輸入電壓為5V;

VM:電機驅動電源輸入,輸入電壓范圍建議為3.712V;

GND:邏輯電源和電機驅動電源的公共地。

電機控制端口

PWM1,PWM2:分別為兩個電機控制的使能端(可使用PWM調速)

DIR1,DIR2:正反轉控制信號輸入端。比如,DIR1=1M1電機正轉; DIR1=0M1電機反轉。

引腳說明

管腳映射

標號

名稱

功能描述

1

DIR1

電機M1的方向控制引腳

3

PWM2

電機M2的速度控制引腳

4

DIR2

電機M2的方向控制引腳

5

GND

邏輯部分電源負極

6

VCC

邏輯部分電源正極

7

M1+

M1路電機輸出1

8

M1-

M1路電機輸出2

9

M2+

M2路電機輸出1

10

M2-

M2路電機輸出2

11

GND

電機電源負極

12

VM(<12V)

電機電源正極

模塊尺寸:20 × 19.5(m\

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

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

相關文章

【操作系統】死鎖

1. 定義 死鎖是指兩個或多個進程&#xff08;或線程&#xff09;在執行過程中&#xff0c;因爭奪資源而造成的一種僵局&#xff0c;每個進程都無限期地等待其他進程釋放它們所持有的資源。在這種情況下&#xff0c;沒有任何進程能夠繼續執行&#xff0c;除非有外部干預。 2. …

C++入門?關于類的一些特殊知識點

涉及的關于類中的默認成員函數的知識點可以看我的這篇博客哦~ C入門必須知道的知識?類的默認成員函數&#xff0c;一文講透運用 目錄 初始化列表 類型轉換 static成員 友元 內部類 匿名對象 對象拷貝時的一些編譯器的優化 初始化列表 我們知道類中的構造函數的任務是完…

只用Prettier進行格式化項目

1.下載Prettier插件&#xff0c;禁用ESlint 2.在項目根目錄新建.prettierrc文件 {"singleQuote": true,"jsxSingleQuote": true,"printWidth": 100,"trailingComma": "none","tabWidth": 2,"semi": f…

XXL-TOOL v1.4.0 發布 | Java工具類庫

Release Notes 1、【新增】JsonRpc模塊&#xff1a;一個輕量級、跨語言遠程過程調用實現&#xff0c;基于json、http實現&#xff08;從XXL-JOB底層通訊組件提煉抽象&#xff09;。2、【新增】Concurrent模塊&#xff1a;一系列并發編程工具&#xff0c;具備良好的線程安全、高…

基于LVGL的登錄界面設計

目錄 一、演示 二、前言 三、部件知識 3.1 圖片按鈕部件 3.1.1 圖片按鈕部件的組成 3.1.2 圖片的來源 3.1.3 添加/清除的狀態 3.1.4 圖片按鈕部件 API 函數 3.2 鍵盤部件(lv_keyboard) 3.2.1 鍵盤部件的組成 3.2.2 鍵盤部件的相關知識 3.2.2.1 鍵盤部件模式 3.…

S3 跨賬戶復制:增強云中的災難恢復計劃

您準備好提升您的云和 DevOps 技能了嗎&#xff1f; &#x1f425;《云原生devops》專門為您打造&#xff0c;我們精心打造的 30 篇文章庫&#xff0c;這些文章涵蓋了 Azure、AWS 和 DevOps 方法論的眾多重要主題。無論您是希望精進專業知識的資深專業人士&#xff0c;還是渴望…

線程與進程深度解析:從fork行為到生產者-消費者模型

線程與進程深度解析&#xff1a;從fork行為到生產者-消費者模型 一、多線程環境下的fork行為與線程安全 1. 多線程程序中fork的特殊性 核心問題&#xff1a;fork后子進程的線程模型 當多線程程序中的某個線程調用fork時&#xff1a; 子進程僅包含調用fork的線程&#xff1…

Circular Plot系列(五): circle plot展示單細胞互作

這是我們circle系列的最后一節&#xff0c;我想常見的弦圖是繞不開的&#xff0c;所以最后從前面介紹的circle plot思路&#xff0c;做一遍弦圖。其實前面的內容如果消化了&#xff0c;plot互作弦圖也就不成什么問題了。 效果如下&#xff1a; #cellchat提取互作結果&#xff…

(11)Vue-Router路由的詳細使用

本系列教程目錄&#xff1a;Vue3Element Plus全套學習筆記-目錄大綱 文章目錄 第2章 路由 Vue-Router2.1 Vue路由快速入門2.1.1 創建項目2.1.2 路由運行流程 2.2 傳遞參數-useRoute2.2.1 路徑參數-params1&#xff09;普通傳參2&#xff09;傳遞多個參數3&#xff09;對象方式傳…

react + antd 實現后臺管理系統

文章目錄 完整路由搭建Layout 和 Aside組件引入 AntdAside組件實現 項目效果圖 項目完整代碼地址 https://gitee.com/lyh1999/react-back-management 項目完整代碼地址 react依賴安裝 最好采用yarn 安裝 react-router 安裝依賴 配置路由 history模式 / // src/router/…

基于AWS Marketplace的快速解決方案:從選型到部署實戰

1. 引言&#xff1a;為什么選擇AWS Marketplace&#xff1f; 在數字化轉型的背景下&#xff0c;企業需要快速獲取成熟的軟件工具和服務以降低開發成本。AWS Marketplace 作為亞馬遜云科技的官方應用商店&#xff0c;提供超過萬款預配置的第三方和AWS原生解決方案&#xff0c;涵…

2021年第十二屆藍橋杯省賽B組C++題解

2021年第十二屆藍橋杯省賽B組C題解 關鍵詞&#xff1a;藍橋杯、省賽、題解、C、算法 一、個人見解 第十二屆藍橋杯省賽B組共有10道題目&#xff0c;包含5道填空題&#xff08;T1-T5&#xff09;和5道編程題&#xff08;T6-T10&#xff09;&#xff0c;總分150分。比賽時長4小…

日語學習-日語知識點小記-進階-JLPT-N1階段(1):語法單詞

日語學習-日語知識點小記-進階-JLPT-N1階段&#xff08;1&#xff09;&#xff1a;語法單詞 1、前言&#xff08;1&#xff09;情況說明&#xff08;2&#xff09;工程師的信仰&#xff08;3&#xff09;高級語法N1語法和難點一、N1語法學習內容&#xff08;高級語法&#xff…

Python|Pyppeteer實現自動登錄小紅書(32)

前言 本文是該專欄的第32篇,結合優質項目案例持續分享Pyppeteer的干貨知識,記得關注。 本文中,筆者以小紅書為例,基于Pyppeteer實現自動登錄“小紅書”。 需要注意的是,對Pyppeteer不太熟悉的同學,可往前翻閱本專欄前面介紹的Pyppeteer知識點,本專欄將帶你了解并熟練使…

【翻譯、轉載】【轉載】LLM 的函數調用與 MCP

來源&#xff1a; https://www.dailydoseofds.com/p/function-calling-mcp-for-llms/ 【代碼以圖像顯示的是原文內容&#xff0c;以代碼形式顯示的是大模型給出的參考】 LLM 的函數調用與 MCP 在 MCP 變得像現在這樣主流&#xff08;或流行&#xff09;之前&#xff0c;大多…

【QT】QT中http協議和json數據的解析-http獲取天氣預報

QT中http協議和json數據的解析 1.http協議的原理2.QT中http協議的通信流程2.1 方法步驟 3.使用http協議&#xff08;通過http下載圖片和獲取天氣預報信息&#xff09;3.1 http下載網絡上的圖片(下載小文件)3.1.1 示例代碼3.1.2 現象 3.2 獲取網絡上天氣預報3.2.1 免費的天氣預報…

hot100:鏈表倒數k個節點- 力扣(LeetCode)

題目&#xff1a; 實現一種算法&#xff0c;找出單向鏈表中倒數第 k 個節點。返回該鏈表中倒數第k個節點。 示例一&#xff1a; 輸入&#xff1a;{1,2,3,4,5},2 返回值&#xff1a;{4,5} 說明&#xff1a;返回倒數第2個節點4&#xff0c;系統會打印后面所有的節點來比較。 …

Spring AI 實戰:第十一章、Spring AI Agent之知行合一

引言:智能體的知行辯證法 “知為行之始,行為知之成”,王陽明的哲學智慧在AI時代煥發光彩。智能體(LLM Agent)的進化之路,正是"認知-決策-執行"這一閉環的完美詮釋: 知明理:融合大語言模型的推理能力與知識圖譜的結構化認知行致用:基于ReAct模式的動態工具調…

365打卡第R6周: LSTM實現糖尿病探索與預測

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 &#x1f3e1; 我的環境&#xff1a; 語言環境&#xff1a;Python3.10 編譯器&#xff1a;Jupyter Lab 深度學習環境&#xff1a;torch2.5.1 torchvision0…

W-TinyLFU緩存驅逐算法解析

文章目錄 1. 背景與概述1.1 什么是緩存驅逐算法1.2 W-TinyLFU 的定義與價值 2. 核心思想與設計理念2.1 時間局部性與頻率局部性的結合2.2 高效的頻率統計2.3 窗口機制的引入 3. 架構設計與組件3.1 整體架構3.2 窗口緩存&#xff08;Window Cache&#xff09;3.3 主緩存&#xf…