32-JL杰理AC696N开发板PWM波形生成与控制(1):频率、占空比配置
引言
PWM调光、调速、甚至模拟发声,这些场景做嵌入式的天天见。JL杰理AC696N的定时器可以灵活输出PWM,但很多新手上来就问:频率设多少合适?占空比精度够不够?定时器选哪个不冲突?
最近用AC696N开发板调PWM的时候把这些基础问题都过了一遍,把频率、占空比、时钟源、引脚映射这些配置要点整理出来,方便写代码的时候直接参考。

PWM常用于调光、调速、发声等。JL杰理AC696N的定时器可灵活产生PWM,本文将手把手教你实现。
一、PWM核心概念
- 频率 :每秒周期数。
- 占空比 :一个周期内高电平所占比例,决定输出平均电压。

如图,高电平时间(1ms)+ 低电平时间(3ms)= 4ms(一个周期)
- 频率 = 1s / 4ms = 250Hz
- 占空比 = 1ms / 4ms = 25%
二、PWM频率和占空比精度的关系
PWM波形由固定时钟控制产生:时钟 = 频率 × 周期时间
周期时间决定了占空比精度。如果一个周期内有100个时间点,精度就是1/100。
结论:频率越高,占空比精度越低。 实际项目中需要在频率和精度之间做取舍。
三、使用 timer_pwm_init 函数
这是产生PWM的主要函数,位于mcpwm.c:
int timer_pwm_init(JL_TIMER_TypeDef *JL_TIMERx, u32 fre, u32 duty, u32 port, int output_ch)
定时器与硬件引脚对应关系:
| 定时器 |
硬件引脚 |
|---|
| TIMER0 |
IO_PORTA_05 |
| TIMER1 |
IO_PORTC_04 |
| TIMER2 |
IO_PORTB_03 |
| TIMER3 |
IO_PORTB_05 |
| TIMER4 |
IO_PORTA_01 |
| TIMER5 |
IO_PORTB_07 |
使用示例:
timer_pwm_init(JL_TIMER3, 1000, 3000, IO_PORTB_05, 0);
timer_pwm_init(JL_TIMER3, 2000, 5000, IO_PORTB_04, CH2_T3_PWM_OUT);
四、关键配置与注意点
1. 引脚选择
- 优先使用定时器对应的硬件引脚
- 无对应IO时,可通过
output_ch通道映射到其他IO
- 通道定义在
gpio.h中,格式为CHx_Tn_PWM_OUT(x通道,n定时器)
- 注意 :映射输出时,定时器对应的硬件IO口也会产生波形,优先用硬件引脚避免IO浪费
2. 占空比精度
公版代码占空比输入是010000对应0100%。如需改成0~1000,修改:
JL_TIMERx->PWM = (JL_TIMERx->PRD * duty) / 1000;
3. 时钟源选择
JL_TIMERx->CON |= (0b10 << 2);
- 默认24MHz晶振时钟
- 如需更高频率PWM,可改用系统时钟(AC695/696约60MHz),频率上限更高
4. 定时器占用
- TIMER1:系统自己使用,不建议动
- TIMER2:默认用于UI显示,建议关掉UI显示再用
- 定时器冲突一般会导致程序复位或死机
总结
PWM配置核心就三件事:选对定时器、算好频率、配好占空比。
定时器优先用TIMER3及以后的,避开系统占用的TIMER1和可能用于UI的TIMER2。
频率和精度是跷跷板关系,高频输出时占空比精度会下降,根据实际需求平衡取舍。
通道映射功能可以把PWM引到任意IO,但注意硬件对应的那个IO也会同时输出。
建议在AC696N开发板上先用示波器抓一下默认配置的波形,确认频率和占空比都对得上,再往下调。
