返回
如何通过STM32F103RCT6芯片控制SG90舵机,实现正反转角度控制
后端
2024-02-09 05:39:22
前言
SG90舵机是一种小巧、轻便、性价比高的微型舵机,它被广泛应用于机器人、智能家居、航模等领域。该舵机可以通过脉宽调制(PWM)信号来控制其转动角度。STM32F103RCT6芯片是一款功能强大的微控制器,它具有丰富的资源和外设,非常适合用于控制舵机。本文将介绍如何使用STM32F103RCT6芯片控制SG90舵机,实现正反转角度控制。
## 硬件准备
- STM32F103RCT6开发板
- SG90舵机
- 杜邦线
- 面包板
- 电源
## 软件准备
- Keil MDK-ARM
- STM32CubeMX
## 连接电路
1. 将STM32F103RCT6开发板的5V电源引脚与面包板的正极连接。
2. 将STM32F103RCT6开发板的地线引脚与面包板的负极连接。
3. 将SG90舵机的红线与面包板的正极连接。
4. 将SG90舵机的黑线与面包板的负极连接。
5. 将SG90舵机的黄线与STM32F103RCT6开发板的TIM2_CH1引脚连接。
## 固件开发
1. 打开Keil MDK-ARM软件,新建一个工程。
2. 在工程中添加STM32F103RCT6芯片。
3. 配置STM32F103RCT6芯片的时钟系统。
4. 配置STM32F103RCT6芯片的TIM2定时器。
5. 编写控制舵机的程序。
## 程序代码
```c
#include "stm32f10x.h"
/*----------------------------------------------------------------------------
* 函数: main
* : 主函数
*----------------------------------------------------------------------------*/
int main(void)
{
// 初始化时钟系统
SystemInit();
// 初始化TIM2定时器
TIM2_Init();
// 初始化舵机
Servo_Init();
// 等待1秒
Delay(1000);
// 让舵机正转30度
Servo_SetAngle(30);
// 等待1秒
Delay(1000);
// 让舵机反转30度
Servo_SetAngle(-30);
// 等待1秒
Delay(1000);
// 让舵机停止转动
Servo_SetAngle(0);
// 死循环
while (1)
{
}
}
/*----------------------------------------------------------------------------
* 函数: TIM2_Init
* : 初始化TIM2定时器
*----------------------------------------------------------------------------*/
void TIM2_Init(void)
{
// 使能TIM2时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 设置TIM2定时器为基本定时器模式
TIM2->CR1 &= ~TIM_CR1_DIR;
// 设置TIM2定时器的时钟预分频系数
TIM2->PSC = 72 - 1;
// 设置TIM2定时器的重装载值
TIM2->ARR = 1000 - 1;
// 使能TIM2定时器的输出比较中断
TIM2->DIER |= TIM_DIER_UIE;
// 启动TIM2定时器
TIM2->CR1 |= TIM_CR1_CEN;
// 等待TIM2定时器中断发生
while ((TIM2->SR & TIM_SR_UIF) == 0)
{
}
// 清除TIM2定时器的中断标志位
TIM2->SR &= ~TIM_SR_UIF;
}
/*----------------------------------------------------------------------------
* 函数: Servo_Init
* 描述: 初始化舵机
*----------------------------------------------------------------------------*/
void Servo_Init(void)
{
// 设置TIM2通道1的输出比较模式
TIM2->CCMR1 &= ~TIM_CCMR1_OC1M;
TIM2->CCMR1 |= TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1;
// 设置TIM2通道1的输出比较预装载值
TIM2->CCR1 = 1500;
// 使能TIM2通道1的输出比较功能
TIM2->CCER |= TIM_CCER_CC1E;
}
/*----------------------------------------------------------------------------
* 函数: Servo_SetAngle
* 描述: 设置舵机的角度
*----------------------------------------------------------------------------*/
void Servo_SetAngle(int angle)
{
// 计算舵机的占空比
int duty = 1500 + angle * 11;
// 设置TIM2通道1的输出比较预装载值
TIM2->CCR1 = duty;
}
/*----------------------------------------------------------------------------
* 函数: Delay
* 描述: 延时函数
*----------------------------------------------------------------------------*/
void Delay(uint32_t ms)
{
uint32_t i;
for (i = 0; i < ms; i++)
{
for (uint32_t j = 0; j < 10000; j++)
{
}
}
}
```
## 程序说明
该程序首先初始化STM32F103RCT6芯片的时钟系统和TIM2定时器。然后初始化舵机。接着让舵机正转30度,等待1秒,再反转30度,等待1秒,最后停止转动。最后,程序进入死循环,等待用户输入。
## 结语
本文介绍了如何使用STM32F103RCT6芯片控制SG90舵机,实现正反转角度控制。该程序可以很容易地修改以实现更复杂的功能。希望本文能对读者有所帮助。