学习STC51单片机35(芯片为STC89C52RCRC)智能小车3(PWM调速小车)
每日一言
生活不会辜负每一个用力奔跑的人,你只管努力,时间自有答案。
案例:PWM调速小车
回忆一下有更加了解:
PWM(脉冲宽度调制)是一个通用的控制概念,其核心是通过调节脉冲信号的占空比来实现对目标对象的控制。由于这一特性,PWM 技术被广泛应用于电子、电机控制、通信、电源管理等多个领域的各类模块和系统中。以下是具体说明:
是的!PWM 调速的核心就是通过计算平均电压来控制负载(如电机、LED 等)的能量输入。
小车 PWM 调速的核心原理并非利用惯性,而是通过脉冲宽度调制技术来控制电机的平均电压,从而调节转速。不过,在实际应用中,电机的机械惯性会影响调速的动态响应效果。以下是具体分析:
一、PWM 调速的基本原理
1. PWM(脉冲宽度调制)的工作机制
- 方波信号:通过微控制器(如 Arduino、STM32)输出高频方波信号(通常频率为 10-20kHz),信号的周期固定,但高电平持续时间(脉冲宽度)可调。
- 占空比:高电平时间占整个周期的比例,例如占空比 50% 表示方波一半时间为高电平,一半为低电平。
- 平均电压控制:电机两端的平均电压与占空比成正比。例如,占空比 100% 时电机接全电压(全速),占空比 50% 时平均电压为电源电压的一半,转速相应降低。
2. 电机的响应特性
- 直流电机:在 PWM 信号作用下,电机通过电感的续流效应(非惯性)维持连续转动。当方波为高电平时,电机通电加速;低电平时,由于电感存在,电流不会立即中断,而是通过续流二极管维持回路,电机依靠电磁惯性(而非机械惯性)继续转动。
- 转速与占空比的关系:在理想情况下(忽略摩擦、负载等),电机转速与 PWM 占空比近似线性相关。
二、惯性在调速中的作用
虽然 PWM 调速的核心是电气控制,但机械惯性会影响调速的动态过程:
1. 加速 / 减速时的惯性延迟
- 当增大占空比(提高目标转速)时,电机需要克服负载的机械惯性(如小车质量、车轮摩擦)才能达到新转速,因此转速不会瞬间跳变,而是有一个上升过程。
- 反之,减小占空比时,电机也不会立即停转,而是因机械惯性逐渐减速。
2. 惯性对控制精度的影响
- 在需要快速启停或精确调速的场景中(如机器人避障),机械惯性可能导致调速滞后,需通过 PID 控制算法补偿,而非依赖惯性本身。
三、常见误区:惯性与续流的区别
- 续流效应(电磁惯性):由电机电感和续流二极管引起,确保 PWM 低电平时电流连续,属于电路特性,与机械惯性无关。
- 机械惯性:指电机转子和小车运动部件的惯性质量,影响转速变化的快慢,是物理特性。
四、总结
- 核心原理:PWM 调速通过调节占空比改变电机平均电压,实现转速控制,本质是电气控制,而非利用惯性。
- 惯性的角色:机械惯性会影响调速的动态响应速度,但属于被动的物理特性,不是调速的原理依据。
- 应用建议:若需提高调速精度,可结合 PID 算法补偿惯性延迟,或选择低惯性电机(如空心杯电机)以提升响应速度。
我的话来总结一下哈:PWM就是计算平均电压,平均电压大就快,小就慢,这个电压大小与每个周期内的高电平占空比有关,也就是,高电平的时间占比越大,那么电压就越大,反则越慢
OK我们来写代码:
我将会将每一段代码的下方进行代码块解释
main.c文件里面是要将我们的定时器初始化函数调用, 还有一点这个extern我之前讲过,这个关键字就是需要用到本工程其他.c文件的数据的时候,因为我们也不可能去自己定义一个,本身就是错误的思想,因为县长村长和村长张三是不一样的,而且变量也不允许重复定义语法层面也会报错,正确用法是当main.c文件需要使用time0.c文件的speed数据,那么我们使用这个关键字就可以直接使用time0.c的speed数据了
好的while里面就是把speed分别切换成18和40,当18的时候就是占空比为45%,那么就是平均电压也只有2.7v了(我是4节电池共6v),所以小车就慢了嘛,如果看实际的现象也很明显,一个轮子转得快一个转得慢
这个是延时函数
我们PWM肯定是要配置定时器的,这个是毋庸置疑的,因为PWM就是需要我们配置高低电平的各自占用时长,那么我们要定一个好计算的基础单位,比如这边我们使用0.5ms作为基础单位,因为我们知道我们使用的是50hz的频率,所以周期是20ms 20ms怎么算的(1/50=0.02s ->20ms ) 20ms正好是40个0.5ms这样有利于我计算高电平的占空比。 当然了也可以自己配置其他的定时和频率,像我们这个L9110s这个电机是可以适配50hz的,但是也有其他的频率比如1khz 等等
这边就是我们的定时器中断,上一段代码是配置定时器,这个是中断函数,也是配置PWM波形的主要核心区,我们控制0.5ms的数量来模拟高电平的占空比,这边我们定义一个count是为了累加0.5ms 的数量,speed就是高电平的数量了,count会去检测是否高电平的数量是否到达speed的值,如果到了,那么就将剩下的时间全部转换成低电平,这样我们仅需要在main.c文件里面将speed赋值,我们想要的占空比越高也就是speed越高但是小于40,越高电压就越大,那么就小车的速度越快。反之越慢。
dalay.h头文件声明函数
motor.h声明函数
time0.h声明函数