- 打卡等级:以坛为家I
- 打卡总天数:385
- 最近打卡:2025-05-01 08:05:45
高级会员
- 积分
- 725
|
我现在遇到这样一个问题。
P13输出PWM信号。其中周期和占空比可调(通过按键设置调节)
unsigned int pwm_fosc ;
unsigned char duty;
void PWMA_config(void)
{
P_SW2 |= 0x80; //SFR enable
PWMA_PSCR = 0; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMA_DTR = 0; // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
// 对PWMB没有意义 0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
PWMA_ARR = (24000000/pwm_fosc)-1; // 自动重装载寄存器, 控制PWM周期 //
PWMA_CCER1 = 0;
PWMA_CCER2 = 0;
PWMA_SR1 = 0;
PWMA_SR2 = 0;
PWMA_ENO = 0; // IO输出允许, 允许PWM4N PWM2N输出使能
PWMA_PS = 0;
PWMA_IER = 0;
PWMA_CR1 = 0;
PWMA_CCR2 = duty*(240000/pwm_fosc); // 比较值, 控制占空比(高电平时钟数) 占空比的取值和周期PWMA——ARR 有关系。周期的除以100等于1%占空比。
PWMA_CCMR2 = 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMA_CCER1 |= 0x50; // 开启比较输出, 高电平有效
PWMA_PS |= (0<<2); // 选择IO, 0:选择P1.2 P1.3, 1:选择P2.2 P2.3, 2:选择P6.2 P6.3, 实际接线是P13
PWMA_ENO |= 0x88; // IO输出允许, bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P, bit3: ENO2N, bit2: ENO2P, bit1: ENO1N, bit0: ENO1P
PWMA_BKR = 0X80; //主输出使能 相当于总开关
PWMA_CR1 = 0X81; //使能计数器,允许自动重装载寄存器缓冲,边缘对齐模式,向上计数。BIT7=1:写自动重装载寄存器缓冲(本周期不会被打扰)。
PWMA_EGR = 0X01; //产生一次更新事件,清除计数器和预分频计数器,装载预分频寄存器的值
}
其中 pwm _fosc 和 duty 通过按键可以进行加减。
主函数中PWM初始化
当给 pwm _fosc =1000 和 duty=50直接赋值 .然后烧写进去 运行正常 频率1000.占空比50.
但是用按键更改 pwm _fosc 和 duty数值的时候。输出不会改变。
比如 pwm _fosc 按键调节到2000.但是输出依然是1000.如何能够让频率和占空比跟着变化。
我用一个笨办法 在定时器中断程序中写入PWMA_ARR = (24000000/pwm_fosc)-1;可以跟着变化 但是输出频率就有偏差。
|
|