功能介紹放開頭, 使用便捷無需愁。
這是全網(wǎng)最詳細、性價比最高的STM32實戰(zhàn)項目入門教程,通過合理的硬件設計和詳細的視頻筆記介紹,硬件使用STM32F103主控資料多方便學習,通過3萬字筆記、12多個小時視頻、20多章節(jié)代碼手把手教會你如何開發(fā)和調(diào)試。讓你更快掌握嵌入式系統(tǒng)開發(fā)。
V1.5.0-STM32智能小車
V1.5.0:庫函數(shù)開發(fā)。功能:循跡、避障、跟隨、遙控、電池電壓顯示等。
視頻合集鏈接推薦觀看
[https://www.bilibili.com/video/BV1SY411L7rJ/?spm_id_from=333.337.search-card.all.click]
**V3.3.0-STM32智能小車 **
V3:HAL庫開發(fā)、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制、電磁循跡、RTOS等功能。
視頻合集鏈接推薦觀看
[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]
系統(tǒng)軟件設計
點亮小燈
查看原理圖
查閱原理圖,小燈接在PC13上下面驅(qū)動PC13
編寫驅(qū)動
思考題:如果同時驅(qū)動PC13與PC14,應該如何編寫?(答案:應該增加下圖代碼)
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ù)初始化
GPIOC.13
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC.13輸出高
}
LED.h 部分宏定義
#define LED PCout(13)// PC13
測試
編譯下載(如果沒有運行,需要按復位 運行)
電機驅(qū)動
由TB6612介紹得,通過控制AO和AO2高低電平可以控制AIN1和AIN2輸出。
GPIO 高低電平控制AIN和BIN
查閱原理圖AIN1、AIN2、BIN1、BIN2依次接在單片機的PB13、PB12、PB1、PB0
原理同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ù)初始化
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ū)動文件
查看原理圖 PWMA 和PWMB依次連接PA11和PA8
查看 參考手冊 關(guān)于定時器復用功能重映射的介紹(中文參考手冊第119頁)
初始化外設
配置對應引腳功能
初始化TIM1
初始化TIM1 相應通道的 PWM模式
使能
注意輸出使能 高級定時器必須使用:TIM_CtrlPWMOutputs(TIM_TypeDef TIMx, *
FunctionalState NewState);
//TIM1 PWM部分初始化
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數(shù)
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能對應定時器
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定時器1時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,
ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //Timer3部分重映射
TIM3_CH2- >PB5
//配置對應引腳功能
//設置該引腳為復用輸出功能,輸出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; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
//初始化TIM1
TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重
裝載寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數(shù)的預
分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割: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ù)初始化外設TIM3
OC2
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝
載寄存器
//初始化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ù)初始化外設TIM3
OC2
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的預裝
載寄存器
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,
//故設置了頻率為100 Hz、自動重裝載值 1999
TIM_SetCompare1(TIM1,100); //設置 TIM1 通道1 捕獲/比較寄存器值 為 1000 可以
計算出占空比
//PA8 PWMB
TIM_SetCompare4(TIM1,1900); //設置
//PA11 PWMA
通過軟件仿真
邏輯分析儀觀察波形輸出、顯示PWM波形
設置好仿真環(huán)境
打開邏輯分析儀
添加要觀察的引腳
跳到設置對應程序位置,打開仿真
打開實時更新選項
調(diào)節(jié)觀察分析儀
產(chǎn)生的如圖方波就是一種PWM波
那么在程序哪里設置的這些參數(shù)那
時鐘預分頻數(shù) 決定了PWM 頻率和周期
TIM1_PWM_Init(1999,359);
//TIM1掛在APB2為72M ,故計算 72 000 000 /(359+1)/(1999+1) = 100 Hz,
那么誰調(diào)節(jié)占空比那?
非常好理解、定時器的計數(shù)器向上計數(shù)就是越來越大。
PWM 模式我們可以看手冊
3.這里的TIM_OCPolarity_High 就是把有效電平設置為高
舉個栗子:如果我們設置上面的示例參數(shù),工作過程應該是怎么的吶?
電機控制通過AIN1、AIN2、BIN1、BIN2控制電機正反轉(zhuǎn),通過PWMA、PWMB控制電機轉(zhuǎn)速
AIN1 = 1;
AIN2 = 0;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //設置 A
TIM_SetCompare1(TIM1,1500); //設置B
讓小車跑一跑吧
小車電機線正確接法
錯誤接法
小車直行
void Forward(void)
{
AIN1 = 1;
AIN2 = 0;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //設置 A
TIM_SetCompare1(TIM1,1500); //設置B
}
小車后退
void Backward(void)
{
AIN1 = 0;
AIN2 = 1;
BIN1 = 0;
BIN2 = 1;
TIM_SetCompare4(TIM1,1500); //設置 A
TIM_SetCompare1(TIM1,1500); //設置B
}
小車左轉(zhuǎn)
void Leftward(void)
{
AIN1 = 0;
AIN2 = 1;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //設置 A
TIM_SetCompare1(TIM1,1500); //設置B
}
小車右轉(zhuǎn)
void Rightward(void)
{
AIN1 = 1;
AIN2 = 0;
BIN1 = 0;
BIN2 = 1;
TIM_SetCompare4(TIM1,1500); //設置 A
TIM_SetCompare1(TIM1,1500); //設置B
}
上一篇:STM32F103的貼片機控制系統(tǒng)的設計
下一篇:都是32位MCU,ESP32、GD32、STM32有什么區(qū)別
推薦閱讀最新更新時間:2025-06-07 23:44





設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 臺積電計劃兩年后停止氮化鎵晶圓生產(chǎn),納微轉(zhuǎn)投力積電
- 研華新品搭載最新 AMD Ryzen 嵌入式 8000 系列處理器,驅(qū)動AI 智能新篇章
- 美國EDA恢復供應?
- 從追趕到超越:的盧深視的“AI +三維機器視覺“破局之戰(zhàn)
- 常用的音頻處理器有哪些應用場景
- 研究顯示2035年全球酒店服務機器人市場規(guī)模有望達125億美元
- i9-14900HX對比一款換湯不換藥的馬甲老U R9-8945HX
- 納祥科技2W 24位數(shù)字功放NX4920,可用于AI語音播報、WIFI播放器
- 常用解調(diào)器的定義和工作原理
- 從性能與網(wǎng)絡傳輸出發(fā),講講鐵威馬MAX系列為什么一騎絕塵
- 三星Note9外媒提前上手 8+512GB彪悍
- 三星手機出現(xiàn)奇怪bug:隨機給聯(lián)系人發(fā)照片
- 歐盟警告:美進口汽車關(guān)稅將引發(fā)全球3000億美元報復清單
- 小米估值縮水讓利發(fā)行 港股獨角獸高估值光環(huán)失效?
- 中國移動宣布將于明年2月采購5G智能手機
- 高云半導體推出FPGA離線燒錄器及數(shù)據(jù)流文件加密工具
- 測試“發(fā)現(xiàn)”號ROV深海機器人
- 冬殘奧會閉幕式上新松機器人再現(xiàn)“智造”之美
- 代表委員呼吁:做大做強集成電路產(chǎn)業(yè)正當其時
- 大族激光擬轉(zhuǎn)讓明信測試11%股權(quán)