目錄
前言:
一、硬件準備與接線
1.1 硬件清單
1.2 接線
二、 SG90舵機簡介
1.1 外觀
?1.2 基本參數
1.3 引腳說明?
1.4 控制原理
1.5 特點
1.6 常見問題
三、 單片機簡介
四、 程序設計?
4.1 定時器配置
4.2 角度控制函數
4.3 主函數調用
五、 總結
前言:
STM32F103C8T6?是一款性價比極高的ARM Cortex-M3內核微控制器,廣泛應用于嵌入式開發。SG90舵機?則是小型舵機的代表,常用于機器人、智能家居等場景。本文將通過硬件連接、PWM信號配置、代碼實現等步驟,詳細講解如何用STM32F103C8T6控制SG90舵機。
視頻講解鏈接:
STM32之SG90舵機教學(附源碼)
一、硬件準備與接線
1.1 硬件清單
器件 | 數量 | 備注 |
---|---|---|
STM32F103C8T6最小系統板 | 1 | 核心控制器 |
SG90舵機 | 1 | 工作電壓4.8-6V,信號線需PWM |
5V電源模塊 | 1 | 獨立供電,避免板載電流不足 |
杜邦線 | 若干 | 連接電路 |
1.2 接線
SG90舵機?????????? STM32F103C8T6??????? 外部電源
棕色線(GND)? →??? GND引腳??????????? →? GND
紅色線(VCC)? →? ? 連外部5V? ? ? ? ? ? ?→? 5V
橙色線(信號)???→??? PB0(TIM3_CH3)
注意:若需驅動多個舵機,建議使用獨立電源供電,避免STM32板載電源過載。
二、 SG90舵機簡介
1.1 外觀
?1.2 基本參數
參數 | 數值 |
---|---|
工作電壓 | 4.8V - 6V(典型5V) |
電流消耗 | 100mA(空閑),250mA(運行) |
扭矩 | 1.2kg·cm(4.8V),1.6kg·cm(6V) |
轉速 | 0.12秒/60°(4.8V),0.10秒/60°(6V) |
重量 | 9克 |
尺寸 | 22.2mm × 11.8mm × 31mm |
轉動角度 | 180°(部分型號支持360°) |
齒輪材質 | 塑料(部分型號為金屬齒輪) |
接口類型 | 3針(信號、電源、地) |
1.3 引腳說明?
SG90舵機通常有3根線
棕色線(GND):接地。
紅色線(VCC):接電源(4.8V-6V)。
橙色線(信號線):接收PWM信號控制角度。
1.4 控制原理
PWM信號控制:
-
信號周期:20ms(50Hz)。
-
脈沖寬度:0.5ms - 2.5ms,對應角度0° - 180°。
1.5 特點
優點:
-
體積小、重量輕:適合空間受限的項目。
-
價格低廉:成本低,適合批量使用。
-
易于控制:標準PWM信號接口,兼容性強。
缺點:
-
扭矩較小:僅適合輕負載場景。
-
塑料齒輪易磨損:長時間高負載工作可能導致損壞。
1.6 常見問題
1)舵機抖動或不轉動:
-
檢查電源電壓是否足夠。
-
檢查PWM信號是否正確。
2)?舵機發熱嚴重:
-
檢查是否超負荷運行。
-
確保轉動范圍內無機械卡阻。
3)?角度不準確:
-
校準PWM信號脈沖寬度。
-
檢查舵機齒輪是否磨損。
三、 單片機簡介
STM32F103C8T6最小系統板:
本文使用的開發板為STM32F103C8T6最小系統板,SG90舵機使用到的引腳為PB0引腳。?
四、 程序設計?
4.1 定時器配置
使用?TIM3的通道3(PB0)生成PWM,步驟如下:
1)?時鐘配置:
-
系統時鐘設為72MHz(默認配置)。
-
APB1總線預分頻系數為2。
-
TIM3時鐘源為APB1總線(36*2=72MHz)。
2)?定時器參數計算:
-
PWM頻率:50Hz → 周期20ms 。
-
預分頻值(PSC):72MHz / (719 + 1) = 1MHz → 每個計數周期10μs。
-
自動重裝載值(ARR):20,000μs / 10μs = 2000 →?
ARR = 1999
(從0計數)。
3)?脈沖寬度計算(以90°為例):
-
1.5ms = 1500μs →?占空比?= 1500 / 20000 = 7.5%。
-
比較寄存器(CCR):2000 * 7.5% = 150 →?
CCR = 150 - 1 = 149
。
定時器初始化代碼如下:
void SG90_PWM_Init(u16 arr, u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;// 使能定時器TIM3時鐘,注意TIM3時鐘為APB1,而非APB2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 使能PWM輸出GPIO口時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 定時器TIM3的PWM輸出通道3,TIM3_CH3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOTIM_TimeBaseStructure.TIM_Period = arr;//自動重裝值TIM_TimeBaseStructure.TIM_Prescaler =psc; //時鐘預分頻數TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計數模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3//初始化TIM3_CH3的PWM模式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC3Init(TIM3, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能通道的預裝載寄存器TIM_ARRPreloadConfig(TIM3, ENABLE); //使能重裝寄存器TIM_Cmd(TIM3, ENABLE);//使能定時器TIM3,準備工作
}
初始化參數如下:?
SG90_PWM_Init(1999,719); //初始化舵機
4.2 角度控制函數
將角度轉換為對應的占空比,角度最大為180° 。
void SG90_Set_Angle(uint8_t angle)
{if (angle > 180)angle = 180;uint16_t duty = 10 * (angle + 45) / 9; // 角度轉化為占空比TIM_SetCompare3(TIM3, duty); // 設置占空比
}
4.3 主函數調用
SG90_Set_Angle(0); //占空比2.5%,0度
delay_ms(1000);
SG90_Set_Angle(90); //占空比7.5%,90度
delay_ms(1000);
五、 總結
????????通過STM32F103C8T6的定時器PWM功能,可精準控制SG90舵機角度。關鍵在于正確配置定時器的預分頻值和自動重裝載值,并合理映射角度到脈寬。本方案成本低、可靠性高,適合機器人、智能家居等應用場景。