PIC18F增强型CCP1无PWM输出问题排查求助
问题背景
为CCP1外设开发驱动,完成后用Proteus仿真,增强型PWM无输出,已确认CCP1CON和T2CON寄存器配置正确。
- 预期参数:20kHz频率、50%占空比;P1A/P1C低有效,P1B/P1D高有效
- 全桥正向输出模式:P1D调制、P1A有效,P1B/P1C无效
- 核心代码如下:
#include "app.h" #include "device_config.h" #include "MCAL_Layer/CCPx/CCP1/hal_ccp1.h" #include "MCAL_Layer/Timers/Timer3/hal_timer3.h" #include "MCAL_Layer/Timers/Timer2/hal_timer2.h" cpp1_t ccp1_obj = { .ccp1_interrupt_handler = NULL, .ccp1_interrupt_priority = INTERRUPT_LOW_PRIORITY, .ccp1_mode = CCP1_PWM_MODE_SELECT, .ccp1_mode_variant = CCP1_PWM_MODE_P1AC_LOW_P1BD_HIGH, .ccp1_pwm_output_config = FULL_BRIDGE_OUTPUT_FORWARD, .ccp1_pwm_frequency = 20000, .timer2_postscaler_value = 1, .timer2_prescaler_value = 1 }; timer2_t timer2_obj = { .PR2_preloaded_value = 99, .TMR2_preloaded_value = 0, .postscaler_value = 1, .prescaler_value = 1 }; int main(void) { Std_ReturnType ret = E_OK; ret |= ccp1_init(&ccp1_obj); ret |= timer2_init(&timer2_obj); ccp1_pwm_set_duty_cycle(50); while (1) { } return (ret); }
排查方向
1. 确认引脚方向配置
全桥模式涉及的引脚(如P1A对应RC2、P1D对应RD1,需匹配具体芯片型号)必须设为输出模式(TRIS对应位写0)。从寄存器截图检查TRISC和TRISD的对应位是否正确置0,若引脚为输入状态,PWM信号无法输出。
2. 验证PR2与系统时钟的匹配性
20kHz PWM频率计算公式:
Fpwm = Fosc / (4 * (PR2 + 1) * TMR2预分频 * TMR2后分频)
代码中PR2设为99,对应系统时钟为8MHz(计算:(PR2+1)=100,8000000/(4*100*1*1)=20000Hz)。需确认device_config.h中的系统时钟定义是否与实际仿真配置一致,若时钟不匹配,会导致频率错误或无输出。
3. 检查Timer2的启动状态
部分MCU的Timer2初始化函数仅配置参数,不会自动启动定时器。需确认hal_timer2.c的timer2_init函数是否置位T2CONbits.TMR2ON = 1,若未实现,需在main中手动添加启动代码。
4. 验证占空比配置逻辑
50%占空比对应的计数计算:
占空比计数 = (PR2 + 1) * 4 * 0.5 = 10040.5=200
需转换为CCPR1L(高8位)和CCP1CON<5:4>(低2位):200 = 0xC8→CCPR1L=0x32,CCP1CON<5:4>=0b00。检查ccp1_pwm_set_duty_cycle函数是否正确执行该计算并写入寄存器。
5. 排查驱动层寄存器配置细节
查看hal_ccp1.c的ccp1_init实现:
- 是否根据
ccp1_pwm_output_config正确设置CCP1CON的P1M<1:0>位(全桥模式对应0b10)? - 是否配置
APFCON等引脚映射寄存器(若芯片需要),确保PWM信号输出到正确引脚?
6. 检查Proteus仿真环境
- 确认使用的芯片模型支持增强型PWM全桥模式,部分老版本模型存在功能缺失。
- 确保仿真引脚已连接负载(如示波器、LED),空载状态下部分模型不会显示输出。
- 尝试重启工程或更换同系列芯片模型,排除仿真软件bug。
内容的提问来源于stack exchange,提问作者Mohamed Olwi

