当前位置: 首页 > news >正文

JL杰理AC696N开发板PWM波形生成与控制(1):频率、占空比

引言

PWM这玩意儿,做调光、调速、甚至模拟音频都离不开。JL杰理AC696N的定时器自带PWM输出功能,配置起来不算复杂,但真要调出稳定的波形,有几个坑是绕不开的。比如初始化的时候LED会闪一下、占空比设0反而输出一个高电平、想换个引脚输出还得搞清楚通道映射。之前在AC696N开发板上调PWM驱动呼吸灯和电机,把这些小问题都踩了一遍,整理出来方便后面用的时候直接抄。


PWM常用于控制灯光亮度、电机速度等。JL杰理AC696N芯片的定时器支持灵活的PWM输出。

PWM的核心参数是频率和占空比。

如图,高电平的时间(1ms) + 低电平的时间(3ms) = 4ms(一个周期)

频率 = 1s / 4ms = 250HZ

高电平时间 / 一个周期时间 = 1ms / 4ms = 25%(占空比)

使用timer_pwm_init函数可以初始化指定定时器产生PWM。需要传入定时器(如JL_TIMER3)、频率(Hz)、初始占空比(0-10000对应0-100%)和输出引脚。

每个定时器有对应的硬件引脚,也可通过通道映射(如CH2_T3_PWM_OUT)输出到其他引脚,但需注意避免IO冲突和定时器被系统占用(如TIMER1、TIMER2)。

常见问题包括:

初始化时LED闪烁,可通过先设置周期和占空比再开启计数模式解决;

占空比设为0时可能出现一个周期的高电平,需调整寄存器操作顺序;

void set_timer_pwm_duty(JL_TIMER_TypeDef *JL_TIMERx, u32 duty) { if(duty == 0){ if(JL_TIMERx->PWM == 0){ return; } //计时标志,进来此函数前PB3已经设置为高电平,PB3部分控制可省略 JL_PORTB->OUT &= ~BIT(3); /*周期内低电平时期进入此函数,强制延长半个到一个周期等下一个周期下降沿再触发, 防止一个周期最后1us左右时间触发此函数导致的程序执行时间不够导致极短时间的高电平*/ if(JL_TIMERx->CNT > JL_TIMERx->PWM){ while(JL_TIMERx->CNT > JL_TIMERx->PWM){ delay(1); } while(JL_TIMERx->CNT < JL_TIMERx->PWM){ delay(1); } } //周期内高电平时间进入此函数,等周期内低电平时间触发 while(JL_TIMERx->CNT < JL_TIMERx->PWM){ delay(1); } //关闭PWM波形 JL_TIMERx->CON &= ~BIT(8); //时间标志 JL_PORTB->OUT |= BIT(3); } else{ //开启PWM JL_TIMERx->CON |= BIT(8); } JL_TIMERx->PWM = (JL_TIMERx->PRD * duty) / 10000; //0~10000对应0~100% //时间标志 JL_PORTB->OUT &= ~BIT(3); } void timer_pwm_test(void) { //PB3为了计时设置,可以去掉 gpio_set_pull_down(IO_PORTB_03,0); gpio_set_pull_up(IO_PORTB_03,0); gpio_set_direction(IO_PORTB_03,0); timer_pwm_init(JL_TIMER3, 100000, 2000, IO_PORTB_05, 0); } //测试按键消息 case KEY_SET_PWM: log_info("KEY_SET_PWM\n"); static int pwm_flag = 0; JL_PORTB->OUT |= BIT(3); if(pwm_flag){ set_timer_pwm_duty(JL_TIMER3,0); pwm_flag = 0; } else{ set_timer_pwm_duty(JL_TIMER3,5000); pwm_flag = 1; } break;

问题波形1(占空比变为0时1周期的高电平):

问题波形2(周期末尾操作寄存器执行时间不够导致波形顺延到下周期才执行):

以及操作寄存器时机不当导致波形顺延。

理解时钟源选择(系统时钟或晶振时钟)对产生高频率PWM也至关重要。


总结

PWM配置看着简单,但细节决定成败。

定时器别跟系统冲突,TIMER1和TIMER2通常被系统占用,建议用TIMER3及以后的。

初始化顺序很重要,先配周期和占空比,再开计数,不然会看到一个意外的脉冲。占空比从0到10000对应0%到100%,想设50%就写5000。

如果需要高频率输出(比如几十kHz以上),时钟源选系统时钟,别选晶振时钟,频率上限更高。

建议在AC696N开发板上先用示波器把基础波形抓出来,确认频率和占空比都对得上,再往实际应用里套,省得后面调半天分不清是代码问题还是硬件问题。

http://www.cnnetsun.cn/news/1695564.html

相关文章:

  • new AbortController()
  • React生态学习路线
  • 【skill-creator 】技术解析:Claude Code 元技能系统的设计原理与核心特点
  • 终极指南:如何使用novel-downloader构建你的个人小说离线图书馆
  • AP和CP区别
  • error: passing ‘const CameraRuntime’ as ‘this’ argument discards qualifiers [-fpermissive]
  • 跨境支付风控难?查IP归属地如何识别交易风险与合规隐患
  • BooruDatasetTagManager架构解析:构建高效AI训练数据集标签管理系统的设计哲学与实践
  • 常用芯片引脚图,原理图
  • claude skill 官方评测方式解读
  • 告别低效搜索:GitHub宕机时,用快马AI快速生成效率工具代码
  • Product Hunt 每日热榜 | 2026-04-04
  • 2026年6款AI驱动的人力系统测评:谁更适合科技企业
  • MouseClick:解放双手的跨平台鼠标自动化神器,告别重复点击的烦恼
  • 2025届最火的五大降重复率平台解析与推荐
  • 深度解析ComfyUI-Easy-Use中Flux采样器Guidance参数的技术实现与优化策略
  • ANSYS焊接与增材制造仿真专题:温度场、应力场及热应力分析实例详解(附APDL代码)
  • 2026全网首发:Claude Code 终端智能体系统底层架构拆解(附3万字PDF白皮书)
  • 中医诊疗智能化革命:仲景大语言模型如何重塑传统医学知识传承
  • 【工业互联网合集】300余份工业互联网大脑、工业互联网平台、工业互联网体系、工业互联网平台、工业互联网应用方案资料合集(PPT+WORD)
  • APK状态检测工具
  • Autodesk全系列产品许
  • Qwen3语义搜索快速上手:自定义知识库,实时查询结果
  • spring-ai 第一步集成入门
  • 如何快速安装AdGuard浏览器扩展:终极隐私保护与广告拦截指南
  • Transformer在单目标跟踪中的演进:从基础架构到前沿应用
  • 《三维空间智能体(3D Spatial Agent)体系
  • 设计露营简易餐具套装,轻量化一次性可降解,输出:户外爱好者低成本装备。
  • 从报错到解决:ipmitool lan与lanplus接口区别详解(避坑指南)
  • 从零搭建eNSP实验环境:手把手教你用Cloud桥接真机并开启SSH(避坑指南)