加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

第三篇-V1.5 TB6612電機(jī)pwm控制STM32智能小車 江科大筆記

08/19 09:09
4329
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關(guān)方案
  • 方案介紹
    • 系統(tǒng)軟件設(shè)計
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

第三篇-V1.5 TB6612電機(jī)pwm控制STM32智能小車 江科大筆記 江科大同款STM32F103C8T6單片機(jī) 嵌入式實戰(zhàn)項目入門教程 STM32電機(jī)控制教程嵌入式教程 循跡避障跟隨遙控

當(dāng)前筆記版本1.5
現(xiàn)在有兩個版本小車
V1.5.0


STM32智能小車V3-STM32入門教程-openmv與STM32循跡小車-stm32f103c8t6-電賽 嵌入式學(xué)習(xí) PID控制算法 編碼器電機(jī) 跟隨

V3.3.0-STM32智能小車
視頻
視頻鏈接點擊直達(dá)
介紹:
V1.5.0:庫函數(shù)開發(fā)。功能:循跡、避障、跟隨、遙控、電池電壓顯示等。
V3:HAL庫開發(fā)、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制、電磁循跡等。

系統(tǒng)軟件設(shè)計

點亮小燈

查看原理圖

查閱原理圖,小燈接在PC13上下面驅(qū)動PC13
在這里插入圖片描述

編寫驅(qū)動

在這里插入圖片描述

思考題:如果同時驅(qū)動PC13與PC14,應(yīng)該如何編寫?(答案:應(yīng)該增加下圖代碼)
在這里插入圖片描述
LED_Init()函數(shù)的代碼

void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PC端口時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //PC13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化
GPIOC.13
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC.13輸出高
}

LED.h 部分宏定義

#define LED PCout(13)// PC13

測試

編譯下載(如果沒有運(yùn)行,需要按復(fù)位 運(yùn)行)

電機(jī)驅(qū)動

由TB6612介紹得,通過控制AO和AO2高低電平可以控制AIN1和AIN2輸出。

GPIO 高低電平控制AIN和BIN

  1. 查閱原理圖AIN1、AIN2、BIN1、BIN2依次接在單片機(jī)的PB13、PB12、PB1、PB0
    在這里插入圖片描述
  2. 原理同GPIO輸出高低電平見第二節(jié)
    TB6612 GPIO驅(qū)動函數(shù)代碼
//驅(qū)動6612 的AIN1 AIN2 BIN1 BIN2
// AIN1 PB13
// AIN2 PB12
// BIN1 PB1
// BIN2 PB0
void TB6612_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時鐘
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13
|GPIO_Pin_12|GPIO_Pin_0|GPIO_Pin_1; //PB0 OB1 PB12 PB13端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化
GPIO_SetBits(GPIOB,GPIO_Pin_13 |GPIO_Pin_12|GPIO_Pin_0|GPIO_Pin_1);
//PB0 OB1 PB12 PB1 輸出高
}

相關(guān)宏定義

#define AIN1 PBout(13)// PB13
#define AIN2 PBout(12)// PB12
#define BIN1 PBout(1)// PB1
#define BIN2 PBout(0)// PB0

PWM控制PWMA和PWMB

PWM輸出實驗 的 timer 文件移植到我們前面點燈的工程中,更改驅(qū)動文件

  1. 查看原理圖 PWMA 和PWMB依次連接PA11和PA8
  2. 查看 參考手冊 關(guān)于定時器復(fù)用功能重映射的介紹(中文參考手冊第119頁)
    在這里插入圖片描述
  3. 初始化外設(shè)
    配置對應(yīng)引腳功能
    初始化TIM1
    初始化TIM1 相應(yīng)通道的 PWM模式
    使能
    注意輸出使能 高級定時器必須使用:TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx,
    FunctionalState NewState);
//TIM1 PWM部分初始化
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預(yù)分頻數(shù)
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能對應(yīng)定時器
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定時器1時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,
ENABLE); //使能GPIO外設(shè)和AFIO復(fù)用功能模塊時鐘
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //Timer3部分重映射
TIM3_CH2->PB5
//配置對應(yīng)引腳功能
//設(shè)置該引腳為復(fù)用輸出功能,輸出TIM1 CH1 和CH4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1 TIM_CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
//初始化TIM1
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重
裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)
分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)
模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據(jù)
TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
//初始化TIM1 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬
度調(diào)制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使
能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸
出比較極性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3
OC2
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預(yù)裝
載寄存器
//初始化TIM1 Channel4 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬
度調(diào)制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使
能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸
出比較極性高
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3
OC2
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預(yù)裝
載寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主輸出使能,高級定時器必須開啟這
個
}

