引言
美国微芯公司推出的dsPIC33FJ256MC710高性能16位数字信号控制器,采用了改进型的哈佛架构、C编译器优化的指令集、流水线取指令方式,具有实用、低价、指令集小、功耗低、速度高、体积小、功能强、抗干扰能力强等特点。dsPIC33FJ256MC710高性能16位数字信号控制器内含有12位的A/D转换器(500 ksps)、直接存储器访问(DMA)、比较输出、捕捉输入、I2C接口、SPI接口、CAN接口、USART接口、Flash程序存储器自读写等强大的控制功能,内核又具有强大的数字信号处理能力,具有广阔的应用前景,主要应用于电机控制等领域。
我们在芯片的实际应用中遇到了一些预想不到的问题,有的是由于硬件设计造成,有的是由于外部干扰造成,还有的是软件初始化造成的。这些问题的解决方法在微芯公司的应用文档中未提供,我们花了较多的时间进行分析、测试,最后解决了问题。本文将这些解决方法介绍给大家,
以避免大家在这个问题上花费太多的时间或因一些无法解决的问题而造成损失。
1 正交编码器接口模块的问题
dsPIC33FJ256MC710的正交编码器接口模块(以下简称QEI模块),在调试(Debug)模式下,能够正常工作,可以得到光电编码器的转动信号,但是在程序下载(Program)后模块不工作,不能得到光电编码器的转动信号。这个问题有些隐蔽,不易发现,在我们过去使用微芯公司芯片的过程中还从未遇到过。
本文选用的光电编码器为1024线,差分信号输出。这种输出方式在工业现场使用具备较高的抗干扰能力,可以连接的导线较长。由于光电编码器的输出为差分信号,而芯片接口要求为TTL电平信号,因此增加一片AM26LS32完成电平转换,把差分信号转换为TTL电平信号。光电编码器输出的A和/A、B和/B、Z和/Z
三组差分信号接入AM26LS32芯片,转化为A、B、Z三路TTL电平信号与dsPIC33FJ256MC710的正交编码器接口模块(QEI)连接。A、B为正交编码信号,Z为光电编码器零位置信号。
dsPIC33FJ系列芯片,具有智能化的QEI模块。它由QEA、QEB和INDX三个输入通道组成。QEA和QEB这两个通道具有智能的正交解码功能。把光电编码器输出的A、B两相正交编码信号接入这两个通道,芯片通过解码算法,自动判断出光电编码器的旋转方向和旋转相对位置。INDX通道称为索引脉冲。该通道通过接入Z信号,根据绝对零位置和相对位置,就可以确定光电编码器旋转的绝对位置。硬件接口原理框图如图1所示。
图1 光电编码器与QEI模块接口电路框图
按照微芯公司的应用笔记,QEI初始化程序如下:
void InitQEI(void) {
/*****将QEI模块复用引脚配置为数字输入*****/
AD1PCFGLbits.PCFG3 = 1;
AD1PCFGLbits.PCFG4 = 1;
AD1PCFGLbits.PCFG5 = 1;
/****对QEI模块进行初始化配置*****/
QEICONbits.QEIM= 0; //禁止QEI模块
QEICONbits.CNTERR = 0;//清除任何计数错误
QEICONbits.QEISIDL = 1;//休眠期间不工作
QEICONbits.SWPAB= 0;//QEA和QEB不交换
QEICONbits.PCDOUT= 0;//正常I/O引脚操作
QEICONbits.POSRES= 1;//索引脉冲复位位置计数器
QEICONbits.TQCS = 1;//来自QEA 引脚的外部时钟
DFLTCONbits.CEID= 0;//禁止计数错误中断
DFLTCONbits.IMV = 0;//当POSCNT 寄存器将被复//位时,索引脉冲匹配所要求的AB相输入信号
DFLTCONbits.QEOUT= 1;//对于QEn引脚,使能数字//滤波器输出
DFLTCONbits.QECK=2;//数字滤波器设置为1∶4时钟分频
POSCNT= 0;//复位位置计数器
MAXCNT= 4096;//最大计数寄存器
QEICONbits.QEIM= 6;// X4模式,位置计数器由索引复位
IFS3bits.QEIIF= 0;//QEI的中断标志位IFS3bits.QEIIF
IEC3bits.QEIIE=1;//QEI的中断允许位IEC3bits.QEIIE
}
在测试光电编码器时,对索引脉冲(圈脉冲)进行检测。QEI索引脉冲中断服务子程序如下:
void __attribute__ ((interrupt, no_auto_psv)) _QEIInterrupt(void) {
static int counter=0;
IFS3bits.QEIIF=0;
counter++;
if(counter%2) {
TRISFbits.TRISF8=0;
PORTFbits.RF8=0;
}
else {
TRISFbits.TRISF8=0;
PORTFbits.RF8=1;
}
}
在使用调试(Debug)模式运行程序时,用示波器可观察到芯片53号引脚RF8上电平在每次编码器位置过零时产生了翻转。QEI模块工作正常。而使用下载(Program)模式下载程序后,用示波器察到芯片53号引脚RF8上电平在每次编码器位置过零时不发生变化,QEI模块工作不正常。
修改初始化程序,初始化复用引脚时增加对模数转化模块AD2PCFGL的配置,就解决了这个问题。程序修改如下:
/****将QEI模块复用引脚配置为数字输入****/
AD1PCFGLbits.PCFG3 = 1;
AD1PCFGLbits.PCFG4 = 1;
AD1PCFGLbits.PCFG5 = 1;
AD2PCFGLbits.PCFG3 = 1;
AD2PCFGLbits.PCFG4 = 1;
AD2PCFGLbits.PCFG5 = 1;
修改后的程序在下载(Program)模式的情况下,用示波器可以观察到芯片53号引脚RF8上电平在每次编码器位置过零时产生翻转,QEI模块正常工作。
实际应用QEI模块时,直接读取POSCNT寄存器的值,就可知道所测量旋转轴的绝对位置。本文选用1024线的光电编码器,通过配置寄存器选择X4模式,POSCNT寄存器的计数范围为0~4 096。根据索引脉冲中断和POSCNT寄存器的值,便可精确地知道旋转轴的旋转方向、旋转速度、当前旋转轴位置等,精度可以达到1/4 096。
2 RD15作为I/O输出的问题
通用I/O端口是最基本最常用的接口,单片机、数字信号处理器通过它实现最基本的高低电平逻辑控制。应用时,dsPIC33FJ256MC710的第48号引脚作为I/O输出时,对应为RD15。 RD15作为开关量输出时,软件设置为高电平,但引脚上不能建立高电平。通过大量的试验检测,发现芯片第48号引脚RD15作为I/O端口时不能正常工作。为了更清楚地说明该问题,引入47、53、54号引脚RD14、RF7、RF8与RD15作对比。相关验证程序如下:
void delay() {
unsigned int i;
for(i=0;i<650;i++) {
asm("nop");
asm("nop");
}
}
int main(void) {
TRISDbits.TRISD15=0;
TRISDbits.TRISD14=0;
TRISFbits.TRISF7=0;
TRISFbits.TRISF8=0;
while(1){
PORTDbits.RD15=0;
PORTDbits.RD14=0;
PORTFbits.RF7=0;
PORTFbits.RF8=0;
delay();
PORTDbits.RD15=1;
PORTDbits.RD14=1;
PORTFbits.RF7=1;
PORTFbits.RF8=1;
delay();
}
}
运行上述程序,用示波器观察dsPIC33FJ256MC710芯片的RD14、RF7、RF8对应的第47、53、54引脚上的电平均为规律的方波信号,而48引脚RD15上高电平不能正常建立,只有极小的尖峰脉冲,波形如图2所示。
图2 RD15引脚输出的电压波形图
图2中上部波形为用作对比的RD14对应的第47号引脚上的电平信号,下部波形为RD15对应的第48号引脚上的电平信号。下部波形与上部波形的控制方式是一样的(见上述程序),但是不能得到高电平信号。
修改程序的方法是在改变寄存器PORTDbits.RD15之后添加一个空操作指令asm("nop")。
修改后程序如下:
int main(void) {
TRISDbits.TRISD15=0;
TRISDbits.TRISD14=0;
TRISFbits.TRISF7=0;
TRISFbits.TRISF8=0;
while(1) {
PORTDbits.RD15=0;
asm("nop");
PORTDbits.RD14=0;
PORTFbits.RF7=0;
PORTFbits.RF8=0;
delay();
PORTDbits.RD15=1;
asm("nop");
PORTDbits.RD14=1;
PORTFbits.RF7=1;
PORTFbits.RF8=1;
delay();
}
}
运行修改后的程序,RD15对应的第48号引脚上也出现规律的方波信号,解决了上述问题。这个问题在应用中也是不易发现的,查了微芯公司的应用笔记也无相关说明,因此详细写出来以馈读者。
结语
本文介绍了Microchip公司的高性能16位数字信号控制器dsPIC33FJ系列芯片的内部资源,在应用dsPIC33FJ256MC710芯片时遇到的两个疑难问题。这些问题可能是由于硬件设计造成,也可能是外部干扰或软件初始化造成的,往往是预想不到的问题。本文利用相关程序和波形具体阐述了这两个问题的现象和解决方法,并附上了相应的程序,希望对读者能有所帮助。