这样理解PWM,想不懂都难

PWM有非常广泛的应用,比如直流电机的无极调速,开关电源、逆变器等等。个人认为,要充分理解或掌握模拟电路、且有所突破,很有必要吃透这三个知识点:

  • PWM

  • 电感

  • 纹波

PWM是一种技术手段,PWM波是在这种技术手段控制下的脉冲波。

如图1所示,这种比喻很形象也很恰当,希望对学习的朋友有所帮助与启发。

图片

图1:形象的比喻

PWM全称Pulse Width Modulation:脉冲宽度调制(简称脉宽调制,通俗的讲就是调节脉冲的宽度),是电子电力应用中非常重要的一种控制技术,在理解TA之前我们先来了解几个概念 。

脉冲波的基本信息如图2所示:

图片

图2:脉冲波的基本信息

  • 脉冲周期(T),单位是时间,比如纳秒(ns)、微妙(μs)、毫秒(ms)等;

  • 脉冲频率(f),单位是赫兹(Hz)、千赫兹(kHz)等,与脉冲周期成倒数关系,f=1/T;

  • 脉冲宽度(W),简称“脉宽”,是脉冲高电平持续的时间。单位是时间,比如纳秒(ns)、微妙(μs)、毫秒(ms)等;

  • 占空比(D),脉宽除以脉冲周期的值,百分数表示,比如50%。也常有小数或分数表示的,比如0.5或1/2。

以上之间的关系如图3所列的公式:

图片

图3:公式

工程应用中的PWM波是幅值、周期(或频率)不变,脉宽(或占空比)可调的脉冲波。接下来我们来认清该PWM波到底是什么,TA隐藏着什么思想?

如果我们想要控制一个直流电机的转速,我们可以通过改变其两端电压即可;但是该种方法有很大的局限性,可调直流电源构造复杂、成本高昂,应用起来很不现实。

所以我们采用另外的控制方式:电压源→驱动器→直流电机,电压源提供直流电压,不同的驱动器控制不同的直流电机,应用非常灵活。其中驱动器对电机的调速控制就是利用PWM。

可调直流电源控制与PWM控制都能调速,那么它们有什么相同之处呢?

图4~图7电机为某相同转速时红色代表驱动器输出幅值不变的PWM波,蓝色代表可调直流电源输出的电压。两者都是直接作用到负载。

图片

图4

图片

图5

图片

图6

图片

图7

由以上得知:

  1. 当PWM波的占空比越大时,所对应的直流电压与PWM波的幅值越接近;反之与0V越接近;

  2. 周期的红色PWM波脉宽下的矩形面积之和与蓝色直流电压的面积相等,即伏秒积相等:

两端同时除以T,得到如下关系式:

例如当PWM波的幅值为24V,占空比为50%时,与直流电压12V作用到电机上所产生的效果是一模一样的,即速度相同;即24V×50%=12V。

另外,既然满足这个关系,那PWM波的频率是不是可以随意了,答案当然不是,频率太低会导致电机运转不畅,振动大,噪音大;频率太高会导致驱动器开关损耗较大,甚至有电机会啸叫而不转的情况。一般1k~30k的PWM频率较为普遍,几百Hz的也有,实际上还是根据电机功率在测试时确定合适的PWM频率范围为宜。

图8为实物测试,脉宽在变化,周期不变的PWM波,所加负载如图9所示。

图片

图8:扭动旋钮控制脉宽变化

图9为实物测试,有刷直流电机的PWM无极调速,其中LED是并联在电机输入端的,其亮弱反映电机速度的变化。

图片

图9:PWM控制电机调速

要点:

①PWM波其实就是一种脉宽可连续调节的矩形脉冲波;

②占空比其实就是描述脉宽与脉冲周期的比值,是量化值,便于分析研究,当我们用占空比来表达时,对脉宽就不那么关心了;

③占空比调节就是脉宽调节,表达不一样,但本质是一样的;

④PWM波满足伏秒积计算:U红(幅值) × 占空比 = U蓝,作用效果与直流电压一样。

