[PIC®/AVR®/dsPIC®产品] PIC24单片机生成PWM信号

[复制链接]
 楼主| 捉虫天师 发表于 2025-2-25 14:53 | 显示全部楼层 |阅读模式
  1. #include <xc.h>
  2. #include <stdint.h>

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

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

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

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

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

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

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

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

  28. int main(void) {
  29.     // 初始化PWM
  30.     InitPWM();

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

  35.     return 0;
  36. }
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信号。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

212

主题

3272

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部

212

主题

3272

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部