找回密码
 立即注册
查看: 150|回复: 1

pwm输出,如何改变占空比

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-10-20 15:00:10
已绑定手机

1

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2025-10-20 15:00:10 | 显示全部楼层 |阅读模式
void PWMA_config(void)
{
        P_SW2 |= 0x80;                //SFR enable   

        PWMA_PSCR = 0x0000;        // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
        PWMA_DTR  = 24;                // 死区时间配置, n=0~127: DTR= n T,   0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,  
                                                //                                0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T,   0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
        PWMA_ARR = 2400;        // 自动重装载寄存器,  控制PWM周期
        PWMA_CCER1  = 0;
        PWMA_CCER2  = 0;
        PWMA_SR1    = 0;
        PWMA_SR2    = 0;
        PWMA_ENO    = 0;
        PWMA_PS     = 0;
        PWMA_IER    = 0;

        PWMA_CCMR1  = 0x68;                // 通道模式配置, PWM模式1, 预装载允许
        PWMA_CCR1   = 400;                // 比较值, 控制占空比(高电平时钟数)
        PWMA_CCER1 |= 0x05;                // 开启比较输出, 高电平有效
        PWMA_PS    |= 0;                // 选择IO, 0:选择P1.0 P1.1, 1:选择P2.0 P2.1, 2:选择P6.0 P6.1,
        PWMA_ENO   |= 0x03;                // IO输出允许,  bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,  bit3: ENO2N,  bit2: ENO2P,  bit1: ENO1N,  bit0: ENO1P
        PWMA_IER   |= 0x02;                // 使能中断
}


main()
{
PWMA_config();
while(1)
{
;   //PWM占空比改变
  Delay(100);
}
}
我的目的是在P1.0引脚上获得一个可以控制占空比的PWM脉冲,由0-100%,我改变哪个寄存器?没看明白PWM的说明。
谢谢大神!



回复

使用道具 举报 送花

3

主题

1848

回帖

544

积分

等待验证会员

积分
544
发表于 2025-10-20 15:03:00 | 显示全部楼层
作为一名嵌入式系统工程师,我来为您分析这段PWM配置代码,并说明如何改变占空比。

首先,我们来理解这段代码的整体功能。这段代码是为一个基于PWM模块的微控制器配置PWM输出。PWM(脉宽调制)是一种常用的数字信号生成技术,广泛应用于电机控制、LED调光、电源管理等领域。

从代码结构来看,这段代码主要完成了以下配置:
1. 启用特殊功能寄存器访问权限
2. 设置预分频寄存器
3. 配置死区时间
4. 设置自动重载寄存器
5. 初始化各种控制寄存器
6. 配置通道模式和比较值
7. 设置输出通道选择

要改变PWM输出的占空比,关键在于修改比较寄存器的值。在代码中,这一部分体现在:
  1. c
  2. PWMACCR1 = 400; // 比较值, 控制占空比(高电平时钟数)
复制代码

占空比的计算公式为:
占空比(%) = (PWMACCR1 / (PWMAARR + 1)) × 100%

在当前配置中:
PWMAARR = 2400
PWMACCR1 = 400
占空比 = (400 / (2400 + 1)) × 100% ≈ 16.66%

若要改变占空比,只需修改PWMACCR1的值,但要确保0 ≤ PWMACCR1 ≤ PWMAARR。例如:
  1. c
  2. PWMACCR1 = 600; // 改为约25%的占空比
  3. PWMACCR1 = 1200; // 改为约50%的占空比
  4. PWMACCR1 = 2400; // 改为约100%的占空比
复制代码

需要注意的几点:
1. 在运行时修改占空比时,应确保在安全的时机更新比较寄存器的值,避免造成输出异常。
2. 如果使用了预装载寄存器功能(如代码中的PWMACCMR1 = 0x68;配置),可能需要触发更新事件来使新值生效。
3. 在实际应用中,占空比的改变可能需要遵循特定的斜坡函数,以避免机械或电气系统受到冲击。

关于其他配置参数的说明:
PWMAPSCR:预分频寄存器,影响PWM的频率。若要改变频率,可以调整此值。
PWMAARR:自动重载寄存器,与PWMAPSCR一起决定PWM的周期。改变此值会影响分辨率和频率。
PWMADTR:死区时间配置,用于防止上下桥臂直通,在电机控制等应用中非常重要。

在实际应用中,建议封装一个函数来安全地更新占空比:
```c
void UpdatePWMDutyCycle(uint16t dutyValue)
{
    if(dutyValue

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-11-1 22:13 , Processed in 0.125865 second(s), 51 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表