2022年江西省大学生电子设计竞赛H题要求设计一套分布式监控系统,这是一个典型的嵌入式系统综合设计项目。作为参赛团队的核心成员,我将从工程实践角度详细解析这个项目的完整实现过程。
这个系统的核心任务是实现对直流电机和步进电机的分布式监控,需要解决三个关键问题:首先是电机的精确控制,包括直流电机的PWM调速和步进电机的精准步进;其次是转速的实时测量,需要同时使用红外传感器和编码器两种方案;最后是数据的多端显示和远程监控,涉及单片机之间的通信以及与上位机的交互。
我们采用了"1主机+2从机"的分布式架构,这种设计主要基于以下考虑:
主机负责:
从机1专用于:
从机2专用于:
在STC系列单片机中,我们对比了三款候选型号:
STC15W4K32S4:
STC8H8K64U:
STC89C52RC:
电机驱动系统对电源有两个核心要求:
我们对比了两种方案:
线性稳压电源(如LM7805):
开关电源(LM2596S):
直流电机驱动关键参数:
步进电机(28BYJ48)参数:
对比两种驱动芯片:
L298N:
ULN2003:
关键设计要点:
PWM信号生成:
四相八拍驱动时序:
c复制const unsigned char phaseTable[8] = {
0x09, // 1001 (A+AB+)
0x08, // 1000 (A+AB-)
0x0C, // 1100 (A+B+AB-)
0x04, // 0100 (A-B+AB-)
0x06, // 0110 (A-B+B-)
0x02, // 0010 (A-B-B+)
0x03, // 0011 (A-B-B-)
0x01 // 0001 (A+B-B-)
};
驱动电流增强设计:
直流电机测速(TCRT5000):
步进电机测速(编码器):
电源分区布局:
信号完整性:
散热设计:
抗干扰措施:
采用前后台系统架构:
c复制void main() {
System_Init(); // 硬件初始化
while(1) {
Key_Scan(); // 按键扫描
UART_Process(); // 串口处理
Display_Update();// 显示更新
if (timerFlag) { // 100ms定时标志
timerFlag = 0;
Speed_Calculate(); // 转速计算
Data_Upload(); // 数据上传
}
}
}
增量式PID算法实现:
c复制typedef struct {
float Kp, Ki, Kd;
float err, err_last, err_prev;
} PID;
float PID_Calculate(PID *pid, float target, float actual) {
pid->err = target - actual;
float increment = pid->Kp * (pid->err - pid->err_last)
+ pid->Ki * pid->err
+ pid->Kd * (pid->err - 2*pid->err_last + pid->err_prev);
pid->err_prev = pid->err_last;
pid->err_last = pid->err;
return increment;
}
参数整定经验:
S型加减速算法:
c复制void Stepper_Accel(uint16_t steps, uint16_t maxSpeed) {
uint16_t currentSpeed = MIN_SPEED;
float accel = (maxSpeed - MIN_SPEED) / (steps/2);
for(uint16_t i=0; i<steps; i++) {
if (i < steps/2) { // 加速段
currentSpeed = MIN_SPEED + accel * i;
} else { // 减速段
currentSpeed = maxSpeed - accel * (i - steps/2);
}
Stepper_Step(1);
delay_us(1000000/currentSpeed);
}
}
自定义轻量级通信协议:
code复制帧格式:| 起始(0xAA) | 目标地址 | 命令字 | 数据长度 | 数据 | 校验和 |
主机发送转速设置示例:
c复制void Send_Speed_Cmd(uint8_t addr, uint16_t speed) {
uint8_t buf[6];
buf[0] = 0xAA; // 帧头
buf[1] = addr; // 目标地址
buf[2] = 0x01; // 命令字(设置转速)
buf[3] = 2; // 数据长度
buf[4] = speed >> 8; // 转速高字节
buf[5] = speed; // 转速低字节
buf[6] = buf[1]+buf[2]+buf[3]+buf[4]+buf[5]; // 校验和
UART_Send(buf, 7);
}
测试项目:
测试数据示例:
| 占空比 | 空载转速(RPM) | 50g负载转速(RPM) |
|---|---|---|
| 30% | 650 | 620 |
| 50% | 1050 | 980 |
| 70% | 1450 | 1350 |
测试方法:
优化措施:
现象:转速显示值周期性波动(±50RPM)
排查过程:
现象:高速运行时偶尔丢步
原因分析:
前面板设计:
程序框图关键实现:
扩展功能实现:
经过两周的密集开发与调试,我们成功实现了所有基础要求和发挥部分要求。系统的主要创新点包括:
实际测试表明:
可能的改进方向: