Archive

Archive for the ‘学习笔记’ Category

LTM8032电压调节电阻计算方法

July 25th, 2011 will No comments

LTM8032以其超低的噪声(Ultralow Noise),以及宽电压输入(3.6V~36V),宽电压输出(0.8V~10V),大负载能力(2A),完全可以替换掉LTM8023。

然而在使用过程中调节电压输出的电阻计算公式,如下图所示。

clip_image002

而实际使用中需要将最终Radj乘以2

Categories: 学习笔记 Tags:

QuartusII.sof文件转换为.jic文件的几种方法

July 1st, 2011 will No comments

在默认的情况下,Quartus编译综合之后生成的sof文件,而通常都使用JTAG方式下载FPGA外部的配置芯片,这就需要就.sof文件转换为.jic文件。有点像TI DSP的.out文件转换.bin文件,也是为了烧写下载方便。

1、通过Quartus的图像化界面转换

Quartus已经提供了转换工具,并且是图形化的。在“File->Convert Programming Files”,转化界面如下图所示。

quartus_program file convert副本

2、通过命令行工具quartus_cpf.exe

quartus_cpf -d EPCS16 –sfl_device=EP3C40F324 -c sEP3CTest.sof sEP3CTest.jic

但每次输入命令行太麻烦,还是使用批处理简化一下操作,双击即可搞定O(∩_∩)O哈哈~。下载示例文件

在命令行下输入quartus_cpf –help=jic,可以查看sof文件转jic文件的帮助。

PS:quartus_cpf.exe是Quartus的bin目录下的文件,此软件功能非常完备,可以查看—help中的说明。这个软件的编写非常完备,值得学习呀。

Categories: 学习笔记 Tags: ,

开关电源与线性电源

May 30th, 2011 will No comments

用过的电源芯片也比较多了,主要就是线性电源与开关电源。

线性电源的优点全线性稳压,线性稳压的好处是抗干扰能力强,如果再加一些滤波电容,可以控制纹(Ripple)波到很小很小,据说能到0.1mV。

线性电源的缺点就是转换效率低,发热量很大,烫手,大电流输出时一般都需要加散热片,效率低是线性稳压电源的致命缺点。线性电源的输入端与输出端的电流是相等的,效率一般是由输入电压与输出电压的压差控制的,为输出电压值与输入电压值之比clip_image002。现在有些低压差的线性电源芯片,可以适当的提高效率,如LT3021、LTC1844等,压差200mV即可驱动下级输出,只是在实际使用中用不到此极限值,因输入电压很难调准到某个准确的值,而且个电路板之间存在差异,为了减少批生产的工作的工作量,会选择500mV以上的压差,从而损失一些效率。

开关电源是通过变压器原理将电压进行变化,输入端的电流与输出端的电流不等,效率一般与负载使用输出的电压与电流均有关。

开关电源的优点,效率高,效率在90%以上是比较正常,封装够小,外围元器件又少。缺点是电磁兼容性(EMC)不好,由于开关有频率,脉冲啊,当开关电源芯片后面有一个高频的脉冲信号,比如一个完整的电路中有两款开关电源或者,开关电源后面接一个频率很高的MCU,好的情况下看看的电路纹波,简直就是正弦波,差的情况电路就出错,引起电路不稳定。往往是比较难解决的。

目前开关电源工艺的改进,开发出了超低噪的开关电源芯片,如LTM8032,电磁兼容性好,效率高且可接较大的负载。

PS:我们使用凌特的电源较多,比较熟并非AD。凌特的电源也是出了名的贵,焊接费都高一些,LGA封装嘛。

Categories: 学习笔记 Tags:

俄罗斯套娃问题的C语言解

June 6th, 2010 will 1 comment

貌似是中兴出的题目,原题如下:

伊万洛夫在比武大会上力克群雄,成为新一届“草原雄鹰”,为部落赢得了莫大荣誉。首领决定要重重奖赏,他对伊万洛夫说:“孩子,你是知道的,面前的这片草原,南北向和东西向的道路纵横交错。现在,路口放着纯金打造的俄罗斯娃娃,重量大小不等,重的都能装下轻的。你可以沿着道路飞奔,拾取路口的娃娃,要求是任何时刻必须是一个套娃,装好后就不能再拆开了。注意不要走重复路。”
请你为伊万洛夫规划路线,使得他能够有最大的收获。
Input:  cross.txt
输入包括多组测试用例;
每个测试用例开始是一对整数<R, C>,R表示东西向道路数,C表示南北向道路总数;接下来R行,每行包括C个正整数W[r,c] ,分别表示第r条东西向道路与第c条南北向道路交叉处路口放置的俄罗斯娃娃的重量。
Output:
输出能有最大收获的路径规划。
假设1:
   cross.txt
   2     7
   1     2   13   6   7  12  11
   14   3   4     5   8   9   10
输出:
1 2 3 4 5 6 7 8 9 10 11 12
假设2:
   cross.txt
   5    5

1   16   15   14   13

2   17   24   23   12
3   18   25   22   11
4   19   20   21   10
5    6     7     8     9
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
注释:
1)从<0,0>出发;
2)路线不能重复;
3)不要求最后回到出发点。

貌似很多人都想到了递归方法的实现,由于对于递归使用很少,没有把握,就使用以前维特比译码相类似的方法。直接放代码,代码质量较差,见谅。

/*
http://xinzero.com
will@xinzero.com
*/
#include <stdio.h>
#include <stdlib.h>

struct stat{
	int met;	//profit
	int value;
	int x;
	int y;
	stat *plast;
};

