- 打卡等级:常住居民I
- 打卡总天数:63
- 最近打卡:2025-05-14 11:49:25
超级版主
- 积分
- 12221
|
发表于 2023-3-7 23:12:51
|
显示全部楼层
常用方式:
PWM时钟使用1MHz,通过分频得到,周期20000个时钟,对应20ms,即50Hz。舵机要的是PPM信号1.000~2.000ms,则占空比对应时钟1000~2000.
下面为PWMB初始化,主频为12MHz,所以分频为12,分频系数设置为12-1=11,PWM占空比默认1000,对应1.000ms,分辨率1us,舵机步数为1000步,已经足够精细了。PWMA的可以照样画葫芦。
void PWMB_config(void)
{
P_SW2 |= 0x80; //SFR enable
PWMB_PSCR = 11; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMB_DTR = 00; // 死区时间配置, 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,
PWMB_ARR = 20000-1; // 自动重装载寄存器, 控制PWM周期
PWMB_CCER1 = 0;
PWMB_CCER2 = 0;
PWMB_SR1 = 0;
PWMB_SR2 = 0;
PWMB_ENO = 0; // IO输出允许, bit6: ENO8P, bit4: ENO7P, bit2: ENO6P, bit0: ENO5P
PWMB_PS = 0;
PWMB_IER = 0;
PWMB_CCMR1 = 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMB_CCR1 = 1000; // 比较值, 控制占空比(高电平时钟数)
PWMB_CCER1 |= 0x01; // 开启比较输出, 高电平有效
PWMB_PS |= 0; // 选择IO, 0:选择P2.0, 1:选择P1.7, 2:选择P0.0, 3:选择P7.4,
PWMB_ENO |= 0x01; // IO输出允许, bit6: ENO8P, bit4: ENO7P, bit2: ENO6P, bit0: ENO5P
// PWMB_IER |= 0x02; // 使能中断
PWMB_CCMR2 = 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMB_CCR2 = 1000; // 比较值, 控制占空比(高电平时钟数)
PWMB_CCER1 |= 0x10; // 开启比较输出, 高电平有效
PWMB_PS |= (0<<2); // 0:选择P2.1, 1:选择P5.4, 2:选择P0.1, 3:选择P7.5,
PWMB_ENO |= 0x04; // IO输出允许, bit6: ENO8P, bit4: ENO7P, bit2: ENO6P, bit0: ENO5P
// PWMB_IER |= 0x04; // 使能中断
PWMB_CCMR3 = 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMB_CCR3 = 1000; // 比较值, 控制占空比(高电平时钟数)
PWMB_CCER2 |= 0x01; // 开启比较输出, 高电平有效
PWMB_PS |= (0<<4); // 选择IO, 0:选择P2.2, 1:选择P3.3, 2:选择P0.2, 3:选择P7.6,
PWMB_ENO |= 0x10; // IO输出允许, bit6: ENO8P, bit4: ENO7P, bit2: ENO6P, bit0: ENO5P
// PWMB_IER |= 0x08; // 使能中断
PWMB_CCMR4 = 0x68; // 通道模式配置, PWM模式1, 预装载允许
PWMB_CCR4 = 1000; // 比较值, 控制占空比(高电平时钟数)
PWMB_CCER2 |= 0x10; // 开启比较输出, 高电平有效
PWMB_PS |= (0<<6); // 选择IO, 0:选择P2.3, 1:选择P3.4, 2:选择P0.3, 3:选择P7.7,
PWMB_ENO |= 0x40; // IO输出允许, bit6: ENO8P, bit4: ENO7P, bit2: ENO6P, bit0: ENO5P
// PWMB_IER |= 0x10; // 使能中断
PWMB_EGR = 0x01; //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
PWMB_BKR = 0x80; // 主输出使能 相当于总开关
PWMB_CR1 = 0x81; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数, bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
// PWMB_ISR_En = PWMB_IER; //设置标志允许通道5~8中断处理
}
// PWMB_PS = (0<<6)+(0<<4)+(0<<2)+0; //选择IO, 4项从高到低(从左到右)对应PWM8 PWM7 PWM6 PWM5
// PWMB_PS PWM8 PWM7 PWM6 PWM5
// 00 P2.3 P2.2 P2.1 P2.0
// 01 P3.4 P3.3 P5.4 P1.7
// 02 P0.3 P0.2 P0.1 P0.0
// 03 P7.7 P7.6 P7.5 P7.4
|
|