从玩具小车到智能风扇STM32F103C8T6核心板PWMULN2003A的5个创意项目实践在创客的世界里STM32F103C8T6核心板就像一块神奇的画布而PWM和ULN2003A则是你手中的画笔。当这三者相遇便能创造出无数令人惊叹的作品。本文将带你超越基础教程探索五个既实用又有趣的项目从可调速迷你风扇到远程控制的智能小车每个项目都经过精心设计确保可复现性和趣味性。1. 可调速迷你风扇夏日桌面好伙伴炎炎夏日一个由你亲手打造的迷你风扇不仅能带来清凉更是展示技术实力的绝佳方式。这个项目将利用STM32的PWM功能通过ULN2003A驱动直流电机实现无级调速。硬件清单STM32F103C8T6核心板ULN2003A驱动模块5V直流电机带风扇叶片电位器10kΩ杜邦线若干核心代码片段// PWM初始化 void PWM_Init(uint16_t arr, uint16_t psc) { // 初始化代码与上文类似此处省略 // 设置定时器3通道2为PWM输出 } // 主函数中读取电位器值并设置PWM int main() { ADC_Init(); // 初始化ADC PWM_Init(899, 0); // 80kHz PWM频率 while(1) { uint16_t adc_val ADC_Read(0); // 读取电位器值 uint16_t pwm_val adc_val * 900 / 4095; // 映射到PWM范围 TIM_SetCompare2(TIM3, pwm_val); // 设置PWM占空比 delay_ms(50); } }调试技巧如果电机启动困难可以尝试在程序中设置一个最小启动PWM值如50确保电机能顺利启动后再响应电位器调节。2. 循迹小车的差速控制智能移动的第一步循迹小车是入门机器人领域的经典项目。通过两个直流电机和红外传感器我们可以实现基础的自动导航功能。关键在于如何利用PWM实现精准的差速控制。关键组件两个直流电机带减速箱红外循迹模块TCRT50007.4V锂电池电机固定支架和车轮差速控制逻辑表传感器状态左中右左轮PWM右轮PWM小车动作0 1 070%70%直行1 0 030%70%右转0 0 170%30%左转1 1 10%0%停止电机驱动代码优化// 设置左右电机速度 void Set_Motor_Speed(uint8_t left, uint8_t right) { // 限制PWM范围在30%-70%防止打滑 left constrain(left, 30, 70); right constrain(right, 30, 70); // 转换为实际PWM值假设ARR899 uint16_t left_pwm map(left, 0, 100, 0, 899); uint16_t right_pwm map(right, 0, 100, 0, 899); TIM_SetCompare2(TIM3, left_pwm); // 左电机 TIM_SetCompare1(TIM4, right_pwm); // 右电机 }注意ULN2003A的每个通道最大电流为500mA如果电机电流较大建议将两个通道并联使用或考虑使用更强大的驱动如L298N。3. PWM模拟舵机控制低成本的角度解决方案标准舵机价格较高且需要特定信号而我们可以用普通直流电机PWM模拟实现简单的角度控制非常适合对精度要求不高的场景。实现原理电机通过减速箱增加扭矩末端安装电位器作为位置反馈PID控制算法调节PWM输出限位开关保护防止过转PID控制核心代码typedef struct { float Kp, Ki, Kd; float integral, prev_error; } PID_Controller; float PID_Update(PID_Controller* pid, float setpoint, float actual) { float error setpoint - actual; pid-integral error; float derivative error - pid-prev_error; pid-prev_error error; return pid-Kp * error pid-Ki * pid-integral pid-Kd * derivative; } // 使用示例 PID_Controller pid {0.8, 0.05, 0.1, 0, 0}; float target_angle 90.0; // 目标角度 while(1) { float current_angle Read_Potentiometer(); // 读取当前位置 float output PID_Update(pid, target_angle, current_angle); uint16_t pwm constrain(output, 0, 100); // 限制输出范围 Set_Motor_PWM(pwm); delay_ms(20); }硬件连接示意图电位器 —— ADC引脚 电机 —— ULN2003A —— STM32 PWM 限位开关 —— GPIO输入4. 蓝牙远程调速手机控制你的创造物通过HC-05蓝牙模块我们可以用手机APP远程控制电机转速为项目添加无线交互能力。实现步骤配置HC-05蓝牙模块AT命令设置手机端安装蓝牙串口APP如蓝牙串口STM32接收串口数据并解析根据指令调整PWM输出串口通信处理代码// 在串口中断中处理数据 void USART1_IRQHandler() { if(USART_GetITStatus(USART1, USART_IT_RXNE)) { static char buffer[10]; static uint8_t index 0; char c USART_ReceiveData(USART1); if(c \n) { // 命令结束 buffer[index] \0; Process_Command(buffer); index 0; } else if(index sizeof(buffer)-1) { buffer[index] c; } } } void Process_Command(char* cmd) { if(strncmp(cmd, SPEED:, 6) 0) { int speed atoi(cmd6); speed constrain(speed, 0, 100); uint16_t pwm map(speed, 0, 100, 0, 899); TIM_SetCompare2(TIM3, pwm); } }手机APP指令示例SPEED:50 设置速度为50%STOP 停止电机5. 智能光照调节系统环境感知与自动控制结合光敏电阻和PWM电机控制我们可以创建一个能自动调节遮挡板角度的智能光照系统适用于温室或家庭采光调节。系统组成光敏电阻检测环境光照直流电机控制遮光帘手动/自动模式切换OLED显示当前状态光照控制逻辑#define AUTO_MODE 1 #define MANUAL_MODE 0 uint8_t mode AUTO_MODE; uint16_t light_levels[3] {1500, 2500, 3500}; // 低、中、高光照阈值 void Auto_Light_Control() { uint16_t light Read_Light_Sensor(); uint8_t speed; if(light light_levels[0]) { speed 0; // 光线很弱完全打开 } else if(light light_levels[1]) { speed 30; // 中等光线半开 } else if(light light_levels[2]) { speed 70; // 较强光线基本关闭 } else { speed 100; // 强光完全关闭 } Set_Motor_PWM(speed); } // 在主循环中 while(1) { if(mode AUTO_MODE) { Auto_Light_Control(); } // 其他处理... delay_ms(1000); }硬件优化建议为电机添加编码器实现更精确的位置控制使用MOSFET替代ULN2003A以获得更高驱动能力增加温度传感器实现多环境参数调控添加WiFi模块实现远程监控在完成这些项目后你会发现STM32F103C8T6配合PWM和ULN2003A的组合几乎可以满足大多数小型电机控制需求。从简单的风扇调速到复杂的自动控制系统限制你的只有想象力。