void main()
{
	int *pint=NULL,*pInit=NULL;
	stat *pPath=NULL,*pSta=NULL,*pMax=NULL;
	int row=0,col=0;
	int i=0,j=0,k=0;
	int m=0,n=0,l=0;
	int imax=0;
	int M=0,R=0;
	printf("input R,C value:");
	scanf_s("%d %d",&row,&col);
	printf("[R,C]=[%d,%d]\r\n",row,col);
	pInit = (int*)malloc(sizeof(int)*row*col);
	pint = pInit;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			scanf_s("%d",pint++);
		}
	}

	pint = pInit;
	printf("The path\r\n");
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			printf("%d ",*pint++);
		}
		printf("\r\n");
	}

	pint = pInit;
	pPath = (stat*)malloc(sizeof(stat)*row*row*col*col);
	pSta = pPath;
	for(i=0;i<row*col*row*col;i++)
	{
		pSta->met =-1;
		pSta->value = 0;
		pSta->plast =NULL;
		pSta++;
	}
	pSta = pPath;
	pSta->met = *pint;
	pSta->value = *pint;
	pSta->x=0;
	pSta->y=0;
	i=j=0;
	for(k=1;k<row*col;k++)
	{
		M = 0;
		for(l=0;l<row*col;l++)
		{
			m = l*row*col+k;	//current valid
			if(pSta[m-1].met==-1)
			{
				continue;
			}
			else
			{
				i = pSta[m-1].x;
				j = pSta[m-1].y;
				printf("i=%d,j=%d",i,j);
				if((i+1)<row)
				{
					n = (i+1)*col + j;
					if(pint[n]>pSta[m-1].value)
					{
						R = M*row*col + k;
						pSta[R].met = pSta[m-1].met + pint[n];
						pSta[R].value = pint[n];
						pSta[R].x = i+1;
						pSta[R].y = j;
						pSta[R].plast = &pSta[m-1];
						printf("[%d,%d],%d,met:%d",i+1,j,R,pSta[R].met);
						M++;
					}
				}
				if((i-1)>=0)
				{
					n = (i-1)*col + j;
					if(pint[n]>pSta[m-1].value)
					{
						R = M*row*col + k;
						pSta[R].met = pSta[m-1].met + pint[n];
						pSta[R].value = pint[n];
						pSta[R].x = i-1;
						pSta[R].y = j;
						pSta[R].plast = &pSta[m-1];
						printf("[%d,%d],%d,met:%d",i-1,j,R,pSta[R].met);
						M++;
					}
				}
				if((j+1)<col)
				{
					n = i*col + j+1;
					if(pint[n]>pSta[m-1].value)
					{
						R = M*row*col + k;
						pSta[R].met = pSta[m-1].met + pint[n];
						pSta[R].value = pint[n];
						pSta[R].x = i;
						pSta[R].y = j+1;
						pSta[R].plast = &pSta[m-1];
						printf("[%d,%d],%d,met:%d",i,j+1,pSta[R],pSta[R].met);
						M++;
					}
				}
				if((j-1)>=0)
				{
					n = i*col + j-1;
					if(pint[n]>pSta[m-1].value)
					{
						R = M*row*col + k;
						pSta[R].met = pSta[m-1].met + pint[n];
						pSta[R].value = pint[n];
						pSta[R].x = i;
						pSta[R].y = j-1;
						pSta[R].plast = &pSta[m-1];
						printf("[%d,%d],%d,met:%d",i,j-1,pSta[R],pSta[R].met);
						M++;
					}
				}
				printf("\r\n");
			}
		}
		printf("\r\n");
	}

	for(k=row*col-1;k>=0;k--)
	{
		for(l=0;l<row*col;l++)
		{
			m = l*row*col+k;
			//printf("%d,%d,",m,pSta[m].met);
			if(pSta[m].met==-1)
			{
				continue;
			}
			else
			{
				if(imax<pSta[m].met)
				{
					imax = pSta[m].met;
					pMax = &pSta[m];
					printf("imax:%d\n",imax);
				}

			}
		}
	}
	pint = pInit;
	i=0;
	//do
	while(pMax->plast!=NULL)
	{
		*pint = pMax->value;
		pMax = pMax->plast;
		printf("%d,%d ",i,*pint);
		pint++;
		i++;
	}//while(pMax->plast!=NULL);

	*pint = pMax->value;
	pMax = pMax->plast;
	printf("%d,%d ",i,*pint);
	pint++;
	i++;
	printf("\r\n");
	pint = pInit;
	while(i>0)
	{
		printf("%d ",pint[i-1]);
		i--;
	}
	printf("\r\n");
	//system("pause");
	free(pInit);
	free(pPath);
}
Categories: 学习笔记 Tags:

CCS3.3关于__strasgi的bug

April 28th, 2010 will No comments

今天在用TI CCS3.3编译程序的是否发现一个关于__strasgi 未定义的bug。将以下代码放到CCS3.3中编译

//test.h
typedef struct{
	float p[10];
	unsigned char d[6];
	unsigned char valid[6];
}szero;
void tefun(szero vi);
//test.c
#include "Test.h"
void tefun(szero vi)
{
}

就会出现__strasgi 未定义的错误,经测试发现,使用C++编译器也会出现类似的错误,而将此代码用VC2005编译则没有错误提示。测试还发现只有szero中的变量类型为int或float的数组且长度大于3才会出这样的问题。出现的原因不清楚,但是解决办法倒是很简单,将参数改成指针型就可以了。

Categories: 学习笔记 Tags: