请教大神一个问题。PWM实时更新周期和占空比
我现在遇到这样一个问题。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输出允许,允许PWM4NPWM2N输出使能
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;可以跟着变化但是输出频率就有偏差。
操作扩展寄存器,要保证设置了P_SW2 |= 0x80; //SFR enable
否则,PWMA_ARR改变,频率必然会改变。当然,由1000变为1001,可能不明显,你可以改变大一些,比如改为500或1500试试。 我现在是这样处理 的。打开PWM中断
void PWMA_isr() interrupt 26
{
unsigned char a;
a = PWMA_SR1 ;
PWMA_SR1 = 0 ;
if(a & 0x04)
{
if(pwm_fosc<600){ PWMA_PSCR = 9 ; PWMA_ARR = (MAIN_FOSC/10/pwm_fosc)-1 ; PWMA_CCR2 = duty*((MAIN_FOSC/pwm_fosc)-1)/1000; }
else { PWMA_PSCR = 0 ;PWMA_ARR = (MAIN_FOSC/pwm_fosc) -1; PWMA_CCR2 = duty*((MAIN_FOSC/pwm_fosc)-1)/100 ;}
}
}
也不知道有什么BUG
页:
[1]