长沙网站设计公司怎么样,响应式设计的基本原理,网站打不开 ...,长春学校网站建设方案咨询目录
1.主函数执行流程
2.外设使能配置
3.GPIO管脚复用配置
4.DSP中断初始化
5.PWM中断初始化
6.产生波形
6.1 时间基准配置/时钟配置
6.2 配置周期
6.3 禁用输入同步信号
6.4 禁用输出同步信号
6.5 仿真模式行为配置
6.6 配置计数比较器子模块
6.6.1 加载比较器A…目录
1.主函数执行流程
2.外设使能配置
3.GPIO管脚复用配置
4.DSP中断初始化
5.PWM中断初始化
6.产生波形
6.1 时间基准配置/时钟配置
6.2 配置周期
6.3 禁用输入同步信号
6.4 禁用输出同步信号
6.5 仿真模式行为配置
6.6 配置计数比较器子模块
6.6.1 加载比较器A值
6.6.2 加载比较器B值
6.7 功能限定配置输出引脚触发方式设定
6.8 禁用死区模块
6.9 禁用斩波子模块
6.10 禁用错误控制事件
6.11 事件触发配置
6.11.1 每三次事件发生产生中断
6.11.2 时间基准等于有效计数比较寄存器B值产生事件
6.12 使能中断
6.13 禁用高精度子模块
7.斩波可选
7.1 设置斩波占空比
7.2 设置斩波频率
7.3 设置单个脉冲宽度
7.4 使能斩波子模块
8.中断服务函数
8.1 PWM事件中断服务函数
8.2 PWM错误事件中断服务函数
9.参考文献 1.主函数执行流程
此程序的作用是实现eHRPWM高精度脉冲宽度调制器输出功能。OMAPL138/TMS320C6748共有两个eHRPWM模块此处测试模块1的EPWM1_A引脚。主函数执行流程如下 主函数如下
int main(void)
{// 外设使能配置PSCInit();// GPIO 管脚复用配置GPIOBankPinMuxSet();// DSP 中断初始化InterruptInit();// PWM 中断初始化PWMInterruptInit();// 产生波形PWM1ABasic(10000,50);// 斩波实验// ChopperWaveform();// 主循环for(;;){}
}2.外设使能配置
函数首先使能外设这里是eHRPWM模块1外设使能配置函数PSCInit如下
void PSCInit(void)
{// 使能 EHRPWM 模块// 对相应外设模块的使能也可以在 BootLoader 中完成PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
}函数在PSC中使能HW_PSC_EHRPWM#17模块该模块的Power Domain是ALWAYS_ON域POWER DOMAIN 0PSCModuleControl细节可参考这里
C6748_UART_EDMA
3.GPIO管脚复用配置
将EHRPWM1模块所在的引脚的功能function配置为EHRPWM1功能GPIO管脚复用配置函数GPIOBankPinMuxSet如下
void GPIOBankPinMuxSet(void)
{EHRPWM1PinMuxSetup();
}EHRPWM1PinMuxSetup函数在demo的Platform工程下的EHRPWM.c文件中函数如下
void EHRPWM1PinMuxSetup(void)
{// EPWM1AHWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(5)) (HWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(5)) (~ (SYSCFG_PINMUX5_PINMUX5_3_0))) |(PINMUX5_EPWM1A_ENABLE);// EPWM1BHWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(5)) (HWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(5)) (~(SYSCFG_PINMUX5_PINMUX5_7_4))) |(PINMUX5_EPWM1B_ENABLE);// EPWM1TZ[0]HWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(2)) (HWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(2)) (~(SYSCFG_PINMUX2_PINMUX2_3_0))) |(PINMUX2_EPWM1TZ0_ENABLE);// EPWMSYNCOHWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(3)) (HWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(3)) (~(SYSCFG_PINMUX3_PINMUX3_15_12))) |(PINMUX3_EPWMSYNCO_ENABLE);// EPWMSYNCIHWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(3)) (HWREG(SOC_SYSCFG_0_REGS SYSCFG0_PINMUX(3)) (~(SYSCFG_PINMUX3_PINMUX3_11_8))) |(PINMUX3_EPWMSYNCI_ENABLE);// 使能 PWM 时钟HWREG(SOC_SYSCFG_0_REGS SYSCFG0_CFGCHIP1) | SYSCFG_CFGCHIP1_TBCLKSYNC;
}函数将EPWM1模块的相关引脚配置为EPWM1A、EPWM1B、EPWM1TZ[0]、EPWMSYNCO、EPWMSYNCI功能引脚然后设置CFGCHIP1Chip Configuration 1 Register寄存器的TBCLKSYNC位将所有被使能的eHRPWM模块同步到时基时钟time base clockTBCLK使能PWM时钟。 指南P228 指南P222 指南P224 CFGCHIP1指南P266
4.DSP中断初始化
DSP中断初始化函数InterruptInit如下
void InterruptInit(void)
{// 初始化 DSP 中断控制器IntDSPINTCInit();// 使能 DSP 全局中断IntGlobalEnable();
}函数细节参考这里
C6748_SPI_FLASH
5.PWM中断初始化
PWM中断初始化函数PWMInterruptInit如下
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);
}函数将CPU可屏蔽中断C674X_MASK_INT4和C674X_MASK_INT5的中断服务函数注册为PWMEventIsr和PWMTZIsr。然后将中断事件SYS_INT_EHRPWM1#18PWM1中断和SYS_INT_EHRPWM1TZ#23PWM1错误处理中断分别映射到CPU中断INT4和INT5最后使能INT4和INT5。关于IntRegister、IntEventMap、IntEnable等函数可参考这里。
C6748_EDMA_GPIO_中断学习笔记 手册P93
6.产生波形
产生波形函数PWM1ABasic (10000,50)如下其中第一个参数10000表示产生的PWM波的频率为10000Hz10KHz第二个参数50表示波形占空比为50%。
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);
}6.1 时间基准配置/时钟配置
要输出PWM波首先要配置时间基准EHRPWMTimebaseClkConfig函数在Drivers工程下的ehrpwm.c文件中API如下
void EHRPWMTimebaseClkConfig(unsigned int baseAddr,unsigned int tbClk,unsigned int moduleClk){unsigned int clkDiv moduleClk/tbClk;unsigned int hspClkDiv;unsigned int lspClkDiv, lspClkDivSetting 0;if(clkDiv EHRPWM_TBCTL_HSPCLKDIV_14){hspClkDiv EHRPWM_TBCTL_HSPCLKDIV_DIVBY14; /* reg setting */lspClkDiv clkDiv/EHRPWM_TBCTL_HSPCLKDIV_14; /* divider *//* reg setting */while(lspClkDiv 1){lspClkDiv lspClkDiv 1;lspClkDivSetting;}}else{hspClkDiv clkDiv/2; /* reg setting *//* divide by 1 */lspClkDivSetting EHRPWM_TBCTL_HSPCLKDIV_DIVBY1;}HWREGH(baseAddr EHRPWM_TBCTL) (HWREGH(baseAddr EHRPWM_TBCTL) (~EHRPWM_TBCTL_CLKDIV)) | ((lspClkDivSetting EHRPWM_TBCTL_CLKDIV_SHIFT) EHRPWM_TBCTL_CLKDIV);HWREGH(baseAddr EHRPWM_TBCTL) (HWREGH(baseAddr EHRPWM_TBCTL) (~EHRPWM_TBCTL_HSPCLKDIV)) | ((hspClkDiv EHRPWM_TBCTL_HSPCLKDIV_SHIFT) EHRPWM_TBCTL_HSPCLKDIV);
}该函数配置时基模块Time base module的时钟分频器clock dividerbaseAddr是PWM模块寄存器组的基地址tbClk为要产生的时基时钟moduleClk是输入到PWM模块的时钟sysclk2。时基时钟TBCLKTime-base Clock计算公式为TBCLK SYSCLKOUT/(HSPCLKDIV × CLKDIV)。HSPCLKDIV和CLKDIV是TBCTL寄存器的位则时钟分频值clkdivSYSCLKOUT/TBCLKHSPCLKDIV x CLKDIV。
函数先计算时钟分频值clkdiv如果CLKDIV大于HSPCLKDIV所能设置的最大分频值14HSPCLKDIV7h时则还需要计算TBCTL的CLKDIV部分。否则HSPCLKDIV分频值就是clkdivCLKDIV分频值为1。这里设置tbclk为1MHzeHRPWM1模块的输入时钟为228MHzsysclk/2。 指南P465 指南P131
6.2 配置周期
配置周期函数EHRPWMPWMOpFreqSet如下
void EHRPWMPWMOpFreqSet(unsigned int baseAddr,unsigned int tbClk,unsigned int pwmFreq,unsigned int counterDir,bool enableShadowWrite)
{unsigned int tbPeriodCount tbClk/pwmFreq;HWREGH(baseAddr EHRPWM_TBCTL) (HWREGH(baseAddr EHRPWM_TBCTL) (~EHRPWM_PRD_LOAD_SHADOW_MASK)) | ((enableShadowWrite EHRPWM_TBCTL_PRDLD_SHIFT) EHRPWM_PRD_LOAD_SHADOW_MASK);HWREGH(baseAddr EHRPWM_TBCTL) (HWREGH(baseAddr EHRPWM_TBCTL) (~EHRPWM_COUNTER_MODE_MASK)) | ((counterDir EHRPWM_TBCTL_CTRMODE_SHIFT) EHRPWM_COUNTER_MODE_MASK);if(EHRPWM_COUNT_UP_DOWN counterDir){HWREGH(baseAddr EHRPWM_TBPRD) (unsigned short)tbPeriodCount/2;}else{HWREGH(baseAddr EHRPWM_TBPRD) (unsigned short)tbPeriodCount;}}该函数配置输出的PWM频率/周期。周期计数器决定了最后输出波形的周期。对给定的周期值在UP 和 DOWN模式下所装载的周期值就是给定的周期值在UP_DOWN模式下所装载的周期值是给定的周期值的一半。pwmFreq是PWM输出波形的频率如果计数器的方向是up-down该值必须为输出频率的一半这样最终输出的信号频率才能等于输出频率。CounterDir是计数器的计数方向updownup-downenableShadowWrite指明是否使能写往周期寄存器的影子寄存器。 指南P338 函数先是计算周期计数值tbPeriodCount然后设置TBCTL的PRDLD位确定周期寄存器TBPRD的值是否从Shadow寄存器中加载设置TBCTL的CTRMODE位确定计数器模式是向上计数还是向下计数还是上下计数。最后根据计数方向确定存入周期寄存器TBPRD的值tbPeriodCount是否要减半这里设置up和down计数模式的tbPeriodCount好像少减了1。这里程序设置TBCTL[CTRMODE]位为0h即time-base计数器计数模式为Up-count mode。设置TBCTL[PRDLD]位为1即直接加载TBPRD而不使用影子寄存器。设置TBPRD为1001MHz/10KHztbclkFREQ/pwmclkFREQ即PWM波频率为10KHz。 指南P388
6.3 禁用输入同步信号 EHRPWMTimebaseSyncDisable函数设置TBCTL的PHSEN位counter Register Load From Phase Register Enable为0禁用EHRPWM1的输入同步信号即使EPWM1SYNCI引脚有同步信号输入EPWM1也不会把相位寄存器TBPHSTB phase register的值装入到计数器TBCNTtime-base counter中。 指南P389 指南P390 指南P466
该API如下
void EHRPWMTimebaseSyncDisable(unsigned int baseAddr)
{HWREGH(baseAddr EHRPWM_TBCTL) (~EHRPWM_SYNC_ENABLE);
}6.4 禁用输出同步信号
EHRPWMSyncOutModeSet函数设置TBCTL的SYNCOSEL位为3h禁用EPWM1的输出同步信号EPWM1SYNCO输出同步信号产生的条件可以是EPWM1SYNCIN、CTR0、CTRCMPB三个。 指南P386 指南P387 指南P465
该API如下
void EHRPWMSyncOutModeSet(unsigned int baseAddr, unsigned int syncOutMode)
{HWREGH(baseAddr EHRPWM_TBCTL) (HWREGH(baseAddr EHRPWM_TBCTL) (~EHRPWM_SYNCOUT_MASK)) | syncOutMode;
}6.5 仿真模式行为配置
EHRPWMTBEmulationModeSet函数设置TBCTL的FREE、SOFT位配置EPWM的仿真模式行为即在调试时timebase的行为这里将FREE、SOFT位设为0则在仿真事件emulation event发生后ePWM的时基计数器time-base counter将在下一次增量increment或减量decrement发生后停止。 指南P465
该API如下
void EHRPWMTBEmulationModeSet(unsigned int baseAddr, unsigned int mode)
{HWREGH(baseAddr EHRPWM_TBCTL) (HWREGH(baseAddr EHRPWM_TBCTL) (~EHRPWM_TBCTL_FREE_SOFT)) | (mode EHRPWM_TBCTL_FREE_SOFT);
}6.6 配置计数比较器子模块
6.6.1 加载比较器A值
计数器比较子模块counter-compare submodule接收时基计数器time-base counter的值作为输入这个值不断地同比较计数器counter-compareA和比较计数器B寄存器相比较。当时基计数器的值等于其中一个比较寄存器时这个计数器比较单元就会产生相应的事件将事件信号输出到AQ模块中Action Qualifier。 指南P394
加载比较器A值函数EHRPWMLoadCMPA如下
bool EHRPWMLoadCMPA(unsigned int baseAddr,unsigned int CMPAVal,bool enableShadowWrite,unsigned int ShadowToActiveLoadTrigger,bool OverwriteShadowFull)
{bool status FALSE;if((OverwriteShadowFull) ||((HWREGH(baseAddrEHRPWM_CMPCTL) EHRPWM_CMPCTL_SHDWAFULL) EHRPWM_SHADOW_A_EMPTY)){HWREGH(baseAddr EHRPWM_CMPCTL) (HWREGH(baseAddr EHRPWM_CMPCTL) (~EHRPWM_CMPCTL_SHDWAMODE)) | ((enableShadowWrite EHRPWM_CMPCTL_SHDWAMODE_SHIFT) EHRPWM_CMPCTL_SHDWAMODE);HWREGH(baseAddr EHRPWM_CMPCTL) (HWREGH(baseAddr EHRPWM_CMPCTL) (~EHRPWM_COMPA_LOAD_MASK)) |((ShadowToActiveLoadTrigger EHRPWM_CMPCTL_LOADAMODE_SHIFT) EHRPWM_COMPA_LOAD_MASK);HWREGH(baseAddr EHRPWM_CMPA) CMPAVal EHRPWM_CMPA_CMPA;status TRUE;}return status;
}函数先判断OverwriteShadowFull标志是否为1真如果为真则不管Counter-compare ACMPA影子寄存器shadow register是否为满SHDWAFULL1都往里overwrite又或者CMPA影子寄存器为空SHDWAFULL也往CMPA Shadow register所在地址写数据。 指南P469
CMPA shadow register与CMPA active register共享同一地址往该地址写数据时到底往哪一个寄存器写是通过CMPCTL寄存器的SHDWAMODE位CMPA寄存器操作模式来决定的。这里程序把该位设为了1即选择immediate模式往该地址写数据直接往active register写。然后程序又设置CMPCTL的LOADAMODE位active counter-compare A load from shadow select mode为3h则freeze加载行为CMPA的active register将不从shadow register加载。 指南P469 最后将要写往CMPA active register的值CMPAVal写入到CMPA active register中。这里 指南P470
6.6.2 加载比较器B值
加载比较器B值函数EHRPWMLoadCMPB如下
bool EHRPWMLoadCMPB(unsigned int baseAddr,unsigned int CMPBVal,bool enableShadowWrite,unsigned int ShadowToActiveLoadTrigger,bool OverwriteShadowFull)
{bool status FALSE;if((OverwriteShadowFull) ||((HWREGH(baseAddrEHRPWM_CMPCTL) EHRPWM_CMPCTL_SHDWBFULL) EHRPWM_SHADOW_B_EMPTY)){HWREGH(baseAddr EHRPWM_CMPCTL) (HWREGH(baseAddr EHRPWM_CMPCTL) (~EHRPWM_CMPCTL_SHDWBMODE)) | ((enableShadowWrite EHRPWM_CMPCTL_SHDWBMODE_SHIFT) EHRPWM_CMPCTL_SHDWBMODE);HWREGH(baseAddr EHRPWM_CMPCTL) (HWREGH(baseAddr EHRPWM_CMPCTL) (~EHRPWM_COMPB_LOAD_MASK)) | ((ShadowToActiveLoadTrigger EHRPWM_CMPCTL_LOADBMODE_SHIFT) EHRPWM_COMPB_LOAD_MASK);HWREGH(baseAddr EHRPWM_CMPB) CMPBVal EHRPWM_CMPB_CMPB;status TRUE;}return status;
}函数与加载比较器A值函数基本一致不同的只是判断的条件变成了CMPB shadow register是否满。设置的位变成了CMPCTL的SHDWBMODE和LOADBMODE位比较器数据写往了CMPB。这里不再细述。
6.7 功能限定配置输出引脚触发方式设定 函数EHRPWMConfigureAQActionOnA设定输出引脚触发方式这里设置时间基准计数等于有效计数比较寄存器A/B值时EPWM1_A翻转波形由EPWM1_A输出。该API如下
void EHRPWMConfigureAQActionOnA(unsigned int baseAddr,unsigned int zero,unsigned int period,unsigned int CAUp,unsigned int CADown,unsigned int CBUp,unsigned int CBDown,unsigned int SWForced)
{HWREGH(baseAddr EHRPWM_AQCTLA) ((CBDown EHRPWM_AQCTLA_CBD_SHIFT) EHRPWM_AQCTLA_CBD) |((CBUp EHRPWM_AQCTLA_CBU_SHIFT) EHRPWM_AQCTLA_CBU) |((CADown EHRPWM_AQCTLA_CAD_SHIFT) EHRPWM_AQCTLA_CAD) |((CAUp EHRPWM_AQCTLA_CAU_SHIFT) EHRPWM_AQCTLA_CAU) |((period EHRPWM_AQCTLA_PRD_SHIFT) EHRPWM_AQCTLA_PRD) |((zero EHRPWM_AQCTLA_ZRO_SHIFT) EHRPWM_AQCTLA_ZRO);HWREGH(baseAddr EHRPWM_AQSFRC) (HWREGH(baseAddr EHRPWM_AQSFRC) (~EHRPWM_AQSFRC_ACTSFA)) | ((SWForced EHRPWM_AQSFRC_ACTSFA_SHIFT) EHRPWM_AQSFRC_ACTSFA);
}该函数设置AQCTLA寄存器的CBD、CBU、CAD、CAU、PRD、ZRO位配置EPWM模块的A通道在相应事件发生时的动作。然后设置AQSFRC寄存器的ACTSFA位配置EPWM1_A在One-time Force A被invoke时的动作action。 指南P472 指南P474 这里程序设置在TBCNT向上计数等于CMPA和CMPB时EPWM1_A输出翻转其它时候不动作。
6.8 禁用死区模块
EHRPWMDBOutput函数选择死区模块的输出模式这里禁用死区模块由AQ模块action qualifier输出的信号在通过死区模块dead band时被旁路不做任何处理信号被直接输出到斩波PCPWM chopper子模块注意图中DB的虚线虚线表示旁路处理。 指南P417
通过设置DBCTL[OUT_MODE]位可以控制信号是否旁路如图 指南P418
该API如下
void EHRPWMDBOutput(unsigned int baseAddr, unsigned int DBgenOpMode)
{HWREGH(baseAddr EHRPWM_DBCTL) (HWREGH(baseAddr EHRPWM_DBCTL) (~EHRPWM_DBCTL_OUT_MODE)) |((DBgenOpMode EHRPWM_DBCTL_OUT_MODE_SHIFT) EHRPWM_DBCTL_OUT_MODE);
}函数通过设置DBCTL[OUT_MODE]位可以设置4种不同的输出模式分别确定A通道和B通道信号是否要旁路。 指南P476
6.9 禁用斩波子模块
EHRPWMChopperDisable函数设置PCCTL的CHPEN位为0禁用PWM斩波子模块的PWM斩波功能信号经过斩波子模块时直接被bypass不作任何处理。该API如下
void EHRPWMChopperDisable(unsigned int baseAddr)
{HWREGH(baseAddr EHRPWM_PCCTL) (~EHRPWM_PCCTL_CHPEN);
}指南P422 指南P478
6.10 禁用错误控制事件
EHRPWMTZTripEventDisable函数禁用错误控制事件trip event当TZ引脚输入了错误信号时错误处理模块Trip Zone将不会作任何处理。这里程序设置TZSEL[OSHT1]位和TZSEL[CBC1]位为0禁用了EPWM1模块的Trip Zone子模块产生CBC事件Cycle-by-Cycle和OSHT事件One-Shot。该API如下
void EHRPWMTZTripEventDisable(unsigned int baseAddr, bool osht_CBC)
{if(EHRPWM_TZ_ONESHOT osht_CBC){HWREGH(baseAddr EHRPWM_TZSEL) (~EHRPWM_TZSEL_OSHT1);}if(EHRPWM_TZ_CYCLEBYCYCLE osht_CBC){HWREGH(baseAddr EHRPWM_TZSEL) (~EHRPWM_TZSEL_CBC1);}
}指南P428 指南P479
6.11 事件触发配置
6.11.1 每三次事件发生产生中断 EHRPWMETIntPrescale函数设置事件触发event triggerET子模块的ETPS寄存器event prescale设置ETPS[INTPRD]位对要产生中断的事件进行预分频处理即发生多少次事件才产生一次中断这里程序设置为3次即每3次事件发生产生1次中断。ET子模块接收由时基子模块time-base和计数器比较子模块counter-compare所产生的事件信号输入并产生中断信号给CPU。要产生中断的事件由ETSEL[INTSEL]位选择。EHRPWMETIntPrescale函数如下
void EHRPWMETIntPrescale(unsigned int baseAddr, unsigned int prescale)
{HWREGH(baseAddr EHRPWM_ETPS) (HWREGH(baseAddr EHRPWM_ETPS) (~EHRPWM_ETPS_INTPRD)) |((prescale EHRPWM_ETPS_INTPRD_SHIFT) EHRPWM_ETPS_INTPRD);
}指南P484
6.11.2 时间基准等于有效计数比较寄存器B值产生事件
EHRPWMETIntSourceSelect函数设置产生EPWM中断的源source函数设置ETSEL[INTSEL]位确定什么事件发生时ETPS[INTCNT]会加1。这里程序设置源为CTRUCMPB即TBCTR向上计数到等于CMPB时产生一次事件。该API如下
void EHRPWMETIntSourceSelect(unsigned int baseAddr, unsigned int selectInt)
{HWREGH(baseAddr EHRPWM_ETSEL) (HWREGH(baseAddr EHRPWM_ETSEL) (~EHRPWM_ETSEL_INTSEL)) |((selectInt EHRPWM_ETSEL_INTSEL_SHIFT) EHRPWM_ETSEL_INTSEL);
}指南P432 指南P483
6.12 使能中断
EHRPWMETIntEnable函数设置ETSEL[INTEN]位为1使能EPWMx_INT中断信号的产生。该API如下
void EHRPWMETIntEnable(unsigned int baseAddr)
{HWREGH(baseAddr EHRPWM_ETSEL) | EHRPWM_ETSEL_INTEN;
}6.13 禁用高精度子模块
EHRPWMHRDisable函数设置HRCNFG寄存器HRPWM configuration register的EDGEMODE位禁用HRPWM功能。该API如下
void EHRPWMHRDisable(unsigned int baseAddr)
{HWREGH(baseAddr EHRPWM_HRCNFG) (~EHRPWM_HR_EDGEMODE);
}指南P488
7.斩波可选 斩波函数如下
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);
}7.1 设置斩波占空比
EHRPWMConfigureChopperDuty函数设置PCCTL[CHPDUTY]位设置斩波PSCLK的占空比这里设为3h即50%该API如下
void EHRPWMConfigureChopperDuty(unsigned int baseAddr, unsigned int dutyCycle)
{HWREGH(baseAddr EHRPWM_PCCTL) (HWREGH(baseAddr EHRPWM_PCCTL) (~EHRPWM_PCCTL_CHPDUTY)) |((dutyCycle EHRPWM_PCCTL_CHPDUTY_SHIFT) EHRPWM_PCCTL_CHPDUTY);
}指南P424
7.2 设置斩波频率
EHRPWMConfigureChopperFreq函数设置PCCTL[CHPFREQ]通过设置分频细述设置斩波频率斩波频率是从SYSCLKOUT即CPU时钟频率分频得来的。该API如下
void EHRPWMConfigureChopperFreq(unsigned int baseAddr, unsigned int freqDiv)
{if(freqDiv EHRPWM_PCCTL_CHPFREQ_DIVBY8){freqDiv EHRPWM_PCCTL_CHPFREQ_DIVBY8;}HWREGH(baseAddr EHRPWM_PCCTL) (HWREGH(baseAddr EHRPWM_PCCTL) (~EHRPWM_PCCTL_CHPFREQ)) |((freqDiv EHRPWM_PCCTL_CHPFREQ_SHIFT) EHRPWM_PCCTL_CHPFREQ);
}指南P422 指南P478
7.3 设置单个脉冲宽度 EHRPWMConfigureChopperOSPW函数设置PCCTL[OSHTWTH]位设置one-shot pulse width这里设为0x0F即one-shot脉冲宽度为16 x SYSCLKOUT/8。 指南P423 指南P478
7.4 使能斩波子模块
EHRPWMChopperEnable函数设置PCCTL[CHPEN]位为1使能斩波子模块该API如下
void EHRPWMChopperEnable(unsigned int baseAddr)
{HWREGH(baseAddr EHRPWM_PCCTL) | EHRPWM_PCCTL_CHPEN;
}指南P478
8.中断服务函数
8.1 PWM事件中断服务函数 PWM事件中断服务函数PWMEventIsr如下
void PWMEventIsr(void)
{IntEventClear(SYS_INT_EHRPWM1);EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
}函数先是清除EVTFLAGn被置位的中断标志SYS_INT_EHRPWM1位,IntEventClear函数在\demo\StarterWare\Source\StarterWare\SystemConfig 路径system_config工程下的interrupt.c文件中函数如下
void IntEventClear(unsigned int sysINT)
{unsigned int dspintcREG;/* Check the system event number */ASSERT((sysINT 127));/* Get the address of the correct event register */dspintcREG SOC_INTC_0_REGS DSPINTC_EVTCLR((sysINT 5));/* Clear the corresponding bit within the event clear register */HWREG(dspintcREG) DSPINTC_EVTCLR_EC(sysINT);
}细节可参考这篇博文。
C6748_EDMA_GPIO_中断学习笔记
然后EHRPWMETIntClear函数往ETCLR寄存器的INT位写1清除ETFLG[INT]位清除ePWM中断标志。该API如下
void EHRPWMETIntClear(unsigned int baseAddr)
{HWREGH(baseAddr EHRPWM_ETCLR) | EHRPWM_ETCLR_INT;
}指南P485 指南P485
8.2 PWM错误事件中断服务函数 PWM错误事件中断服务函数PWMTZIsr如下
void PWMTZIsr(void)
{IntEventClear(SYS_INT_EHRPWM1TZ);EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
}首先在EVTFLAGn寄存器中清除SYS_INT_EHRPWM1TZ#23对应的中断标志位然后EHRPWMTZFlagClear函数设置TZCLR的相应位清除相应错误标志这里设置TZCLR[CBC]和TZCLR[INT]位清除CBC trip latch标志和ePWM模块trip-interrupt中断标志TZFLG[INT]。EHRPWMTZFlagClear函数如下
void EHRPWMTZFlagClear(unsigned int baseAddr, unsigned int flagToClear)
{HWREGH(baseAddr EHRPWM_TZCLR) flagToClear (EHRPWM_TZCLR_OST | EHRPWM_TZCLR_CBC | EHRPWM_TZCLR_INT);
}指南P482 指南P428
9.参考文献
[1] TMS320F28027 之PWM 模块
[2] PWM死区(Dead Zone)的作用和意义 文章转载自: http://www.morning.hmxrs.cn.gov.cn.hmxrs.cn http://www.morning.ndpzm.cn.gov.cn.ndpzm.cn http://www.morning.fgqbx.cn.gov.cn.fgqbx.cn http://www.morning.gpsr.cn.gov.cn.gpsr.cn http://www.morning.cwznh.cn.gov.cn.cwznh.cn http://www.morning.muzishu.com.gov.cn.muzishu.com http://www.morning.zcckq.cn.gov.cn.zcckq.cn http://www.morning.kqxng.cn.gov.cn.kqxng.cn http://www.morning.tscsd.cn.gov.cn.tscsd.cn http://www.morning.rbbyd.cn.gov.cn.rbbyd.cn http://www.morning.yjfzk.cn.gov.cn.yjfzk.cn http://www.morning.fkrzx.cn.gov.cn.fkrzx.cn http://www.morning.wcqkp.cn.gov.cn.wcqkp.cn http://www.morning.bwmm.cn.gov.cn.bwmm.cn http://www.morning.ydzly.cn.gov.cn.ydzly.cn http://www.morning.dtlqc.cn.gov.cn.dtlqc.cn http://www.morning.zfcfx.cn.gov.cn.zfcfx.cn http://www.morning.plqkz.cn.gov.cn.plqkz.cn http://www.morning.phechi.com.gov.cn.phechi.com http://www.morning.playmi.cn.gov.cn.playmi.cn http://www.morning.mqwnz.cn.gov.cn.mqwnz.cn http://www.morning.fhghy.cn.gov.cn.fhghy.cn http://www.morning.srnth.cn.gov.cn.srnth.cn http://www.morning.zsfooo.com.gov.cn.zsfooo.com http://www.morning.ctlbf.cn.gov.cn.ctlbf.cn http://www.morning.kqglp.cn.gov.cn.kqglp.cn http://www.morning.ylkkh.cn.gov.cn.ylkkh.cn http://www.morning.nlmm.cn.gov.cn.nlmm.cn http://www.morning.lmrcq.cn.gov.cn.lmrcq.cn http://www.morning.drywd.cn.gov.cn.drywd.cn http://www.morning.nqmhf.cn.gov.cn.nqmhf.cn http://www.morning.swkzr.cn.gov.cn.swkzr.cn http://www.morning.rqfzp.cn.gov.cn.rqfzp.cn http://www.morning.lynmt.cn.gov.cn.lynmt.cn http://www.morning.pzcqz.cn.gov.cn.pzcqz.cn http://www.morning.lrflh.cn.gov.cn.lrflh.cn http://www.morning.kwqt.cn.gov.cn.kwqt.cn http://www.morning.mumgou.com.gov.cn.mumgou.com http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.pymff.cn.gov.cn.pymff.cn http://www.morning.sjqml.cn.gov.cn.sjqml.cn http://www.morning.gpnwq.cn.gov.cn.gpnwq.cn http://www.morning.bdtpd.cn.gov.cn.bdtpd.cn http://www.morning.ryzgp.cn.gov.cn.ryzgp.cn http://www.morning.fgrcd.cn.gov.cn.fgrcd.cn http://www.morning.hytfz.cn.gov.cn.hytfz.cn http://www.morning.lgsfb.cn.gov.cn.lgsfb.cn http://www.morning.nyplp.cn.gov.cn.nyplp.cn http://www.morning.sfyqs.cn.gov.cn.sfyqs.cn http://www.morning.hhfwj.cn.gov.cn.hhfwj.cn http://www.morning.jbblf.cn.gov.cn.jbblf.cn http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn http://www.morning.kgxyd.cn.gov.cn.kgxyd.cn http://www.morning.zzhqs.cn.gov.cn.zzhqs.cn http://www.morning.shuanga.com.cn.gov.cn.shuanga.com.cn http://www.morning.rbgwj.cn.gov.cn.rbgwj.cn http://www.morning.yrctp.cn.gov.cn.yrctp.cn http://www.morning.tjkth.cn.gov.cn.tjkth.cn http://www.morning.nlgmr.cn.gov.cn.nlgmr.cn http://www.morning.djxnn.cn.gov.cn.djxnn.cn http://www.morning.jgnjl.cn.gov.cn.jgnjl.cn http://www.morning.dzyxr.cn.gov.cn.dzyxr.cn http://www.morning.sryhp.cn.gov.cn.sryhp.cn http://www.morning.xmjzn.cn.gov.cn.xmjzn.cn http://www.morning.mhwtq.cn.gov.cn.mhwtq.cn http://www.morning.nlysd.cn.gov.cn.nlysd.cn http://www.morning.qtryb.cn.gov.cn.qtryb.cn http://www.morning.rykx.cn.gov.cn.rykx.cn http://www.morning.sfcfy.cn.gov.cn.sfcfy.cn http://www.morning.kqgqy.cn.gov.cn.kqgqy.cn http://www.morning.mjkqj.cn.gov.cn.mjkqj.cn http://www.morning.qsy40.cn.gov.cn.qsy40.cn http://www.morning.twdwy.cn.gov.cn.twdwy.cn http://www.morning.knswz.cn.gov.cn.knswz.cn http://www.morning.nwljj.cn.gov.cn.nwljj.cn http://www.morning.pxsn.cn.gov.cn.pxsn.cn http://www.morning.gstmn.cn.gov.cn.gstmn.cn http://www.morning.lwqst.cn.gov.cn.lwqst.cn