演示
摘要
随着智能家居技术的不断发展,舵机在自动化家居设备中的应用变得越来越广泛。本文设计并实现了一种基于STM32单片机的按键PWM控制舵机系统。通过按键可以精确控制舵机角度,实现对窗帘、柜子、门禁等家居设备的智能化控制。系统采用STM32F10x系列单片机,结合OLED显示屏和按键模块,实现了角度的实时显示与调整。本文详细介绍了系统的硬件设计、软件实现以及功能测试结果。
目录
[1. 引言](#1. 引言)
[1.1 研究背景](#1.1 研究背景)
[1.2 研究目的](#1.2 研究目的)
[1.3 论文结构](#1.3 论文结构)
[2. 系统硬件设计](#2. 系统硬件设计)
[2.1 硬件架构](#2.1 硬件架构)
[2.2 STM32单片机](#2.2 STM32单片机)
[2.2.1 STM32F10x简介](#2.2.1 STM32F10x简介)
[2.2.2 STM32在系统中的应用](#2.2.2 STM32在系统中的应用)
[2.3 舵机与PWM控制原理](#2.3 舵机与PWM控制原理)
[2.3.1 舵机工作原理](#2.3.1 舵机工作原理)
[2.3.2 PWM信号生成](#2.3.2 PWM信号生成)
[2.4 OLED显示模块](#2.4 OLED显示模块)
[2.5 按键输入模块](#2.5 按键输入模块)
[3. 系统软件设计](#3. 系统软件设计)
[3.1 软件架构](#3.1 软件架构)
[3.2 模块初始化与配置](#3.2 模块初始化与配置)
[3.3 按键处理逻辑](#3.3 按键处理逻辑)
[3.4 舵机控制模块](#3.4 舵机控制模块)
[3.5 OLED显示更新](#3.5 OLED显示更新)
[3.6 主程序设计](#3.6 主程序设计)
[4. 系统调试与测试](#4. 系统调试与测试)
[4.1 测试环境](#4.1 测试环境)
[4.2 测试步骤](#4.2 测试步骤)
[4.3 测试结果](#4.3 测试结果)
[4.4 调试过程](#4.4 调试过程)
[5. 结论与展望](#5. 结论与展望)
[5.1 结论](#5.1 结论)
[5.2 展望](#5.2 展望)
1. 引言
1.1 研究背景
随着物联网和智能家居概念的普及,家居自动化设备逐渐进入千家万户。作为智能控制设备的核心部件之一,舵机因其精确控制和简单易用的特点,在家居设备的控制中发挥着重要作用。传统的家居设备控制方式多依赖于手动操作,而智能化的控制系统则能够通过简单的交互实现对设备的远程和精确控制。
1.2 研究目的
本研究旨在设计并实现一个基于STM32单片机的按键PWM控制舵机系统。该系统通过按键控制舵机的旋转角度,并在OLED屏幕上实时显示当前角度。此系统可以应用于窗帘、柜子、门禁等多种家居场景,为用户提供便捷的智能控制解决方案。
1.3 论文结构
本文的结构如下:第二部分详细介绍系统的硬件设计,包括所用元器件及其功能;第三部分描述系统的软件设计,涵盖模块初始化、控制逻辑及功能实现;第四部分讨论系统的调试与测试过程;第五部分总结研究成果,并提出未来的研究方向。
2. 系统硬件设计
2.1 硬件架构
系统的硬件设计基于STM32F10x系列单片机,该芯片具有高性能、低功耗的特点,适合于对资源要求较高的实时控制应用。系统硬件架构包括以下几个主要模块:
- STM32单片机:作为主控制器,负责整个系统的逻辑控制、信号处理和设备通信。
- 舵机:用于实际的物理旋转,实现对窗帘、柜子等设备的控制。
- PWM信号生成模块:用于产生控制舵机的PWM信号。
- OLED显示模块:用于实时显示当前舵机角度。
- 按键输入模块:用于接收用户输入,控制舵机的旋转角度。
2.2 STM32单片机
2.2.1 STM32F10x简介
STM32F10x系列是STMicroelectronics推出的一款基于ARM Cortex-M3内核的微控制器,具有以下特点:
- 高性能:工作频率最高可达72MHz,支持快速的数据处理。
- 丰富的外设接口:包括GPIO、ADC、UART、SPI、I2C等,适合多种应用场景。
- 低功耗:提供多种节能模式,适用于低功耗应用。
2.2.2 STM32在系统中的应用
在本系统中,STM32负责以下任务:
- 初始化各个外设模块,包括GPIO、PWM、OLED等。
- 处理按键输入,更新舵机角度。
- 生成PWM信号,控制舵机位置。
- 更新OLED显示,提供用户界面。
2.3 舵机与PWM控制原理
2.3.1 舵机工作原理
舵机是一种通过控制脉冲信号来调整输出轴角度的执行机构。标准的舵机通过PWM信号进行控制,信号的占空比决定舵机的转动角度。一般来说,1ms的脉冲宽度对应于0度,2ms的脉冲宽度对应于180度,通过调节脉冲宽度可以实现对角度的精确控制。
2.3.2 PWM信号生成
PWM(脉宽调制)是一种通过改变信号占空比来控制设备的方法。在STM32中,PWM信号通常通过定时器模块生成。通过配置定时器的频率和占空比,可以得到所需的PWM信号。
在本系统中,通过STM32的定时器模块生成PWM信号,控制舵机的旋转角度。系统中将通过按键调整PWM信号的占空比,以改变舵机的角度。
2.4 OLED显示模块
OLED显示器用于提供用户界面,显示当前的舵机角度。OLED具有以下优点:
- 高对比度:比传统的LCD显示器具有更好的显示效果。
- 低功耗:适合电池供电的应用场景。
- 宽视角:从各个角度均能清晰观看。
在本系统中,OLED通过I2C接口与STM32通信,实现实时的角度显示。
2.5 按键输入模块
按键模块用于接收用户输入,控制舵机的旋转角度。系统采用4个独立按键,分别用于:
- 增加角度
- 减小角度
- 设置特定角度
- 复位角度
按键通过GPIO接口连接到STM32,STM32通过轮询方式检测按键输入。
3. 系统软件设计
3.1 软件架构
系统软件采用模块化设计,主要包括以下模块:
- 初始化模块:负责各个硬件模块的初始化。
- 按键处理模块:处理用户输入的按键事件。
- 舵机控制模块:根据按键输入调整舵机角度。
- OLED显示模块:更新显示内容,提供用户交互界面。
软件流程图如图1所示:
+-----------------+
| 系统初始化 |
+-----------------+
|
v
+-----------------+
| 按键事件检测 |
+-----------------+
|
v
+-----------------+
| 更新舵机角度 |
+-----------------+
|
v
+-----------------+
| 更新OLED显示 |
+-----------------+
|
v
+-----------------+
| 循环 |
+-----------------+
图1 系统软件流程图
3.2 模块初始化与配置
在系统启动时,需要对各个硬件模块进行初始化。以下是初始化的主要步骤:
- STM32系统时钟配置:设置时钟频率,确保定时器和外设的正常工作。
- GPIO初始化:配置按键和舵机的GPIO引脚。
- PWM初始化:配置定时器用于PWM信号生成。
- OLED初始化:配置I2C接口,并初始化OLED显示屏。
以下是初始化代码示例:
void System_Init(void) {
// 初始化系统时钟
SystemClock_Config();
// 初始化GPIO
GPIO_Init();
// 初始化PWM
PWM_Init();
// 初始化OLED
OLED_Init();
// 初始化按键
Key_Init();
}
3.3 按键处理逻辑
按键处理模块负责检测按键输入,并根据按键编号执行相应的操作。以下是按键处理的核心逻辑:
- 按键1:增加舵机角度,每次增加90度。
- 按键2:减少舵机角度,每次减少90度。
- 按键3:设置舵机角度为特定值。
- 按键4:重置舵机角度为0。
按键处理逻辑代码如下:
void Key_Process(void) {
uint8_t KeyNum = Key_GetNum();
switch (KeyNum) {
case 1:
Angle += 90;
if (Angle > 180) Angle = 0;
break;
case 2:
if (Angle >= 90) Angle -= 90;
else Angle = 0;
break;
case 3:
Angle = 45; // 设置为特定角度
break;
case 4:
Angle = 0; // 重置角度
break;
}
}
3.4 舵机控制模块
舵机控制模块根据设定的角度生成相应的PWM信号,以控制舵机旋转。PWM信号的占空比决定了舵机的最终角度。代码实现如下:
void Servo_SetAngle(float angle) {
// 计算PWM占空比
uint16_t pwm_value = (uint16_t)((angle / 180.0) * (TIM_PERIOD - 1));
// 设置PWM输出
__HAL_TIM_SET_COMPARE(&htimx, TIM_CHANNEL_x, pwm_value);
}
3.5 OLED显示更新
OLED显示模块负责实时更新舵机角度信息,并将其显示在OLED屏幕上。以下是OLED显示更新的代码实现:
void OLED_Update(void) {
char buf[16];
sprintf(buf, "Angle: %3.0f", Angle);
OLED_ShowString(1, 1, buf);
}
3.6 主程序设计
主程序负责整体流程的控制,依次调用初始化、按键处理、舵机控制和OLED更新模块。以下是主程序的代码:
int main(void) {
// 系统初始化
System_Init();
// 显示初始信息
OLED_ShowString(1, 1, "Angle:");
while (1) {
// 处理按键输入
Key_Process();
// 设置舵机角度
Servo_SetAngle(Angle);
// 更新OLED显示
OLED_Update();
// 延迟,避免按键抖动
HAL_Delay(100);
}
}
4. 系统调试与测试
4.1 测试环境
系统在以下环境中进行测试:
- 硬件平台:STM32F103C8T6
- 舵机型号:SG90
- OLED显示器:0.96寸I2C接口OLED屏幕
- 电源:5V直流电源
4.2 测试步骤
- 连接硬件:将舵机、OLED和按键模块连接到STM32开发板。
- 下载程序:通过Keil MDK将程序下载到STM32。
- 上电测试:接通电源,观察系统启动。
- 按键测试:依次按下各个按键,观察舵机的旋转角度和OLED显示的变化。
- 异常处理:检查异常情况下系统的反应,如按键抖动、角度超限等。
4.3 测试结果
测试结果表明,系统能够稳定地根据按键输入调整舵机角度,并实时更新OLED显示。具体表现如下:
- 按键响应:按键响应迅速,按键1和按键2能够正确增加和减少角度。
- 角度控制:舵机在设定角度范围内正常旋转,未出现卡顿或超限现象。
- 显示更新:OLED显示清晰,角度信息准确。
4.4 调试过程
在调试过程中,遇到了一些问题,主要包括:
- 按键抖动:由于按键机械抖动,导致角度误触发。通过增加软件延迟解决。
- PWM信号不稳定:初始PWM配置错误,导致舵机抖动,通过调节定时器参数解决。
- OLED显示异常:I2C通信不稳定,导致显示乱码,通过优化I2C驱动解决。
5. 结论与展望
5.1 结论
本文设计并实现了一种基于STM32的按键PWM控制舵机系统,成功实现了对舵机的精确角度控制。系统通过按键输入和OLED显示,实现了良好的人机交互。测试结果表明,系统性能稳定,响应迅速,满足设计要求。
5.2 展望
未来工作中,可以在以下几个方面进行改进:
- 增加更多控制方式:如红外遥控、蓝牙控制等,以提高系统的灵活性。
- 集成传感器:增加传感器模块,实现环境感知与自动调整功能。
- 优化功耗:通过优化软件算法和硬件设计,降低系统的整体功耗。
- 扩展应用场景:将系统应用于更多智能家居设备,增强其实用性。
通过以上改进,系统将更具智能化和实用性,为家居自动化提供更好的解决方案。
源码、文档视频系统资料下载链接
单片机项目大合集链接: