完整教程:K230基础-PWM控制介绍及应用

news/2025/9/25 18:29:09/文章来源:https://www.cnblogs.com/slgkaifa/p/19111743

完整教程:K230基础-PWM控制介绍及应用

第三章 PWM控制-K230精准时序输出

本章目标
掌握 K230 的 PWM(脉宽调制)系统架构,理解频率、占空比、分辨率等核心概念,学会在 MicroPython 中配置和使用 PWM 模块,实现 LED 呼吸灯、舵机控制、电机调速、音频输出 等经典应用。


1. PWM 基础概念

1.1 什么是 PWM?

PWM(Pulse Width Modulation,脉宽调制) 是一种通过调节脉冲宽度(高电平持续时间) 来控制平均输出电压/功率的技术。

核心思想
通过快速开关(如 1kHz),利用负载惯性(人眼、电机、舵机)实现“模拟量”控制。


1.2 PWM 典型应用场景

应用推荐频率说明
LED 亮度调节100Hz ~ 1kHz人眼无闪烁,平滑调光
舵机控制50Hz(20ms)标准舵机周期
直流电机调速1kHz ~ 20kHz频率越高,噪声越小
蜂鸣器发声1kHz ~ 5kHz不同频率对应不同音调
DAC 模拟输出10kHz+配合 RC 低通滤波

2. K230 PWM 系统架构

2.1 硬件资源

K230 提供 多个独立 PWM 通道(通常 8 个或更多),每个通道:

  • 独立设置频率、占空比
  • 支持极性反转(高有效/低有效)
  • 支持死区控制(用于电机 H 桥)
  • 时钟源可选(系统时钟分频)

关键优势
多通道独立运行,不占用 CPU 资源,适合并行控制多个设备。


2.2 FPIOA 映射(必须配置!)

PWM 输出必须通过 FPIOA 映射到物理引脚!

常见 PWM FPIOA 功能编号:

功能名FPIOA 编号说明
PWM0_OUT80PWM 通道 0
PWM1_OUT81PWM 通道 1
PWM2_OUT82PWM 通道 2
PWM7_OUT87PWM 通道 7

重要
不同开发板默认引脚不同!请查阅原理图或官方文档。


3. MicroPython PWM 配置与使用

3.1 导入模块

from fpioa_manager import fm
from machine import PWM

3.2 初始化流程(四步法)

步骤1:FPIOA 映射
fm.register(pin_number, fm.fpioa.PWMx_OUT) # x = 0~7
步骤2:创建 PWM 对象
pwm = PWM(PWM.PWMx, freq=1000, duty=50, pin=pin_number)
步骤3(可选):动态调整参数
pwm.freq(2000) # 设置频率为 2000Hz
pwm.duty(75) # 设置占空比为 75%
步骤4:关闭 PWM
pwm.deinit() # 释放资源,停止输出

4. 实战项目一:LED 呼吸灯

4.1 硬件连接

假设:Pin12 默认未被占用,支持 PWM 输出


4.2 完整代码

from fpioa_manager import fm
from machine import PWM
import utime
# === 1. FPIOA 映射 ===
fm.register(12, fm.fpioa.PWM0_OUT) # 映射 Pin12 到 PWM0
# === 2. 初始化 PWM ===
pwm = PWM(PWM.PWM0, freq=1000, duty=0, pin=12) # 初始占空比0%
print("开始呼吸灯效果...")
# === 3. 呼吸灯循环 ===
try:
while True:
# 逐渐变亮
for i in range(0, 101, 2): # 0% → 100%,步长2
pwm.duty(i)
utime.sleep_ms(20)
# 逐渐变暗
for i in range(100, -1, -2): # 100% → 0%,步长-2
pwm.duty(i)
utime.sleep_ms(20)
except KeyboardInterrupt:
print("程序被中断")
finally:
pwm.deinit() # 清理资源
print("PWM 已关闭")

优化技巧

  • 使用 sin() 函数实现更平滑的亮度变化
  • 调整 freqsleep_ms 控制呼吸速度

5. 实战项目二:舵机控制(SG90)

5.1 舵机原理

占空比计算


5.2 硬件连接

  • 舵机信号线 → 物理引脚 13
  • 舵机 VCC → 5V(注意:K230 GPIO 为 3.3V,舵机需独立供电!)
  • 舵机 GND → 开发板 GND

5.3 完整代码

from fpioa_manager import fm
from machine import PWM
import utime
# === 1. FPIOA 映射 ===
fm.register(13, fm.fpioa.PWM1_OUT) # 映射 Pin13 到 PWM1
# === 2. 初始化 PWM(50Hz)===
pwm = PWM(PWM.PWM1, freq=50, duty=0, pin=13)
# === 3. 舵机角度函数 ===
def set_servo_angle(angle):
"""
设置舵机角度 (0° ~ 180°)
对应占空比: 2.5% ~ 12.5%
"""
if angle <
0:
angle = 0
elif angle >
180:
angle = 180
# 线性映射:0°→2.5%, 180°→12.5%
duty = 2.5 + (angle / 180.0) * 10.0
pwm.duty(int(duty)) # 注意:duty() 接受整数
print("舵机测试:0° → 90° → 180° → 90° → 0°")
try:
angles = [0, 90, 180, 90, 0]
for angle in angles:
print(f"转动到 {angle
}°")
set_servo_angle(angle)
utime.sleep_ms(1000) # 保持1秒
except KeyboardInterrupt:
pass
finally:
pwm.deinit()
print("舵机控制结束")

⚠️ 重要提醒

  • 舵机需要 5V 供电,不可直接用 K230 3.3V 供电!
  • 信号线可直接连接(3.3V TTL 兼容 5V 输入)

6. 高级技巧与性能优化

6.1 使用 Timer 实现非阻塞 PWM 控制

避免 sleep_ms() 阻塞主循环:

from machine import Timer
def breath_led(timer):
global brightness, direction
brightness += direction * 2
if brightness >= 100:
brightness = 100
direction = -1
elif brightness <= 0:
brightness = 0
direction = 1
pwm.duty(brightness)
# 初始化
brightness = 0
direction = 1
pwm = PWM(PWM.PWM0, freq=1000, duty=0, pin=12)
# 启动定时器(每50ms调用一次)
Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC, period=50, callback=breath_led)
# 主循环可执行其他任务
while True:
# do other things...
utime.sleep_ms(1000)

6.2 多通道 PWM 并行控制

# 控制两个 LED 呼吸(相位相反)
fm.register(12, fm.fpioa.PWM0_OUT)
fm.register(13, fm.fpioa.PWM1_OUT)
pwm0 = PWM(PWM.PWM0, freq=1000, duty=0, pin=12)
pwm1 = PWM(PWM.PWM1, freq=1000, duty=100, pin=13) # 初始相反
while True:
for i in range(0, 101, 2):
pwm0.duty(i)
pwm1.duty(100 - i) # 相反效果
utime.sleep_ms(20)

7. 常见问题与调试

❌ 问题1:PWM 无输出

排查

❌ 问题2:舵机抖动/不转

排查

  • 供电是否独立且充足(5V/1A+)?
  • 占空比是否在 2.5%~12.5% 范围内?
  • 频率是否为 50Hz?
  • 信号线接触是否良好?

❌ 问题3:频率不准

原因

解决

# 查看实际设置的频率(部分平台支持)
print(pwm.freq()) # 可能返回实际值,非设置值

8. 性能边界与限制

参数K230 MicroPython 限制
最高频率~1MHz(实测约 500kHz 稳定)
占空比分辨率通常 0~100 整数(1% 步进)
通道数8 个独立通道
同步控制不支持多通道硬件同步

如需更高精度(如音频 DAC),建议使用 I2S + DACC 语言裸机开发


本章你已掌握

  • PWM 原理与应用场景
  • K230 PWM + FPIOA 配置流程
  • LED 呼吸灯实现
  • 舵机精确角度控制
  • 非阻塞定时器控制
  • 多通道并行 PWM
  • 常见问题排查

下一步预告
第四章:UART 串口通信 —— 与 PC、蓝牙模块、ESP8266 通信,实现无线控制与数据传输!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是UDFScript用户自定义脚本

本文分享自天翼云开发者社区《什么是UDFScript用户自定义脚本》.作者:郭****迎 UDFScript介绍 用户自定义脚本(User Defined Script,简称UDFScript)是一个可供您快速实现CDN定制化配置的工具箱,当CDN的标准配置无…

高端网站设计中的微交互:细节如何决定用户体验

高端网站设计中的微交互:细节如何决定用户体验在高端网站设计的语境下,“视觉审美”已经不再是唯一的竞争点。真正能打动用户、建立长期信任的,是那些嵌入在每一次操作、点击、过渡中的细节优化。微交互(Microinte…

合肥建设干部学校网站首页凡科 做网站

[原创]好买财富接口测试自动化实践

安徽建设工程信息网站广西建设工程协会网站

项目hbase数据库出现很诡异的assignment &#xff0c;region移动的src和dest都是同一台regionserver&#xff0c;不过时间戳不同&#xff0c;启动的只有一个regionserver&#xff0c; 不知道怎么出现了两个时间戳 分析下源码解决一下 loadbalance只有一个实现 org.apache.hado…

软件开发公司如何通过 UI 设计服务打造差异化竞争力

软件开发公司如何通过 UI 设计服务打造差异化竞争力在数字化浪潮推动下,软件开发行业的竞争越来越激烈。功能上的差异化正逐渐缩小,技术壁垒也因开源生态与低代码平台而降低。在这种背景下,UI设计服务逐渐成为软件开…

CCPC2024-Zhengzhou G Same Sum(线段树)

CCPC2024-Zhengzhou G Same Sum 给一个序列。两种操作:区间加;查询一个偶数长区间,其中的值是否可以两两配对得到和相等。首先知道区间内的值两两配对得到的相等的和值为区间的平均数 m 。 可以转化为,这个区间的值…

短剧小程序开发全攻略:从技术选型到核心实现(前端+后端+运营干货) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Openwrt-DDNS 配置详解

在家庭或小型办公网络环境中,我们通常使用的是动态IP地址,这意味着每次重新连接互联网时,ISP可能会分配一个新的IP地址。这对于需要远程访问家庭网络中的设备(如NAS、监控摄像头或自建服务器)的用户来说是个问题。…

实用指南:Metal - 2. 3D 模型深度解析

实用指南:Metal - 2. 3D 模型深度解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

【2025.9.16】关于举办PostgreSQL数据库管理人才研修与评测班的通知

证书实图考核通过后,由工信部人才交流中心颁发证书,并纳入工信人才数据库 报名方式工信部人才交流中心组织的PostgreSQL认证,从2021起已经运营四年多时间,且获得行业高度认可,人大金仓、金蝶集团、迪思杰、用友、…

Java锁相关问题

1.Java中有那些锁,区别是什么 1.java中的锁主要分为乐观锁和悲观锁,其中CAS是乐观锁,synchronized、Lock是悲观锁。2.乐观锁认为我在操作的时候不会有其余的线程竞争,如果有竞争就自旋等待(CAS)或异常结束(数据…

CDN中使用边缘函数实现自定义编程

本文分享自天翼云开发者社区《CDN中使用边缘函数实现自定义编程》.作者:郭****迎 为什么选择边缘函数千人千面,个性化定制,源站计算成本高: 企业网站为了提升用户转化率,往往需要在源站服务器根据用户历史数据,计…

第一次课程中的所有动手动脑的问题以及课后实验性的问题

第一次课程中的所有动手动脑的问题以及课后实验性的问题 (我将其以压缩包的形式上传到了博客的文件中) https://files.cnblogs.com/files/blogs/848082/第一次课程.zip?t=1758794756&download=true (一)枚举类…

敏捷开发的几个阶段

目录阶段1:认知启蒙期(入门)——“知道敏捷是什么”阶段特征:阶段2:实践落地期(初级)——“能用敏捷做项目”阶段特征:阶段3:问题优化期(中级)——“能解决敏捷中的坑”阶段特征:阶段4:体系化期(高级)—…

公司网站开发怎么做账wordpress更新网站内容

python脚本查找文件是否存在的方法&#xff1a;1、使用os模块os模块中的os.path.exists()方法用于检验文件是否存在。判断文件是否存在import osos.path.exists(test_file.txt)#Trueos.path.exists(no_exist_file.txt)#False2、使用Try语句可以在程序中直接使用open()方法来检查…

网站建设一年600js做的网站

java微服务面试题 Q:为什么要用微服务&#xff1f;微服务有哪些优势&#xff1f; 单体应用把所有功能都堆放在一起&#xff0c;改动影响大&#xff0c;风险高。 微服务具有以下优势&#xff1a; 针对特定服务发布&#xff0c;影响小&#xff0c;风险小&#xff0c;成本低。 频…

青岛seo网站建设公司软件网页制作

面向对象编程特征&#xff1a;抽象化&#xff0c;讲究对象&#xff0c;集成&#xff0c;封装&#xff0c;多态。 类&#xff1a;一类事物&#xff0c;苹果&#xff0c;梨&#xff0c;香蕉都是水果&#xff0c;都是一类。 类的特征&#xff1a;构造函数&#xff0c;字段属性和方…

实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现 - 教程

实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-…

【2025最新】ArcGIS 点聚合功能实现全教程(进阶版) - 实践

【2025最新】ArcGIS 点聚合功能实现全教程(进阶版) - 实践2025-09-25 18:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importa…

隐藏在众目睽睽之下:从PEB中解除恶意DLL的链接

本文深入探讨了一种恶意软件用于隐藏注入DLL的反取证技术。详细解析了Windows进程环境块(PEB)的结构,并展示了如何通过操作PEB中的三重双向链表来隐藏已加载的恶意DLL,包括具体的代码实现和检测方法。隐藏在众目睽睽…