You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:45:06