捉虫天师 发表于 2025-2-25 14:53

PIC24单片机生成PWM信号

#include <xc.h>
#include <stdint.h>

#pragma config FOSC = PRI // 主时钟
#pragma config WDTEN = OFF // 禁用看门狗

#define FCY 4000000// 系统时钟频率
#define PWM_FREQ 1000 // PWM频率:1kHz
#define DUTY_CYCLE 50 // 占空比:50%

// 初始化PWM模块
void InitPWM() {
    // 设置OC1引脚为输出
    TRISCbits.TRISC2 = 0;// 设置RC2为输出(假设OC1映射到RC2)

    // 配置PWM频率
    uint16_t period = (FCY / PWM_FREQ) - 1;// 计算周期寄存器值
    PR2 = period;// 设置定时器周期

    // 设置占空比
    uint16_t duty = (DUTY_CYCLE / 100.0) * (period + 1);// 计算占空比寄存器值
    OC1RS = duty;// 设置占空比(OC1RS是占空比寄存器)
    OC1R = duty;   // 初始占空比值

    // 配置定时器2
    T2CONbits.TCKPS = 0b01; // 设置定时器预分频为8(可以根据需要调整)
    T2CONbits.TON = 1;// 启动定时器2

    // 配置OC1为PWM模式
    OC1CONbits.OCTSEL = 0;// 选择定时器2作为PWM的时钟源
    OC1CONbits.OCM = 0b110; // 设置为PWM模式

    // 启动PWM输出
    OC1CONbits.OCM = 0b111;// 设置为PWM模式,开始输出
}

int main(void) {
    // 初始化PWM
    InitPWM();

    while (1) {
      // 在主循环中,你可以根据需要动态调整占空比
      // 例如,可以根据传感器输入或用户输入来改变占空比
    }

    return 0;
}
PWM频率:通过设置PR2寄存器来调整PWM信号的频率。在此示例中,PWM频率设置为1kHz。
占空比:通过设置OC1RS寄存器来设置PWM波的占空比。占空比的值是周期的百分比,这里设置为50%。
定时器:使用定时器2来控制PWM频率。T2CONbits.TCKPS用于设置定时器的预分频器,以调整PWM的频率。
OC1配置:通过配置OC1模块为PWM模式,使其输出对应的PWM波形。

dongnanxibei 发表于 2025-2-25 20:32

PWM模式输出对应的PWM波形

chenqianqian 发表于 2025-2-25 20:46

PIC24是指内核是24位的吗?

jiekou001 发表于 2025-2-26 15:03

注释的挺不错。这个代码效果如何,可以兼容哪些型号

自动化陈稳 发表于 2025-4-27 00:57

可以生成一个频率为1 kHz,占空比为50%的PWM信号,并可以在主程序中根据需要动态调整占空比。

自动化陈稳 发表于 2025-4-27 01:02

使用输出比较模块OC1来调整PWM信号的占空比,使其符合所需的输出。

自动化陈稳 发表于 2025-4-27 01:03

这段代码展示了如何配置PIC单片机的PWM模块并生成一个特定频率和占空比的PWM信号。
页: [1]
查看完整版本: PIC24单片机生成PWM信号