本帖最后由 24不可说 于 2015-12-2 16:04 编辑
DSP6748采用的是ePWM模块产生的PWM波形,关于ePWM模块的介绍在前面的帖子里已经阐述了很多。现在看一下关于ePWM模块产生PWM波形的程序。
宏定义:
- // 软件断点
- #define SW_BREAKPOINT asm(" SWBP 0 ");
- // 时钟分频
- #define CLOCK_DIV_VAL 228
复制代码
函数声明:
- // 外设使能配置
- void PSCInit(void);
- // GPIO 管脚复用配置
- void GPIOBankPinMuxSet();
- // 产生波形
- void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
- void ChopperWaveform(void);
- // DSP 中断初始化
- void InterruptInit(void);
- // PWM 中断初始化
- void PWMInterruptInit(void);
- // 中断服务函数
- // PWM 事件
- void PWMEventIsr(void);
- // PWM 错误控制事件
- void PWMTZIsr(void);
复制代码
主函数:(其中斩波实验可以注释掉,也可运行)
- int main(void)
- {
- // 外设使能配置
- PSCInit();
- // GPIO 管脚复用配置
- GPIOBankPinMuxSet();
- // DSP 中断初始化
- InterruptInit();
- // PWM 中断初始化
- PWMInterruptInit();
- // 产生波形
- PWM1ABasic(10000,50); //50%占空比
- // 斩波实验
- // ChopperWaveform();
- // 主循环
- for(;;)
- {
- }
- }
复制代码
PWM 输出波形:
- void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
- {
- // 时间基准配置
- // 时钟配置
- EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- // 配置周期
- EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- // 禁用输入同步信号
- EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
- // 禁用输出同步信号
- EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- // 仿真(DEBUG)模式行为配置
- EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
- // 配置计数比较器子模块
- // 加载比较器 A 值
- EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- // 加载比较器 B 值
- EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
- EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- // 功能限定配置(输出引脚触发方式设定)
- // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
- EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
- EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- // 禁用(旁路,信号直接输出到斩波子模块)死区模块
- EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
- // 禁用斩波子模块
- EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
- // 禁用错误控制事件
- EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
- EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
- // 事件触发配置
- // 每三次事件发生产生中断
- EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
- EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
- // 使能中断
- EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
- // 禁用高精度子模块
- EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- }
- void ChopperWaveform(void)
- {
- // 50% 占空比
- EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
- // 4 分频
- EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
- // 单个脉冲宽度
- EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
- // 使能斩波子模块
- EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
- }
复制代码
PWM中断初始化、 DSP中断初始化、中断服务函数:
- void PWMInterruptInit(void)
- {
- // 注册中断服务函数
- IntRegister(C674X_MASK_INT4, PWMEventIsr);
- IntRegister(C674X_MASK_INT5, PWMTZIsr);
- // 映射中断到 DSP 可屏蔽中断
- IntEventMap(C674X_MASK_INT4, SYS_INT_EHRPWM1);
- IntEventMap(C674X_MASK_INT5, SYS_INT_EHRPWM1TZ);
- // 使能 DSP 可屏蔽中断
- IntEnable(C674X_MASK_INT4);
- IntEnable(C674X_MASK_INT5);
- }
- void InterruptInit(void)
- {
- // 初始化 DSP 中断控制器
- IntDSPINTCInit();
- // 使能 DSP 全局中断
- IntGlobalEnable();
- }
- void PWMEventIsr(void)
- {
- IntEventClear(SYS_INT_EHRPWM1);
- EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
- }
- void PWMTZIsr(void)
- {
- IntEventClear(SYS_INT_EHRPWM1TZ);
- EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
- }
复制代码
0
|
|
|
|