标题:
为什么我设置的PWM输出不准确?
[打印本页]
作者:
happy2058
时间:
2025-9-5 20:46
标题:
为什么我设置的PWM输出不准确?
#define PWM_PSC (24-1) //24分频,1us 频
#define PWM_PERIOD 100 //周期100us
#define PWM_DUTY 1 //占空1us
void PWMA_ADJ_Config() //ADJ可调
{
PWMA_PS = 0x40; //P2.6P2.7 4n
PWMA_PSCRH = (u16)(PWM_PSC >> 8);
PWMA_PSCRL = (u16)(PWM_PSC);
PWMA_CCER2 = 0x00; // 写 CCMRx 前必须先清零 CCERx 关闭通道
PWMA_CCMR4 = 0x60; // 设置 CC2 为 PWMA 输出模式,PWM模式1
PWMA_CCER2 = 0x40; // 使能 CC4n
PWMA_CCR4H = (u16)(PWM_DUTY >> 8); //设置占空比
PWMA_CCR4L = (u16)(PWM_DUTY);
PWMA_ARRH = (u16)(PWM_PERIOD >> 8); // 设置PWM周期
PWMA_ARRL = (u16)(PWM_PERIOD);
PWMA_ENO = 0x80; // 使能 PWM4n 端口输出
PWMA_BKR = 0x80; // 使能主输出
PWMA_CR1 = 0x01; // 启动PWM定时器
}
测量周期为101US 正脉宽1US, PWMA_ARR改为99就才行,一直没搞懂
作者:
a825563619
时间:
2025-9-6 08:16
可能芯片手册上写有周期=ARR+1的字眼你没看到
作者:
622323wjl
时间:
2025-9-6 15:24
你遇到的问题与PWM定时器的计数方式和寄存器配置有关,具体原因如下:
### 核心原因:定时器的计数范围是「0到ARR值」 大部分定时器(包括你使用的这款)的计数逻辑是: - 计数器从0开始递增 - 当计数达到`ARR`值时,触发一次更新事件(周期结束) - 因此,**实际周期 = (ARR + 1) × 时钟周期**
### 你的参数计算分析
1. 时钟配置: - 分频系数`PSC = 24-1 = 23`,因此定时器时钟频率 = 系统时钟 / 24 - 假设系统时钟为24MHz,那么定时器时钟 = 1MHz,即每个计数单位为1μs
2. 当`PWM_PERIOD = 100`时: - 实际周期 = (100 + 1) × 1μs = 101μs(与你的测量结果一致)
3. 当`PWM_PERIOD = 99`时: - 实际周期 = (99 + 1) × 1μs = 100μs(符合预期) ### 为什么占空比是正确的? 占空比配置`PWM_DUTY = 1`时: - 比较寄存器`CCR`的值是1,代表计数器计数到1时翻转电平 - 正脉宽 = 1 × 1μs = 1μs(无需+1,因为从0到1刚好是1个单位)
### 修正建议 将周期定义修改为: ```c #define PWM_PERIOD 99 // 实际周期 = (99+1)×1μs = 100μs ``` 这样就能得到你预期的100μs周期,这是定时器设计的通用逻辑(计数从0开始),并非代码或硬件问题。
作者:
weisc6955
时间:
2025-9-6 17:33
任何测量判断都需要在一个时钟内进行。也就是说占用一个时钟时间。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1