PIC24FJ64GA002舵机PWM配置调试及OC1引脚查询问题
PIC24FJ64GA002 PWM输出异常问题修复方案
1 核心问题排查与修复
引脚映射配置缺失
PIC24FJ64GA002的OC1外设属于可重映射功能模块,默认不会绑定到物理引脚,需要手动配置:
OC1可映射到RB15(对应RP15引脚),如果使用该引脚输出PWM,需要在配置OC1前添加引脚重映射代码:
__builtin_write_OSCCONL(OSCCON & ~(1<<6)); // 解锁IOLOCK _RP15R = 18; // 将OC1功能映射到RP15(RB15),18为OC1对应的重映射编号 __builtin_write_OSCCONL(OSCCON | (1<<6)); // 锁定IOLOCK
代码逻辑冲突
你已经开启了OC1的硬件PWM模式,不需要在while循环中手动翻转RB15电平,硬件会自动根据定时器和OC1R的值生成PWM信号,手动翻转会完全覆盖硬件输出的信号,直接删除while循环里的电平判断代码即可。
定时器周期计算错误
你使用8MHz FRC时钟,T2CON配置为0x8010对应的预分频是8分频,定时器计数时钟为8MHz / 8 = 1MHz,单次计数耗时1us:
- 预期2ms周期的话,PR2应设为
1999(计数0~1999共2000次,对应2000us=2ms),你当前设为9999对应的周期是10ms,不符合预期 - 2ms周期下50%占空比对应的OC1R值应为1000,而不是0x1388(0x1388为十进制5000,仅对应10ms周期的50%占空比)
看门狗导致重复复位
你当前配置看门狗为开启状态,循环中没有添加喂狗代码,程序运行后会被看门狗定期复位,无法正常输出PWM,可选择关闭看门狗(将CONFIG1的FWDTEN设为OFF),或者在while循环中添加ClrWdt();喂狗语句。
无用宏定义删除
代码中的#define _LATR15 OC1R无实际作用,还可能引发命名冲突,建议直接删除。
2 修正后核心代码示例
#include "p24FJ64GA002.h" #include "xc.h" int main(void) { // 配置引脚重映射 __builtin_write_OSCCONL(OSCCON & ~(1<<6)); _RP15R = 18; __builtin_write_OSCCONL(OSCCON | (1<<6)); // 定时器2配置:8预分频、2ms周期 T2CON = 0x8010; TMR2 = 0; PR2 = 1999; // OC1配置:50%占空比PWM模式 OC1CONbits.OC = 0; OC1R = 1000; OC1CONbits.OCSIDL = 0; OC1CONbits.OCFLT = 0; OC1CONbits.OCTSEL = 0; OC1CONbits.OCM = 0x6; TRISBbits.TRISB15 = 0; while(1) { ClrWdt(); // 若已关闭看门狗可删除此行 } return 0; }
内容的提问来源于stack exchange,提问作者Bottle
相关产品推荐
相关产品推荐

