TMS320F2812调试记录一

一、关于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_FREQUENCY
1000000T/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=30
1000000/(2*7500)=10KHz;
在此程序中,死区控制器寄存器DBTCONA的值为0x0AF4;
转换成二进制: 0000 1010 1111 0100
死区定时器控制器寄存器DBTCONA定义如下:

在这里插入图片描述
死区定时器周期:1010在这里插入图片描述
即 m=10
死区定时器预定标因子:101
TCKL/32=150MHz/32
则死区时间:tBD=10*32/150=2.133us
实际测试值见下图:

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值