一、关于GPIOD0/T1CTRIP_PDPINTA引脚的使用
通过DSP 2812来控制电机时,在调试过程中遇到了一些问题,将GPIOD0/T1CTRIP_PDPINTA用作普通GIPO输出,当控制器上电后,将电机控制器起动开关打开,此时事件管理器EVA控制的6个PWM有信号输出,起动开关关闭时,事件管理器EVA控制的6个PWM无信号输出。此时不关电源,再次打开起动开关时,事件管理器EVA控制的6个PWM却无信号输出,通过仿真器读到此时起动标志位已经置为1,却没PWM信号输出。查阅得到PWM的输出与DSP的GPIOD0/T1CTRIP_PDPINTA脚有关,详见下图。
为此,屏蔽main函数中所有与GPIOD0相关的语句,重新拨动开关,恢复正常;屏蔽GPIOD0输出为0,保留GPIOD0输出为1的所有语句,重新拨动开关,恢复正常;屏蔽GPIOD0输出为1,保留GPIOD0输出为0的所有语句,重新拨动开关故障依旧。(注:这里将GPIOD0口用作通用GPIO输出口)。
以为是该引脚对应的中断未屏蔽引起的PWM模块不输出,将PDPINTA对应中断进行屏蔽,故障依旧,后面查阅资料详见下图,如果当控制器的PWM信号在输出时,如果该引脚信号是低电平时,也不会有PWM信号输出,目前还未找到一种比较好的方法,能够同时将GPIOD0用作普通GPIO口,同时又不会影响PWM的输出,该引脚在用作通用GPIO口使用时需谨慎使用。
二 、关于PWM波频率和死区时间的计算
这里一个例子来说明:
首先振荡器时钟(外部晶振时钟):是OSCCLK=30MHz;
经锁相环PLL得到CPU时钟:
SysCtrlRegs.PLLCR.bit.DIV = 0xA;
CLKIN=(OSCCLK10)/2=150 MHz;
高速时钟:
SysCtrlRegs.HISPCP.all = 0x0000;
HSPCLK=SYSCLKOUT/1=150 MHz;
事件管理器EVx采用的是高速时钟;
#define ISR_FREQUENCY 10
float32 T = 0.001/ISR_FREQUENCY;
#define SYSTEM_FREQUENCY 150
pwm1.PeriodMax = SYSTEM_FREQUENCY1000000T/2;
在这里:
EvaRegs.T1PR = p->PeriodMax;
PeriodMax保留的值即是定时器1周期中断T1PR的值。
如果想要计算的话大概可以算一下,此时T1PR的值为7500(十进制)
在此程序中,定时器1控制寄存器设置的值为0X8840
转换成二进制:1000 1000 0000 0100
时钟源选择:00 选择的是内部时钟;
输入时钟预定标因子:000
则最终提供给定时器1的时钟,
TCLK=HSPCLK/1=150MHz
计数模式选择:01连续增/减计数模式
则有连续增减计数模式的PWM计算公式:
由上可知T1PR为7500,则有PWM频率:f=301000000/(2*7500)=10KHz;
在此程序中,死区控制器寄存器DBTCONA的值为0x0AF4;
转换成二进制: 0000 1010 1111 0100
死区定时器控制器寄存器DBTCONA定义如下:
死区定时器周期:1010
即 m=10
死区定时器预定标因子:101
TCKL/32=150MHz/32
则死区时间:tBD=10*32/150=2.133us
实际测试值见下图: