当前位置: 首页 > 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.jsqmd.com/news/588288/

相关文章:

  • C++ 与 事务多版本并发控制(MVCC):在 C++ 存储内核中利用时间戳排序实现无锁读写冲突控制
  • MT5专业交易面板
  • 基于stm32单片机的仔猪喂饲系统设计
  • Git从入门到精通:原理、实战与企业级协作全攻略
  • React生态学习路线
  • 图片调色思路分享
  • 告别手动刷新:用快马生成自动化工具,高效锁定jxx登录页最新域名
  • 高性能负载均衡
  • KART-RERANK在互联网广告场景的应用:广告创意与搜索词的相关性优化
  • 游标分页与服务器端游标的对比分析
  • 工具篇:诊断延迟的利器——SHOW SLAVE STATUS详解
  • 【skill-creator 】技术解析:Claude Code 元技能系统的设计原理与核心特点
  • 如何让老旧苹果电脑重获新生:OpenCore Legacy Patcher完全指南
  • 新手福音:在快马平台用代码复刻ps基础功能,轻松入门图像处理
  • 我的编程之旅——第一篇博客
  • [JAVA探索之路]带你手写多线程实现生产者-消费者模型
  • C++的std--ranges算法并行执行数据竞争检测
  • 第06章langchain之向量化和向量数据库
  • 实战指南:基于快马AI构建企业级域名监控与故障切换管理平台
  • 找到一种方法:用LM Studio 和 llmster 可以把qwen3.5改成nothinking版本装载来提高响应速度
  • 别再找了,这应该是目前最好用的翻译插件了。
  • TongWeb8.0支持JBoss Weld‌
  • 基于单片机的水产养殖饲料自动投喂系统
  • NCMDump解密指南:三步解锁网易云音乐加密文件的终极方案
  • 嘿,今天来跟大家聊聊基于Copula多元互相关的随机场边坡模型。这模型可有意思啦,它在边坡稳定性研究这块有着独特的魅力
  • 第6章 Mosquitto用户认证与访问控制
  • 【自动驾驶技术解析】端到端架构与感知规控演进全景(2025–2026)
  • Node.js 类
  • Java 小白必看:MySQL 主从延迟是什么?怎么排查?怎么彻底解决?
  • 全球GPU算力荒背景下,主流算力平台价格与服务对比分析