之前的两个帖子分别完成了开发环境的搭建和温度采集与显示,接下来就让我们完成一个完整的作品
基于 NXP FRDM-MCXA366 开发板,实现温控风扇系统:
P3T1755 I3C温度传感器,实时采集环境温度,精度0.01°C
GDH-1247WP 6位段码LCD屏,显示温度和风速档位
BLDC无刷电机驱动板,通过串口控制转速,温度越高转速越快
LCD屏每2秒交替显示温度值(两位小数)和当前风速档位。

硬件连接
I3C温度传感器(板载不可调整,方便代码对应)
| P1_8 | I3C0_SCL |
| P1_9 | I3C0_SDA |
段码LCD屏(板载不可调整,方便代码对应)
| P0_12~P0_23 | LCD_P16~LCD_P27 | 段码驱动 |
| P0_24~P0_27 | COM1~COM4 | 背板 |
电机驱动板(串口驱动)
| P4_5 (LPUART3_TX) | RX | 发送控制指令 |
| P4_2 (LPUART3_RX) | TX | 接收驱动板回传 |
| GND | GND | 共地 |
电机驱动板IO接口(备用,本次使用串口进行调速,实际也可使用IO进行调整)

| VSP | PWM调速(1-20KHz,3.3-5V)或 0-5V模拟调速 |
| DIR | 方向(高/悬空=正转,低=反转) |
| BRK | 急停(接地刹车) |
| FG | 转速反馈脉冲 |
电机驱动板串口控制协议
基本参数
波特率:38400(固定,不可更改)
数据格式:8N1
通信方式:半双工,MCU→驱动板单向发送指令
帧格式
每条指令固定 14字节,结构如下:
┌────────┬──────────┬──────────┬──────────┬─────────────────────┬──────────┬────────┐ │ 起始位 │ Cmd_Ctrl1│ Cmd_Ctrl2│ Len │ Data[8] │ CS │ 结束位 │ │ 0xBC │ 0x66 │ 0x03 │ 0x08 │ D1 D2 D3 D4 D5 D6 D7 D8 │ 1byte │ 0x16 │ └────────┴──────────┴──────────┴──────────┴─────────────────────┴──────────┴────────┘
| 起始位 | 0xBC | 固定帧头 |
| Cmd_Ctrl1 | 0x66 (102) | 写命令 |
| Cmd_Ctrl2 | 0x03 (3) | 设置数据 |
| Len | 0x08 (8) | 数据区长度 |
| Data[0]~Data[7] | 见下文 | 控制参数 |
| CS | 前12字节累加 & 0xFF | 校验和 |
| 结束位 | 0x16 | 固定帧尾 |
完整代码实现
#define MOTOR_FRAME_START 0xBCU
#define MOTOR_FRAME_END 0x16U
#define MOTOR_CMD_WRITE 102U
#define MOTOR_CMD_SETDATA 3U
#define MOTOR_DATA_LEN 8U
static void Motor_SendCmd(uint8_t data1, uint8_t data2, uint8_t data3, uint8_t data4)
{
uint8_t frame[14];
uint32_t i, sum;
frame[0] = MOTOR_FRAME_START;
frame[1] = MOTOR_CMD_WRITE;
frame[2] = MOTOR_CMD_SETDATA;
frame[3] = MOTOR_DATA_LEN;
frame[4] = data1; // 控制位
frame[5] = data2; // 延时L
frame[6] = data3; // 延时H
frame[7] = data4; // 占空比
frame[8] = 0x7CU; // 保留
frame[9] = 0xF9U;
frame[10] = 0x19U;
frame[11] = 0x00U;
// 校验和
sum = 0;
for (i = 0; i < 12; i++) sum += frame[i];
frame[12] = (uint8_t)(sum & 0xFFU);
frame[13] = MOTOR_FRAME_END;
// 逐字节发送
for (i = 0; i < 14; i++) {
LPUART_WriteByte(MOTOR_LPUART, frame[i]);
while (!(kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(MOTOR_LPUART)));
}
}温控调速逻辑
#define TEMP_THRESHOLD 30.0
#define SPEED_DUTY_LOW 10U // 低温: 10%占空比
#define SPEED_DUTY_HIGH 100U // 高温: 100%全速
static void Motor_UpdateByTemperature(double temperature)
{
if (temperature >= TEMP_THRESHOLD) {
// Data1=0x01: 串口控制+正转+不刹车
Motor_SendCmd(0x01U, 0x00U, 0x00U, SPEED_DUTY_HIGH);
} else {
Motor_SendCmd(0x01U, 0x00U, 0x00U, SPEED_DUTY_LOW);
}
}串口输出
P3T1755 + SLCD + Motor (I3C) P3T1755 dynamic address set OK P3T1755 sensor initialized Motor UART init OK, set serial control mode System running. Temp: 28.50 C Duty: 10% Temp: 29.12 C Duty: 10% Temp: 30.25 C Duty: 100% Temp: 30.19 C Duty: 100%
总结
这个项目整合了 MCXA366 的 I3C、SLCD、LPUART 三个外设。串口控制电机驱动板的关键在于读懂电机驱动配套的命令结构。
我要赚赏金