調(diào)用初始化函數(shù)、改變占空比。

TIM1_PWM_Init(1999,359);
//TIM1掛在APB2為72M ,故計算 72 000 000 /(359+1)/(1999+1) = 100 Hz,
//故設(shè)置了頻率為100 Hz、自動重裝載值 1999
TIM_SetCompare1(TIM1,100); //設(shè)置 TIM1 通道1 捕獲/比較寄存器值 為 1000 可以
計算出占空比
//PA8 PWMB
TIM_SetCompare4(TIM1,1900); //設(shè)置
//PA11 PWMA

通過軟件仿真

邏輯分析儀觀察波形輸出、顯示PWM波形
設(shè)置好仿真環(huán)境
在這里插入圖片描述
打開邏輯分析儀

在這里插入圖片描述
添加要觀察的引腳
在這里插入圖片描述
跳到設(shè)置對應(yīng)程序位置,打開仿真
在這里插入圖片描述
打開實時更新選項
在這里插入圖片描述
調(diào)節(jié)觀察分析儀
在這里插入圖片描述
產(chǎn)生的如圖方波就是一種PWM波
在這里插入圖片描述
在這里插入圖片描述
那么在程序哪里設(shè)置的這些參數(shù)那
時鐘預(yù)分頻數(shù) 決定了PWM 頻率和周期

TIM1_PWM_Init(1999,359);
//TIM1掛在APB2為72M ,故計算 72 000 000 /(359+1)/(1999+1) = 100 Hz,

那么誰調(diào)節(jié)占空比那?
在這里插入圖片描述

  1. 非常好理解、定時器的計數(shù)器向上計數(shù)就是越來越大。
  2. PWM 模式我們可以看手冊
    在這里插入圖片描述
    3.這里的TIM_OCPolarity_High 就是把有效電平設(shè)置為高
    舉個栗子:如果我們設(shè)置上面的示例參數(shù),工作過程應(yīng)該是怎么的吶?
    在這里插入圖片描述
    電機(jī)控制通過AIN1、AIN2、BIN1、BIN2控制電機(jī)正反轉(zhuǎn),通過PWMA、PWMB控制電機(jī)轉(zhuǎn)速
AIN1 = 1;
AIN2 = 0;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //設(shè)置 A
TIM_SetCompare1(TIM1,1500); //設(shè)置B

讓小車跑一跑吧

小車電機(jī)線正確接法
在這里插入圖片描述
錯誤接法
在這里插入圖片描述
小車直行

void Forward(void)
{
AIN1 = 1;
AIN2 = 0;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //設(shè)置 A
TIM_SetCompare1(TIM1,1500); //設(shè)置B
}

小車后退

void Backward(void)
{
AIN1 = 0;
AIN2 = 1;
BIN1 = 0;
BIN2 = 1;
TIM_SetCompare4(TIM1,1500); //設(shè)置 A
TIM_SetCompare1(TIM1,1500); //設(shè)置B
}

小車左轉(zhuǎn)

void Leftward(void)
{
AIN1 = 0;
AIN2 = 1;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //設(shè)置 A
TIM_SetCompare1(TIM1,1500); //設(shè)置B
}

小車右轉(zhuǎn)

void Rightward(void)
{
AIN1 = 1;
AIN2 = 0;
BIN1 = 0;
BIN2 = 1;
TIM_SetCompare4(TIM1,1500); //設(shè)置 A
TIM_SetCompare1(TIM1,1500); //設(shè)置B
}

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
570BAB001614DGR 1 Silicon Laboratories Inc LVDS Output Clock Oscillator, 300MHz Nom, SMD, 8 PIN

ECAD模型

下載ECAD模型
$396.75 查看
NX2012SA-32.768K-STD-MUB-1 1 Nihon Dempa Kogyo Co Ltd Parallel - Fundamental Quartz Crystal, 0.032768MHz Nom, ROHS COMPLIANT PACKAGE-2
$7.18 查看
NC7SZ11P6X 1 Fairchild Semiconductor Corporation AND Gate, LVC/LCX/Z Series, 1-Func, 3-Input, CMOS, PDSO6, 1.25 MM, EIAJ, SC-88, SC-70, 6 PIN
$0.37 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