<think>好的,用户之前让我详细解释基于Arduino的自动行驶小车硬件设计,但我给出的回答用户表示有点看不懂,需要更详细的解释。首先,我需要回顾之前的回答,找出可能让用户困惑的地方。之前的回复结构清晰,分任务列出,但可能技术术语较多,或者某些步骤不够详细,特别是硬件选型和电路连接部分。 用户现在请求更详细的解释,可能需要更基础的说明,比如每个组件的具体作用、为什么选择这些组件,以及更详细的接线步骤。此外,用户可能对代码部分不太理解,或者对Arduino编程不熟悉,需要更详细的代码注释和逻辑解释。 接下来,我需要考虑用户的背景。用户可能刚开始接触Arduino和硬件设计,所以需要避免专业术语,或者至少在使用术语时进行解释。例如,解释什么是PWM调速、H桥电机驱动模块的作用,以及超声波传感器的工作原理。 在任务1中,硬件组件选型部分,可能需要更详细地解释每个组件的选择原因,比如为什么使用Arduino Uno而不是其他型号,锂电池和稳压芯片的作用,以及电容滤波的重要性。电路原理图部分可能需要更直观的图示,但由于文本限制,只能用文字详细描述连接方式。 任务2的硬件组装部分,用户可能需要更详细的步骤,比如如何实际安装电机到底盘,如何固定传感器,以及面包板或焊接的具体方法。调试部分可能需要分步说明如何测试每个组件,比如如何单独测试电机转动、如何验证传感器数据准确性。 任务3的优化部分,用户可能对如何降低功耗的具体方法(如MOSFET开关)不太了解,需要解释其工作原理。避障机制的代码示例可能需要更详细的注释,说明每个函数的作用,比如后退和转向的实现方式。 此外,故障排查部分可能需要更详细的步骤,比如使用万用表的具体测量点,如何判断电机是否卡死,以及如何处理电源接触不良的问题。用户可能对硬件调试不熟悉,需要更基础的操作指导。 考虑到用户可能缺乏实践经验,需要将每个步骤拆解得更细致,避免假设用户已有相关知识。例如,在电源管理电路设计中,详细说明如何连接锂电池到稳压芯片,如何并联电容,以及为什么要这样做。同样,在电机驱动电路部分,解释H桥的工作原理,保护二极管的作用,以及如何通过Arduino的PWM控制电机速度。 在代码部分,可能需要逐行解释代码的功能,特别是setup函数中的引脚设置,loop函数中的逻辑判断,以及如何使用NewPing库来获取超声波传感器的数据。用户可能对库函数不熟悉,需要说明如何安装和使用该库。 最后,在优化和改进部分,除了给出示例代码,还需要解释代码背后的逻辑,比如如何实现间歇性唤醒传感器,以及避障时小车后退和转向的具体实现方法。用户可能需要知道如何调整延迟时间和电机控制参数,以适应不同的环境。 总结来说,用户需要更基础、更详细的步骤解释,减少专业术语,增加实际操作的细节,并提供代码的详细注释和逻辑说明。同时,可能需要将复杂的电路连接分解成更小的部分,逐一解释,确保用户能够逐步理解和实现整个设计。</think>好的,我将从零基础开始分步骤详细说明整个设计过程,确保每个环节都有明确的操作指导和原理解释: --- ## **任务1:基础硬件设计(超详细版)** ### **1.1 硬件组件选型与功能说明** #### **① 主控制器** - **Arduino Uno R3** - **功能**:负责处理传感器数据、控制电机动作 - **参数**:工作电压5V,14个数字I/O引脚(其中6个支持PWM输出) - **选型理由**:性价比高,适合初学者,社区资源丰富 #### **② 动力系统** - **直流减速电机(N20型)** - **参数**:6V电压,200转/分钟,带减速齿轮 - **选型要点**:扭矩需大于小车自重(假设小车重量500g时,扭矩需≥0.5kg·cm) - **电机驱动模块(L298N)** - **功能**:将Arduino的弱电信号转换为驱动电机的强电 - **关键参数**: - 最大输出电流:2A/通道 - 驱动电压范围:5V-35V - **保护措施**: - 在电机端子并联续流二极管(1N4007) - 驱动板需加装散热片 #### **③ 感知系统** - **超声波传感器(HC-SR04)** - **工作原理**:发送40kHz超声波→接收回波→计算时间差得距离 - **接线定义**: - VCC:5V供电 - Trig:触发信号输入(高电平脉冲) - Echo:回波信号输出(脉冲宽度与距离成正比) - GND:接地 - **性能参数**: - 检测范围:2cm-400cm - 精度:±3mm(20cm内) #### **④ 供电系统** - **锂电池组(7.4V 2000mAh)** - **电压分配**: - 直接为电机驱动供电(7.4V) - 通过LM7805稳压芯片降压至5V给Arduino和传感器供电 - **电路保护**: - 输入/输出端并联电容:100μF电解电容(低频滤波)+0.1μF陶瓷电容(高频滤波) - 电池需配接保护板防止过充/过放 --- ### **1.2 电路连接详解(实物接线步骤)** #### **核心设备接线表** | 起点 | 终点 | 线材规格 | 备注 | |------|------|----------|------| | Arduino 5V | L298N逻辑电源+ | 杜邦线(红) | 驱动板逻辑供电 | | Arduino GND | L298N逻辑电源- | 杜邦线(黑) | 共地连接 | | 锂电池+ | L298N电机电源+ | 硅胶线(红,18AWG) | 主电源正极 | | 锂电池- | L298N电机电源- | 硅胶线(黑,18AWG) | 主电源负极 | | Arduino D8 | L298N IN1 | 杜邦线(黄) | 左电机方向控制1 | | Arduino D12 | L298N IN2 | 杜邦线(绿) | 左电机方向控制2 | | Arduino D7 | L298N IN3 | 杜邦线(蓝) | 右电机方向控制1 | | Arduino D11 | L298N IN4 | 杜邦线(紫) | 右电机方向控制2 | | Arduino D9 | L298N ENA | 杜邦线(白) | 左电机PWM调速 | | Arduino D10 | L298N ENB | 杜邦线(灰) | 右电机PWM调速 | | HC-SR04 VCC | Arduino 5V | 杜邦线(红) | 传感器供电 | | HC-SR04 GND | Arduino GND | 杜邦线(黑) | 传感器接地 | | HC-SR04 Trig | Arduino D2 | 杜邦线(橙) | 触发信号 | | HC-SR04 Echo | Arduino D3 | 杜邦线(黄) | 回波信号 | #### **电机接线示意图** ``` 左电机接线: L298N OUT1 → 电机红线 L298N OUT2 → 电机黑线 右电机接线: L298N OUT3 → 电机红线 L298N OUT4 → 电机黑线 ``` (若电机转向相反,交换OUT1/OUT2或OUT3/OUT4的接线) --- ## **任务2:硬件组装与调试(手把手教学)** ### **2.1 机械组装流程** 1. **底盘安装**: - 将两个直流电机用M3螺丝固定在亚克力底盘两侧 - 前部安装万向轮(可用滚珠轴承+塑料片自制) 2. **电子设备布局**: - Arduino Uno居中固定 - L298N驱动板靠近电机安装 - 超声波传感器向前伸出(建议离地高度5-10cm) ### **2.2 分模块调试方法** #### **① 电源系统测试** 1. 断开所有负载,测量锂电池输出电压应为7.4V左右 2. 连接LM7805稳压器后,测量输出端应为5V±0.1V #### **② 电机单独测试** ```arduino // 左电机测试代码 void setup() { pinMode(8, OUTPUT); pinMode(12, OUTPUT); analogWrite(9, 255); // 全速 } void loop() { digitalWrite(8, HIGH); // 正转 digitalWrite(12, LOW); delay(2000); digitalWrite(8, LOW); // 反转 digitalWrite(12, HIGH); delay(2000); } ``` (观察电机是否正反转交替,若无反应检查接线顺序) #### **③ 传感器校准** ```arduino void setup() { Serial.begin(9600); pinMode(2, OUTPUT); pinMode(3, INPUT); } void loop() { digitalWrite(2, LOW); delayMicroseconds(2); digitalWrite(2, HIGH); delayMicroseconds(10); digitalWrite(2, LOW); long duration = pulseIn(3, HIGH); float distance = duration * 0.034 / 2; Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); delay(100); } ``` (在传感器前方放置标准距离物体,验证测量值准确性) --- ## **任务3:优化与改进(进阶方案)** ### **3.1 硬件优化实施步骤** #### **低功耗改造方案** 1. **传感器间歇供电电路**: - 增加N沟道MOSFET(如IRF540N) - 控制电路: ```arduino pinMode(4, OUTPUT); digitalWrite(4, HIGH); // 开启传感器供电 delay(50); // 等待稳定 // 进行测量操作 digitalWrite(4, LOW); // 关闭供电 ``` 2. **电机驱动优化**: - 将L298N更换为DRV8833(效率提升20%) - 增加电流检测电阻(0.1Ω/2W)监测电机负载 ### **3.2 避障算法升级代码** ```arduino void avoidObstacle() { stopCar(); // 急停 delay(500); // 后退操作 setMotor(-100, -100); // 全速后退 delay(1000); // 随机转向(左或右) if(random(0,2) == 0) { // 50%概率 setMotor(-100, 100); // 左转 } else { setMotor(100, -100); // 右转 } delay(500); stopCar(); } // 电机控制函数 void setMotor(int leftSpeed, int rightSpeed) { // 左电机控制 digitalWrite(8, (leftSpeed > 0) ? HIGH : LOW); digitalWrite(12, (leftSpeed < 0) ? HIGH : LOW); analogWrite(9, abs(leftSpeed)); // 右电机控制 digitalWrite(7, (rightSpeed > 0) ? HIGH : LOW); digitalWrite(11, (rightSpeed < 0) ? HIGH : LOW); analogWrite(10, abs(rightSpeed)); } ``` --- ## **常见问题解决方案** ### **Q1:小车跑偏怎么办?** 1. **校准步骤**: - 在平坦地面标记起点 - 让小车直行3米,测量偏移量 - 通过调整PWM值补偿: ```arduino analogWrite(9, 150); // 左电机原始值 analogWrite(10, 145); // 右电机减少5个单位 ``` ### **Q2:超声波传感器误检测** 1. **软件滤波**: ```arduino #define SAMPLE_NUM 5 int getFilteredDistance() { int sum = 0; for(int i=0; i<SAMPLE_NUM; i++){ sum += sonar.ping_cm(); delay(10); } return sum/SAMPLE_NUM; } ``` --- 通过以上详细步骤,即使是零基础的学习者也能逐步完成小车的搭建。建议先用面包板搭建原型系统,待功能验证通过后再进行焊接固定。实际制作时建议佩戴防静电手环,电源接线务必做好绝缘处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值