在物联网和嵌入式开发场景中,使用php控制直流电机转速是常见需求,而通过pwm占空比调节是最稳定高效的实现方式。pwm即脉冲宽度调制,通过改变高电平在一个周期内所占的时间比例,也就是占空比,来控制电机两端的平均电压,进而实现转速调节。

核心原理说明
直流电机的转速和两端电压成正比,pwm信号的占空比越高,电机获得的平均电压就越高,转速也就越快。占空比的计算公式为:占空比 = 高电平时间 / 周期总时间 * 100%。比如周期为20ms,高电平时间为5ms时,占空比为25%,对应电机低速运转;高电平时间为15ms时,占空比为75%,电机高速运转。
硬件准备与连接
要实现php控制直流电机,需要准备以下硬件:
- 支持php运行的主控设备,比如树莓派、香橙派等
- 直流电机一个
- L298N电机驱动模块一个
- 外接电源(根据电机额定电压选择)
- 杜邦线若干
硬件连接逻辑如下:
| 树莓派引脚 | L298N引脚 | 说明 |
|---|---|---|
| GPIO18(pwm引脚) | ENA | 电机A使能端,接收pwm信号 |
| GPIO17 | IN1 | 电机方向控制引脚1 |
| GPIO27 | IN2 | 电机方向控制引脚2 |
| 5V电源 | VCC | 驱动模块逻辑供电 |
| 外接电源正极 | 12V供电端 | 电机动力供电 |
| 外接电源负极、树莓派GND | GND | 共地连接 |
| 电机正负极 | OUT1、OUT2 | 电机输出端 |
php实现pwm占空比调节的代码
树莓派等系统可以通过调用系统命令或者使用扩展库来生成pwm信号,以下是基于树莓派系统,使用php调用wiringPi库的示例代码,实现占空比从25%到100%逐步调节电机转速:
<?php
// 初始化wiringPi库,需要先安装wiringPi
if (wiringPiSetupGpio() === false) {
die("wiringPi初始化失败");
}
// 定义引脚常量
define("PWM_PIN", 18); // pwm输出引脚
define("IN1_PIN", 17); // 方向控制引脚1
define("IN2_PIN", 27); // 方向控制引脚2
define("PWM_RANGE", 1024); // pwm范围,对应占空比精度
// 设置引脚模式
pinMode(PWM_PIN, PWM_OUTPUT);
pinMode(IN1_PIN, OUTPUT);
pinMode(IN2_PIN, OUTPUT);
// 设置电机正转方向
digitalWrite(IN1_PIN, HIGH);
digitalWrite(IN2_PIN, LOW);
// 设置pwm范围
pwmSetRange(PWM_RANGE);
// 逐步调节占空比,从25%到100%,每次增加25%
$dutyCycles = [256, 512, 768, 1024]; // 对应25%、50%、75%、100%占空比
foreach ($dutyCycles as $duty) {
pwmWrite(PWM_PIN, $duty);
echo "当前占空比:" . ($duty / PWM_RANGE * 100) . "%,电机转速提升n";
sleep(3); // 每个占空比运行3秒
}
// 停止电机
pwmWrite(PWM_PIN, 0);
digitalWrite(IN1_PIN, LOW);
digitalWrite(IN2_PIN, LOW);
echo "电机已停止n";
?>
注意事项
- 运行php代码前需要确保已经安装wiringPi库,并且php有权限调用相关函数,部分系统需要给php进程添加sudo权限
- 电机驱动模块的外接电源需要和主控设备共地,否则pwm信号可能无法正常识别
- 占空比调节范围需要根据电机的实际额定电压调整,避免占空比过高导致电机过载烧毁
- 如果需要更精细的调速,可以增大PWM_RANGE的值,提升占空比调节精度
通过上述方法,就可以实现php通过pwm占空比调节直流电机转速的需求,开发者可以根据实际项目需求调整占空比的计算逻辑和控制流程。