微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > +ePWM模块产生PWM波形的程序

+ePWM模块产生PWM波形的程序

时间:10-02 整理:3721RD 点击:

       DSP6748采用的是ePWM模块产生的PWM波形,关于ePWM模块的介绍在前面的帖子里已经阐述了很多。现在看一下关于ePWM模块产生PWM波形的程序。
宏定义:

  1. // 软件断点
  2. #define SW_BREAKPOINT     asm(" SWBP 0 ");
  3. // 时钟分频
  4. #define CLOCK_div_VAL     228

复制代码

函数声明:

  1. // 外设使能配置
  2. void PSCInit(void);
  3. // GPIO 管脚复用配置
  4. void GPIOBankPinMuxSet();
  5. // 产生波形
  6. void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
  7. void ChopperWaveform(void);
  8. // DSP 中断初始化
  9. void InterruptInit(void);
  10. // PWM 中断初始化
  11. void PWMInterruptInit(void);
  12. // 中断服务函数
  13. // PWM 事件
  14. void PWMEventIsr(void);
  15. // PWM 错误控制事件
  16. void PWMTZIsr(void);

复制代码

主函数:(其中斩波实验可以注释掉,也可运行)

  1. int main(void)
  2. {
  3.         // 外设使能配置
  4.         PSCInit();
  5.         // GPIO 管脚复用配置
  6.         GPIOBankPinMuxSet();
  7.         // DSP 中断初始化
  8.         InterruptInit();
  9.         // PWM 中断初始化
  10.         PWMInterruptInit();
  11.         // 产生波形
  12.         PWM1ABasic(10000,50);      //50%占空比
  13.         // 斩波实验
  14. //        ChopperWaveform();
  15.         // 主循环
  16.         for(;;)
  17.         {
  18.         }
  19. }

复制代码

PWM 输出波形:

  1. void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
  2. {
  3.     // 时间基准配置
  4.     // 时钟配置
  5.     EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_div_VAL , SOC_EHRPWM_1_MODULE_FREQ);
  6.     // 配置周期
  7.     EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_div_VAL,
  8.                     pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
  9.     // 禁用输入同步信号
  10.     EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
  11.     // 禁用输出同步信号
  12.     EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
  13.     // 仿真(DEBUG)模式行为配置
  14.     EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
  15.     // 配置计数比较器子模块
  16.     // 加载比较器 A 值
  17.     EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_div_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
  18.                    EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
  19.     // 加载比较器 B 值
  20.     EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
  21.                    EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
  22.     // 功能限定配置(输出引脚触发方式设定)
  23.     // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
  24.     EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
  25.                 EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
  26.                 EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
  27.     // 禁用(旁路,信号直接输出到斩波子模块)死区模块
  28.     EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
  29.     // 禁用斩波子模块
  30.     EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
  31.     // 禁用错误控制事件
  32.     EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
  33.     EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
  34.     // 事件触发配置
  35.     // 每三次事件发生产生中断
  36.     EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
  37.     // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
  38.     EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
  39.     // 使能中断
  40.     EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
  41.     // 禁用高精度子模块
  42.     EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
  43. }
  44. void ChopperWaveform(void)
  45. {
  46.     // 50% 占空比
  47.     EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
  48.     // 4 分频
  49.     EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_divBY4);
  50.     // 单个脉冲宽度
  51.     EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
  52.     // 使能斩波子模块
  53.     EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
  54. }

复制代码


PWM中断初始化、 DSP中断初始化、中断服务函数:

  1. void PWMInterruptInit(void)
  2. {
  3.         // 注册中断服务函数
  4.         IntRegister(C674X_MASK_INT4, PWMEventIsr);
  5.         IntRegister(C674X_MASK_INT5, PWMTZIsr);
  6.         // 映射中断到 DSP 可屏蔽中断
  7.         IntEventMap(C674X_MASK_INT4, SYS_INT_EHRPWM1);
  8.         IntEventMap(C674X_MASK_INT5, SYS_INT_EHRPWM1TZ);
  9.         // 使能 DSP 可屏蔽中断
  10.         IntEnable(C674X_MASK_INT4);
  11.         IntEnable(C674X_MASK_INT5);
  12. }
  13. void InterruptInit(void)
  14. {
  15.         // 初始化 DSP 中断控制器
  16.         IntDSPINTCInit();
  17.         // 使能 DSP 全局中断
  18.         IntGlobalEnable();
  19. }
  20. void PWMEventIsr(void)
  21. {
  22.         IntEventClear(SYS_INT_EHRPWM1);
  23.     EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
  24. }
  25. void PWMTZIsr(void)
  26. {
  27.         IntEventClear(SYS_INT_EHRPWM1TZ);
  28.     EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
  29. }

复制代码




小编的帖子越来越好看了

要是配上图就更好了

苍老成求了啊

巧妇难为无米之炊,实验室的示波器还没有买回来

这个我喜欢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top