打印
[PIC®/AVR®/dsPIC®产品]

PIC24单片机生成PWM信号

[复制链接]
223|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
捉虫天师|  楼主 | 2025-2-25 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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 | 只看该作者
注释的挺不错。这个代码效果如何,可以兼容哪些型号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

210

主题

3236

帖子

7

粉丝