一、设计简介       

         该项目旨在开发一个管道空气流量控制系统,通过直流伺服电机驱动风机调节管道内的空气流量,同时集成多种控制方式和信息显示功能,主控芯片采用STM32F103C8T6单片机,空气流量传感器实时监测管道内的空气流量,通过模拟电压来模拟不同的空气流量值。(采用可变电阻ADC采样模拟电压实现)、OLED显示屏及串口通信模块,实现对管道内空气流量的精确调节与显示。系统通过串口接收外部设备发送的十六进制指令,根据不同的指令进入不同的串口调节模式。配备了物理按键,如按键 1 和按键 2。OLED 显示屏用于显示系统的关键信息,方便用户直观地了解系统的运行状态

百度网盘资料下载链接

二、功能设计

直流电机转速根据空气流量传感器的读数进行动态调整,可以实现正转反转,转速调节

串口调节模式:系统通过串口接收外部设备发送的十六进制指令,根据不同的指令进入不同的串口调节模式。

例如:当接收到十六进制数 10 时,电机进入串口调节模式,电机正转且速度为 50。

按键控制功能:

当按键 1 按下时,电机将以正转速度 70 运行,驱动风机使管道内的空气正向流动。

当按键 2 按下时,电机将以反转速度 -70 运行,驱动风机使管道内的空气反向流动。

OLED 显示功能:

OLED 显示屏用于显示系统的关键信息,方便用户直观地了解系统的运行状态。

主要显示当前风机的转速和管道内的空气流量信息。将采集到的空气流量数据和电机的转速数据实时更新到 OLED 显示屏上。

三、所需硬件以及传感器模块

1、本设计的主控MCU采用STM32F103C8T6 单片机

2、直流伺服电机

3、选用TB6612FNG作为电机驱动板

4、可变电阻来模拟空气流量传感器的输出信号

5、0.96OLED显示屏

四、软件环境

Keil5 MDK:stm32单片机源代码程序编写及下载代码

ST-Link 驱动程序:用于下载程序到 STM32。

Proteus8.16仿真软件

五、所需硬件以及传感器模块

5.1 stm32f103c8t6(1个)

本设计的主控MCU采用STM32F103C8T6 单片机,它是基于 ARM Cortex - M3 内核,其工作频率可达 72MHz,在运行复杂算法和处理多任务时能够提供有力支持。芯片内部集成了 64KB 的 Flash 存储器用于存储程序代码,还有 20KB 的 SRAM 为数据的快速读写提供空间。

在硬件设计上,STM32F103C8T6 的多个 GPIO 引脚可灵活配置,多个定时器不仅可实现精准的定时控制,如电机调速中 PWM 信号的生成,还能用于测量外部信号的频率和脉宽。多种通信接口,像 USART、SPI 和 I2C,让它能与各类设备进行高效通信,可以实现串口控制。ADC 模块能够精确采集模拟信号,空气流量监测使用ADC转换完成。

5.2 直流伺服电机(1个)

        直流伺服电机,是一种在伺服系统中控制机械元件运转的发动机,属于补助马达间接变速装置。它可以将电压信号转化为转矩和转速,以驱动控制对象。根据是否带有电刷,直流伺服电机可以分为有刷直流伺服电机和无刷直流伺服电机两大类。直流伺服电机是一种常用的电动机,选择它用于驱动风机,实现空气流量的调节。电机与STM32单片机连接以及通过PWM(脉冲宽度调制)进行控制的过程。

5.3 TB6612FNG作为电机驱动(1个)

本设计中选用TB6612FNG作为电机驱动板,TB6612是一款高性能的电机驱动芯片,可以可同时驱动两个直流电机,每通道输出平均电流达 1.2A,峰值电流达 3.2A,能满足小型直流电机的驱动需求。具有多种控制功能包括正反转控制、刹车及停止等多种功能模式,通过 AIN1/AIN2、BIN1/BIN2 引脚的不同电平组合实现电机转动方向调节。支持 PWM 信号输入,通过改变 PWM 的占空比可实现电机的调速,占空比越大,电机转速越快。

引脚功能

VM:驱动电压输入端,范围为 4.5-15V。

VCC:逻辑电平输入端,电压范围 2.7-5.5V.

GND:电源地端.

STBY:正常工作 / 待机状态控制输入端,高电平有效,接低电平时整个驱动器停止工作.

PWMA/PWMB:PWM 信号输入端,用于控制电机的转速.

AIN1/AIN2、BIN1/BIN2:电机控制模式输入端,通过不同的电平组合来控制电机的正反转及刹车等状态.

AO1/AO2、BO1/BO2:电机驱动输出端,分别连接到两个电机.

5.4 0.96OLED显示屏(1个)

本程序采用的是4针0.96oled屏幕,stm32f103c8t6的I2C驱动程序。主控单片机使用stm32f103c8t6。

0.96oled屏幕分辨率为 128*64 ,多种接口方式;4线IIC 接口方式和七线的SPI接口。

I2C接口

1. GND 电源地

2. VCC 电源正(3~5.5V)

3. SCL OLED 的 D0 脚,在 IIC 通信中为时钟管脚

4. SDA OLED 的 D1 脚,在 IIC 通信中为数据管脚

六、proteus仿真原理图及设计流程图

程序流程图

七、程序代码

#include "stm32f10x.h"                 
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Serial.h"
#include "AD.h"
#include "Key.h"

u8 KEY;								  //按键值变量
u16 FengLi;								 //空气流量传感器数据
int8_t ZhuanSu;							//电机转速变量
u8 MODE;									//串口和自动调节控制标志位
u8 RX_data;					      	//串口接收数据

int main(void)
{ 		
		OLED_Init();		//OLED显示初始化	
		Motor_Init();		 //电机初始化	             									
		AD_Init();			//模拟初始化		            								
		Serial_Init();	//串口初始化   
		Key_Init();			//按键初始化  
			
		OLED_ShowString(0,0,"FengLi:",OLED_8X16);			//OLED显示FengLi字符
		OLED_ShowString(0,16,"ZhuanSu:",OLED_8X16);		//OLED显示ZhuanSu字符
				
		while (1)
		{ 				
			KEY=Key_GetNum();												//扫描按键获取按键值
			FengLi=AD_GetValue(ADC_Channel_1);		       //可变电阻模拟风量传感器开启ADC转换                     			
			switch(KEY)
			{
				case 1:														 //当按键1呗按下
				{
					MODE=1;                          //进入按键控制模式
					ZhuanSu=70;											 //点击转速70,正转 
					Motor_SetSpeed(70);								 //PWM调节电机转速占空比70%
				}break;
				case 2:														//当按键1呗按下
				{
					MODE=1;													//进入按键控制模式
					ZhuanSu=-70;										//电机反转转速-70
					Motor_SetSpeed(-70);							//PWM调节电机转速占空比-70%
				}break;				
			}
				
			if(MODE==0&&FengLi<=2000)												  //空气流量传感器数值小于2000时,电机正转占空比90%
				{
						Motor_SetSpeed(90);
						ZhuanSu=90;																			//显示屏转速显示90
				}				
				else if(MODE==0&&FengLi>2000&&FengLi<3000)					//空气流量传感器数值在2000-3000,电机正转占空比70%
				{
						Motor_SetSpeed(70);
						ZhuanSu=70;																				//显示屏转速显示70
				}		
				else if(MODE==0&&FengLi>=3000&&FengLi<4096)						//空气流量传感器数值在3000-4096,电机正转占空比50%
				{
						ZhuanSu=50;																	   //显示屏转速显示50
						Motor_SetSpeed(50);
				}	
				OLED_ShowNum(64,0,FengLi,4,OLED_8X16);							//实时显示空气流量传感器数值
				OLED_ShowSignedNum(72,16,ZhuanSu,2,OLED_8X16);						//实时显示电机转动速度
				OLED_Update();				
		}			
}

void USART1_IRQHandler(void)
{
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)		//判断是否是USART1的接收事件触发的中断
	{
		 RX_data = USART_ReceiveData(USART1);				    //读取数据寄存器,存放在接收的数据变
		 if(RX_data==0X10)					//串口接收到数据10,控制电机正向转动,转速50
		 {
				MODE=1;									//串口按键控制模式
				ZhuanSu=50;
				Motor_SetSpeed(50);	
		 }
		 		 if(RX_data==0X20)			//串口接收到数据30,控制电机正向转动,转速90
		 {
				MODE=1;									//串口按键控制模式
				ZhuanSu=90;
				Motor_SetSpeed(90);	
		 }
		 		 if(RX_data==0X30)		//串口接收到数据30,控制电机反向转动,转速-50
		 {
				MODE=1;								//串口按键控制模式
				ZhuanSu=-50;
				Motor_SetSpeed(-50);	
		 }
		 		 if(RX_data==0X40)		//串口接收到数据40,控制电机反向转动,转速-90
		 {
				MODE=1;								//串口按键控制模式
				ZhuanSu=-90;
				Motor_SetSpeed(-90);	
		 }
		 		 if(RX_data==0X50)		//串口接收到数据50,回到空气流量传感器自动控制状态,
		 {
				MODE=0;								//自动控制模式,根据空气流量传感器数据自动控制电机转速
				ZhuanSu=0;
				Motor_SetSpeed(0);	
		 }
		 USART_ClearITPendingBit(USART1, USART_IT_RXNE);			//清除USART1的RXNE标志位													
	}
}

八、资料内容清单

资料下载百度网盘链接icon-default.png?t=O83Ahttps://pan.baidu.com/s/1vvmoHqenDY-UrZR4A2C4Ng?pwd=wpu2%20%E6%8F%90%E5%8F%96%E7%A0%81:%20wpu2

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