最近有段时间没写总结了,最近也学了一些东西,做了PID的程序,搭了TEC的MAX1968驱动电路,将温度控制在了0.05度左右的波动。但是新的控制对应来了之后,新的TEC电压较高,效果也不好了,不知道DSP产生PWM用298N驱动效果怎么样。
现在想要达到更高的精度,打算采用16位的AD芯片,就申请了ADI的AD7606芯片,先是自己用普通的电烙铁把它焊在转接板上,精细活啊,还弄废了一片,罪过罪过。转接板的双排结构让电路不好焊,不得已用了一些飞线(我以前是从来不用导线接的,不过一般会把万用空板弄成双层走线的)。
好了,回到正题:接好了之后接到开发板上,却不能用,因为底板的数据地址是CPLD分配好的,我直接无从下手。核心板上的引脚间距为2mm,不好接,也没有2mm间距的万用空板,我甚至想到了自己做一个DSP核心板。
在上淘宝看看DSP核心板设计的时候(因为我对DSP核心板上的ROM和RAM的用处不理解,因为我也用不到啊),在和一个南航博士美女(她自称的)店主聊的时候,偶然说道,有2mm转2.54mm的杜邦线!!!好happy啊,省了好多事啊~!于是就淘宝买了杜邦线,嗷对了,电路板的飞线用航空导线最好了,因为它的表皮耐高温,而且线还细,比常见的那种好多了。
OK,单独用核心板,我又摸索了DSP的IO口的引脚的数据地址,是这样的,DSP23885每32个IO给出一个地址,实际上是16个IO,也就是16位数据一个地址的;地址都是IO端口名称高的为数据的高位;使用时,配置好MUX为普通的IO,还有方向为输入或输出,最后预定义数据的地址就行了;使用的时候就直接给地址送数据就可以了。【实际上,这是把DSP当单片机那么用了,他原本的地址总线和数据总线都被我当成IO了...】
先是调12864液晶的程序,调试的时候犯了错误,没有配置数据线的IO口,结果郁闷了半天;然后晚上睡觉的时候迷迷糊糊的就意识到这个问题了,第二天(也就是昨天)一看,果然是这个原因!!
-----------------好了,进入正题 =.=
昨晚开始写AD7606的程序,因为ADI官网给出的程序是串行的,也没什么用处。于是就按照一个网上的作者说错误的程序开始写,按照Datasheet的时序图来写实际上,并行的程序要容易的多,还有7606的数据手册是中文的,也挺好的。
今天早上试了一下程序,不行,读到的数据是65535,明显不对。然后开始找原因,将数据线接地,读入的数据是正确的,说明数据线没错。然后将原来没接的过采样的3个引脚都接数字地,也没影响。检查硬件电路也没错误。又开始在网上找解决办法。bbs.****.com上貌似有ADI的工程师在解答,看了一些问题的解答,有一个人说他的BUSY一直为低电平呢,【应对:有两点建议 1.请对照数据手册中图2和图3的时序来检查一下,是哪个管脚的信号不正常。比如reset,convst信号等。 2.换个芯片看是否有同样现象。其实,首先核对硬件连接是否正确,包括供电,接地,参考电平,时钟等,然后您需要检查寄存器配置是否正确,再逐渐调试软件,仔细研究时序图,这才是正确方法】我又编程检查了我的BUSY(程序如下),一直没有高电平,说明AD根本就没有进行转换,于是我就测CONVST的引脚,果然不正常,检查了硬件和程序,还是编程控制不了它的高低,一上午就这么过去了。。。
-------------
#if 0 //条件编译,1时编译,0时不编译;此处用于调试,能不能接收到AD的BUSY信号
if(AD_BUSY == 1)
{
while(1); // 调试中,停止程序后如果光标停在这里,说明BUSY读取到了高电平,说明正在转换
}
#endif
---------------
中午继续,换了控制信号的I/O口,还是不行;又新建了一个程序,现在是一个可以控制,一个不能控制...见鬼了。这时!!发现我的引脚初始化子程序没有在mian函数里调用!!!和液晶一个错误~!!之前调试的时候在mian函数里,现在做成子函数了就忘记调用了。改正之后,还存在一个I/O可以控制,一个不能控制(我的两个CONVST是分开的),程序如下,看上去没什么问题啊~
----------------------------------------
CONVSTA = 0;
CONVSTB = 0;
DELAY_US(10);
CONVSTA = 1;
CONVSTB = 1;
----------------------------------------------
后来,我想是不是要加延时,DSP不能过快的写I/O的数据,修改如下:
----------------------------------------------
CONVSTA = 0;
DELAY_US(1);
CONVSTB = 0;
DELAY_US(10);
CONVSTA = 1;
DELAY_US(1);
CONVSTB = 1;
------------------------------------------
果然可以了,总结:如果连续控制IO写数据,中间一定要延时~!!否则在执行程序的时候只会执行最后一个....原因我也不知道
ok,总算是能让AD7606在DSP的控制下正常工作了~~~第一次自己原创程序,成功了,之前都是在改别人的程序....嗯,今天还是很高兴的!开启了个人的新的时代呀。好吧,只要按照时序图,一步步的来,出错了慢慢找原因,就能行的,就和前段时间吧液晶的程序仔细弄懂了一样。一味的找别人的程序是不可靠的,懂了以后还要回自己写出来才行~~加油!
------------------------------------------2012.12.3 17:43 SUNELEO
【补充】:今天发现
if(AD_BUSY==1)
{
while(1);
}
这语句不能判断busy,因为给CONVST转换上升沿,BUSY的响应时间是40ns,if语句不能立即判断出busy是变成了高电平;而while语句执行时间慢(应该是这样,具体所用的机器周期数我也没查到)。所以while语句在此并没有问题。
至于检测是否有busy信号。
if(AD_BUSY==1)
{while(1);}
if(AD_BUSY==1)
{while(1);}
这样就可以检测到了。