一、系统概述与核心功能
1. 系统架构
传感器层 → TMS320F28027主控 → 执行层 → 用户交互层
↑ ↑ ↑ ↑
温湿度 电机控制 升降电机 手机APP
光照度 PWM生成 照明LED 语音控制
雨滴检测 ADC采样 消毒UV灯 本地按键
重量检测 通信接口 风干风扇 显示屏
2. 核心功能特点
- 智能升降控制:根据天气、时间、用户指令自动控制晾衣架升降
- 环境感知:实时监测温湿度、光照强度、雨滴状态
- 多重保护:过载保护、防撞保护、遇阻即停
- 节能模式:根据光照自动调节照明,低功耗待机
- 远程控制:通过Wi-Fi/蓝牙连接手机APP,支持定时、场景模式
- 消毒烘干:UV消毒+热风烘干,智能杀菌除湿
二、硬件设计方案
1. 核心元器件选型
| 模块 | 推荐型号 | 关键参数 | 接口方式 |
|---|---|---|---|
| 主控芯片 | TMS320F28027 | 60MHz, 64KB Flash, 12KB RAM, 12位ADC | 核心控制器 |
| 升降电机 | 42步进电机+TB6600驱动器 | 1.8°/步,保持扭矩0.4N·m | PWM+方向控制 |
| 温湿度传感器 | DHT22 | 温度±0.5℃,湿度±2%RH | 单总线 |
| 光照传感器 | BH1750 | 0-65535 lux,I2C接口 | I2C |
| 雨滴传感器 | 雨滴检测模块 | 模拟输出,灵敏度可调 | ADC |
| 重量传感器 | HX711+称重传感器 | 24位ADC,最大5kg | SPI |
| Wi-Fi模块 | ESP8266-12F | 802.11 b/g/n,内置TCP/IP协议栈 | UART |
| 语音模块 | LD3320 | 非特定人声识别,支持中文 | SPI |
| 显示模块 | OLED 12864 | 0.96寸,128×64像素 | I2C |
| 电源管理 | LM2596+AMS1117 | 12V转5V,5V转3.3V | 降压稳压 |
2. TMS320F28027引脚分配
// 电机控制引脚
#define MOTOR_STEP_PIN GPIO0 // PWM1A - 步进脉冲
#define MOTOR_DIR_PIN GPIO1 // GPIO - 方向控制
#define MOTOR_EN_PIN GPIO2 // GPIO - 使能控制
// 传感器接口
#define DHT22_PIN GPIO3 // 单总线温湿度
#define RAIN_ADC_CH ADCINA0 // 雨滴传感器模拟输入
#define WEIGHT_DOUT_PIN GPIO4 // HX711数据线
#define WEIGHT_SCK_PIN GPIO5 // HX711时钟线
// 外设接口
#define I2C_SCL_PIN GPIO6 // I2C时钟(BH1750、OLED)
#define I2C_SDA_PIN GPIO7 // I2C数据
#define UART_TX_PIN GPIO8 // UART发送(ESP8266)
#define UART_RX_PIN GPIO9 // UART接收
// 功能控制
#define UV_LED_PIN GPIO10 // UV消毒灯控制
#define HEATER_PIN GPIO11 // 加热器控制
#define FAN_PIN GPIO12 // 风扇控制
#define LIGHT_PIN GPIO13 // 照明LED控制
#define BUZZER_PIN GPIO14 // 蜂鸣器报警
3. 电机驱动电路设计
// TB6600步进电机驱动器连接
TMS320F28027 → TB6600 → 42步进电机
GPIO0(PWM1A) → PUL+ → 步进脉冲
GPIO1 → DIR+ → 方向控制
GPIO2 → ENA+ → 使能控制
GND → PUL-,DIR-,ENA- (共地)
// 电源配置
12V/2A电源 → TB6600(VCC) → 电机
5V/1A电源 → TMS320F28027
三、软件设计与核心代码
1. 系统主程序框架
#include "DSP28x_Project.h"
#include "motor_control.h"
#include "sensors.h"
#include "wifi_comm.h"
#include "display.h"
// 系统状态定义
typedef enum {
STATE_IDLE, // 空闲状态
STATE_RAISING, // 上升中
STATE_LOWERING, // 下降中
STATE_DRYING, // 烘干中
STATE_UV_CLEAN, // 消毒中
STATE_FAULT // 故障状态
} SystemState_t;
// 全局变量
SystemState_t sys_state = STATE_IDLE;
float temperature = 0.0, humidity = 0.0;
float light_level = 0.0;
uint16_t rain_level = 0;
float weight = 0.0;
void main(void) {
// 系统初始化
InitSysCtrl(); // 系统控制初始化
InitPieCtrl(); // 中断控制初始化
InitPieVectTable(); // 中断向量表初始化
// 外设初始化
GPIO_Init(); // GPIO初始化
PWM_Init(); // PWM初始化(电机控制)
ADC_Init(); // ADC初始化(雨滴检测)
I2C_Init(); // I2C初始化(光照、OLED)
UART_Init(); // UART初始化(Wi-Fi通信)
Timer_Init(); // 定时器初始化
// 模块初始化
Motor_Init(); // 电机初始化
Sensors_Init(); // 传感器初始化
WiFi_Init(); // Wi-Fi模块初始化
OLED_Init(); // 显示初始化
// 使能中断
EnableInterrupts();
// 主循环
while(1) {
// 1. 传感器数据采集
Read_Sensors();
// 2. 状态机处理
State_Machine_Handler();
// 3. 通信处理
WiFi_Data_Process();
Local_Control_Process();
// 4. 显示更新
Update_Display();
// 5. 低功耗处理(空闲时进入IDLE模式)
if(sys_state == STATE_IDLE) {
asm(" IDLE");
}
}
}
// 传感器读取函数
void Read_Sensors(void) {
// 温湿度读取(DHT22)
DHT22_Read(&temperature, &humidity);
// 光照强度读取(BH1750)
light_level = BH1750_ReadLight();
// 雨滴检测(ADC采样)
rain_level = ADC_Read(RAIN_ADC_CH);
// 重量检测(HX711)
weight = HX711_ReadWeight();
}
// 状态机处理
void State_Machine_Handler(void) {
static uint32_t state_timer = 0;
switch(sys_state) {
case STATE_IDLE:
// 检查是否需要自动升降
if(Check_Auto_Mode()) {
if(rain_level > RAIN_THRESHOLD) {
sys_state = STATE_RAISING; // 下雨自动上升
Motor_Raise();
} else if(light_level > LIGHT_THRESHOLD &&
humidity < HUMIDITY_THRESHOLD) {
sys_state = STATE_LOWERING; // 晴天自动下降
Motor_Lower();
}
}
break;
case STATE_RAISING:
if(Motor_IsTop() || Check_Obstacle()) {
Motor_Stop();
sys_state = STATE_IDLE;
}
break;
case STATE_LOWERING:
if(Motor_IsBottom() || Check_Obstacle()) {
Motor_Stop();
sys_state = STATE_IDLE;
}
break;
case STATE_DRYING:
if(Check_Drying_Complete()) {
Heater_Off();
Fan_Off();
sys_state = STATE_IDLE;
}
break;
case STATE_UV_CLEAN:
if(Check_UV_Complete()) {
UV_LED_Off();
sys_state = STATE_IDLE;
}
break;
case STATE_FAULT:
Fault_Handler();
break;
}
}
2. 步进电机控制(PWM生成)
// PWM配置(用于步进电机脉冲)
void PWM_Init_Motor(void) {
// 使用ePWM1模块生成步进脉冲
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm1Regs.TBPRD = 1500; // 周期值(决定脉冲频率)
EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位寄存器清零
EPwm1Regs.TBCTR = 0; // 计数器清零
// 设置比较值(占空比50%)
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;
// 动作限定器配置
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 计数等于CMPA时置高
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数等于CMPA时清零
// 时基时钟配置
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时钟分频
// 使能PWM输出
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位加载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 同步选择
}
// 电机速度控制
void Motor_SetSpeed(uint16_t speed_rpm) {
uint32_t period;
// 计算PWM周期值(公式:Period = (CPU_Freq / (2 * 分频 * 步数/转 * RPM / 60)))
// 假设:CPU=60MHz,分频=1,步数/转=200(1.8度/步)
period = (uint32_t)(60000000 / (2 * 1 * 200 * speed_rpm / 60));
if(period > 65535) period = 65535; // 限制最大值
if(period < 100) period = 100; // 限制最小值
EPwm1Regs.TBPRD = period;
EPwm1Regs.CMPA.half.CMPA = period / 2;
}
// 电机位置控制(精确升降)
void Motor_MoveToPosition(uint32_t target_steps, uint8_t direction) {
static uint32_t current_steps = 0;
uint32_t steps_to_move;
// 设置方向
GpioDataRegs.GPASET.bit.GPIO1 = direction; // GPIO1控制方向
// 计算需要移动的步数
if(direction == DIR_UP) {
steps_to_move = target_steps - current_steps;
} else {
steps_to_move = current_steps - target_steps;
}
// 使能电机
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1; // 使能电机(低电平有效)
// 发送脉冲
for(uint32_t i = 0; i < steps_to_move; i++) {
// 每个脉冲移动一步
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 重新使能计数
DELAY_US(100); // 脉冲间隔
// 检查障碍物
if(Check_Obstacle()) {
Motor_Stop();
break;
}
}
// 更新当前位置
if(direction == DIR_UP) {
current_steps += steps_to_move;
} else {
current_steps -= steps_to_move;
}
// 关闭电机(保持扭矩)
GpioDataRegs.GPASET.bit.GPIO2 = 1; // 禁用电机
}
3. 智能控制算法
// 自动模式决策函数
uint8_t Check_Auto_Mode(void) {
uint8_t auto_flag = 0;
// 条件1:检测到下雨
if(rain_level > RAIN_THRESHOLD) {
auto_flag |= AUTO_RAISE;
}
// 条件2:夜间自动升起(避免露水)
if(light_level < NIGHT_LIGHT_THRESHOLD) {
auto_flag |= AUTO_RAISE;
}
// 条件3:晴天且湿度适宜自动下降
if(light_level > SUNNY_LIGHT_THRESHOLD &&
humidity < DRY_HUMIDITY_THRESHOLD &&
rain_level < RAIN_THRESHOLD) {
auto_flag |= AUTO_LOWER;
}
// 条件4:衣物重量超过阈值(已晾晒)
if(weight > WEIGHT_THRESHOLD) {
auto_flag |= AUTO_DRYING; // 启动烘干
}
return auto_flag;
}
// PID控制器(用于温度控制)
typedef struct {
float Kp, Ki, Kd; // PID参数
float integral; // 积分项
float prev_error; // 上次误差
float output; // 输出值
float output_max; // 输出上限
float output_min; // 输出下限
} PID_Controller;
void PID_Init(PID_Controller *pid, float Kp, float Ki, float Kd, float max, float min) {
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
pid->integral = 0.0;
pid->prev_error = 0.0;
pid->output = 0.0;
pid->output_max = max;
pid->output_min = min;
}
float PID_Calculate(PID_Controller *pid, float setpoint, float measured, float dt) {
float error = setpoint - measured;
float derivative;
// 比例项
float proportional = pid->Kp * error;
// 积分项(抗积分饱和)
pid->integral += error * dt;
if(pid->integral > pid->output_max) pid->integral = pid->output_max;
if(pid->integral < pid->output_min) pid->integral = pid->output_min;
float integral = pid->Ki * pid->integral;
// 微分项
derivative = pid->Kd * (error - pid->prev_error) / dt;
pid->prev_error = error;
// 计算输出
pid->output = proportional + integral + derivative;
// 输出限幅
if(pid->output > pid->output_max) pid->output = pid->output_max;
if(pid->output < pid->output_min) pid->output = pid->output_min;
return pid->output;
}
// 烘干温度控制
void Drying_Temperature_Control(float target_temp) {
static PID_Controller temp_pid;
static uint8_t pid_initialized = 0;
float heater_pwm;
if(!pid_initialized) {
PID_Init(&temp_pid, 2.5, 0.1, 0.05, 100.0, 0.0); // PID参数
pid_initialized = 1;
}
// 计算PID输出(控制周期100ms)
heater_pwm = PID_Calculate(&temp_pid, target_temp, temperature, 0.1);
// 设置加热器PWM占空比
Set_Heater_PWM(heater_pwm);
}
4. Wi-Fi通信与APP控制
// ESP8266 AT指令通信
void WiFi_SendATCommand(char *cmd, char *expected, uint16_t timeout) {
char response[256];
UART_SendString(cmd);
DELAY_MS(100);
// 等待响应
uint32_t start_time = GetSysTickCount();
while((GetSysTickCount() - start_time) < timeout) {
if(UART_ReceiveString(response, sizeof(response))) {
if(strstr(response, expected) != NULL) {
return; // 收到期望响应
}
}
}
}
// 连接Wi-Fi
void WiFi_ConnectAP(char *ssid, char *password) {
WiFi_SendATCommand("AT+CWMODE=1\r\n", "OK", 1000); // 设置为STA模式
DELAY_MS(100);
char cmd[64];
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, password);
WiFi_SendATCommand(cmd, "OK", 5000); // 连接AP
DELAY_MS(100);
WiFi_SendATCommand("AT+CIPMUX=1\r\n", "OK", 1000); // 开启多连接
DELAY_MS(100);
WiFi_SendATCommand("AT+CIPSERVER=1,8080\r\n", "OK", 1000); // 开启TCP服务器
}
// 处理APP控制指令
void Process_App_Command(char *cmd) {
// 指令格式:{"cmd":"raise", "value":"100"}
// 支持指令:raise/lower/stop/light/uv/dry/timer
if(strstr(cmd, "\"cmd\":\"raise\"")) {
// 上升指令
uint16_t height;
sscanf(cmd, "\"value\":\"%hu\"", &height);
Motor_MoveToPosition(height * STEPS_PER_CM, DIR_UP);
// 回复确认
WiFi_SendResponse("{\"status\":\"raising\", \"height\":%hu}", height);
}
else if(strstr(cmd, "\"cmd\":\"lower\"")) {
// 下降指令
uint16_t height;
sscanf(cmd, "\"value\":\"%hu\"", &height);
Motor_MoveToPosition(height * STEPS_PER_CM, DIR_DOWN);
WiFi_SendResponse("{\"status\":\"lowering\", \"height\":%hu}", height);
}
else if(strstr(cmd, "\"cmd\":\"dry\"")) {
// 烘干指令
uint16_t duration;
sscanf(cmd, "\"value\":\"%hu\"", &duration);
Start_Drying(duration);
WiFi_SendResponse("{\"status\":\"drying\", \"duration\":%hu}", duration);
}
else if(strstr(cmd, "\"cmd\":\"status\"")) {
// 状态查询
char status_json[256];
sprintf(status_json,
"{\"temp\":%.1f,\"humi\":%.1f,\"light\":%.0f,\"rain\":%hu,\"weight\":%.2f,\"state\":%d}",
temperature, humidity, light_level, rain_level, weight, sys_state);
WiFi_SendResponse(status_json);
}
}
参考代码 基于TMS320F28027的智能晾衣架 www.youwenfan.com/contentali/134539.html
四、手机APP设计(Android简易版)
1. APP界面布局
<!-- 主控制界面 -->
<LinearLayout>
<!-- 状态显示区 -->
<TextView android:id="@+id/tv_status" android:text="状态:空闲"/>
<TextView android:id="@+id/tv_temp" android:text="温度:--℃"/>
<TextView android:id="@+id/tv_humi" android:text="湿度:--%"/>
<!-- 高度控制 -->
<SeekBar android:id="@+id/sb_height" android:max="200"/>
<Button android:id="@+id/btn_raise" android:text="上升"/>
<Button android:id="@+id/btn_lower" android:text="下降"/>
<Button android:id="@+id/btn_stop" android:text="停止"/>
<!-- 功能控制 -->
<Switch android:id="@+id/sw_light" android:text="照明"/>
<Switch android:id="@+id/sw_uv" android:text="UV消毒"/>
<Button android:id="@+id/btn_dry" android:text="烘干"/>
<!-- 定时设置 -->
<TimePicker android:id="@+id/tp_raise"/>
<TimePicker android:id="@+id/tp_lower"/>
<Button android:id="@+id/btn_set_timer" android:text="设置定时"/>
</LinearLayout>
2. 网络通信核心
public class WiFiControlService {
private Socket socket;
private OutputStream outputStream;
private InputStream inputStream;
// 连接晾衣架
public boolean connect(String ip, int port) {
try {
socket = new Socket(ip, port);
outputStream = socket.getOutputStream();
inputStream = socket.getInputStream();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
// 发送控制指令
public void sendCommand(String cmd, String value) {
try {
String jsonCmd = String.format("{\"cmd\":\"%s\", \"value\":\"%s\"}", cmd, value);
outputStream.write(jsonCmd.getBytes());
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
// 接收状态数据
public void startReceiving() {
new Thread(() -> {
byte[] buffer = new byte[1024];
int bytes;
try {
while ((bytes = inputStream.read(buffer)) != -1) {
String response = new String(buffer, 0, bytes);
// 解析JSON并更新UI
updateUI(response);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
五、系统调试与优化
1. 调试步骤
硬件调试:
- 检查电源:12V电机电源、5V/3.3V控制电源
- 测试电机:单独测试TB6600+步进电机
- 验证传感器:逐个测试DHT22、BH1750等传感器
软件调试:
- 使用CCS的实时调试功能
- 通过串口打印调试信息
- 使用JTAG仿真器单步调试
系统联调:
- 测试自动升降逻辑
- 验证Wi-Fi通信稳定性
- 测试故障保护机制
2. 常见问题解决
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 电机不转 | 电源不足/接线错误 | 检查12V电源,确认PUL/DIR/ENA接线 |
| 传感器读数异常 | I2C地址冲突/时序问题 | 检查I2C地址,调整延时时间 |
| Wi-Fi连接失败 | 模块初始化失败/信号弱 | 发送AT指令测试,调整天线位置 |
| 升降位置不准 | 步进电机丢步 | 增加电机电流,降低速度 |
六、扩展功能建议
1. 高级功能
- 语音控制:集成LD3320,支持"上升"、"下降"等语音指令
- 手势识别:添加APDS-9960手势传感器,支持挥手控制
- 太阳能供电:增加太阳能板+MPPT充电控制器
- 云端数据:连接阿里云/腾讯云IoT平台,实现数据统计
2. 安全增强
- 双重限位:机械限位开关+软件限位保护
- 电流检测:ACS712检测电机电流,实现过流保护
- 备用电源:超级电容,防止突然断电
3. 节能优化
- 智能休眠:无人操作30分钟后进入深度睡眠
- 光照调节:根据环境光自动调节LED亮度
- 功率管理:分时控制各模块供电
七、开发资源与成本
1. 开发工具
- IDE:Code Composer Studio v10+(TI官方)
- 仿真器:XDS100v3或LAUNCHXL-F28027
- 库文件:C2000ware、ControlSUITE
- 调试工具:串口助手、逻辑分析仪
2. 成本估算(单套)
| 模块 | 型号 | 数量 | 单价 | 小计 |
|---|---|---|---|---|
| 主控芯片 | TMS320F28027 | 1 | ¥25-35 | ¥25-35 |
| 步进电机+驱动器 | 42电机+TB6600 | 1套 | ¥45-60 | ¥45-60 |
| 传感器套件 | DHT22+BH1750+雨滴 | 1套 | ¥25-35 | ¥25-35 |
| Wi-Fi模块 | ESP8266-12F | 1 | ¥12-18 | ¥12-18 |
| 显示模块 | OLED 12864 | 1 | ¥15-22 | ¥15-22 |
| 结构件 | 铝合金支架+外壳 | 1套 | ¥50-80 | ¥50-80 |
| 总计 | ¥172-250 |