siemens x
I/O 設備

用U盤實現(xiàn)數(shù)據(jù)采集存儲

2025China.cn   2009年12月12日
目前正在研制的系統(tǒng)為大功率光伏陣列特性測試儀,其主要用于對各種規(guī)格、容量的光伏陣列進行I-V特性的測試,為光伏系統(tǒng)(并網(wǎng)、發(fā)電)的選型提供必要的參考。該系統(tǒng)需要人員采集光伏陣列的電壓、電流、溫度、日照等數(shù)據(jù),由于該系統(tǒng)多用于野外,因此需要對所測得的數(shù)據(jù)進行存儲以便進行I-V特性曲線的繪制及光伏陣列在各種不同的日照和溫度下特性的推演。數(shù)據(jù)的采集及存儲可由系統(tǒng)控制芯片通過SPI接口USB118模塊通訊,并輔以大容量USB存儲設備來完成。
在所設計的系統(tǒng)中采用了西安達泰電子有限責任公司提供的USB118AD模塊,其具有標準2.0協(xié)議及支持1G以上優(yōu)盤的優(yōu)點,這點非常適合于本系統(tǒng)經(jīng)常在野外應用的特點,并且隨產(chǎn)品所提供的串行通訊程序也可以很方便的移植到所采用的DSP平臺上,大大簡化了本系統(tǒng)在數(shù)據(jù)存儲方面的程序設計工作。
此測試代碼是基于MSP430F147和西安達泰電子的USB118AD模塊的SPI測試程序。USB118AD實現(xiàn)將單片機得數(shù)據(jù)直接存儲到U盤。
/***************************************************/
/*SPI初始化子程序 */
/***************************************************/
void SpiInit(void)
{
// P3SEL |= SDCLK + SDDI + SDDO; //P3.1--P3.3 for spi option select
P3SEL |= 0X0e; //P3口功能設置(SPI功能選擇)
P3DIR |= BIT0; //設置IO口方向(P3.0 用于SPI片選控制)
P3OUT |= BIT0;
UCB0CTL1 |= UCSWRST; //設置SPI
UCB0CTL0 = 0xA9; //10(clk edge) 1(MSB first) 0(8bit) 1(master) 00(3SPI) 1(sync)
UCB0CTL1 = 0x80; //10(SMCLK)
UCB0BR0 = 0x04; //SPICLK 8M/4=2MHz;
UCB0BR1 = 0x00;
UCB0STAT = 0X00;
UCB0CTL1 &=~ UCSWRST;
}

/*SPI讀數(shù)據(jù)*/
int rd_data(void)
{
int value;
P3OUT &=~ BIT0;
UCB0TXBUF=0xff;
while((UCB0STAT&UCBUSY)==0x01);
value = UCB0RXBUF;
P3OUT |= BIT0;
return value;
}
/*SPI寫數(shù)據(jù)*/
void wr_data(uchar n)
{
P3OUT &=~ BIT0;
UCB0TXBUF=n;
while((UCB0STAT&UCBUSY)==0x01);
P3OUT |= BIT0;
}
/*************************************************************************
* 發(fā)送命令
*功能:向模塊發(fā)送命令
*入口參數(shù):命令數(shù)組
*出口參數(shù):無
**************************************************************************/
void Send_Command(uchar com[64])
{
wr_data(0xaa);
Delay(20); //10uS左右的延時
wr_data(0xbb);
for(int c=0;c<64;c++)
{
wr_data(com[c]);
}
}
/*************************************************************************
* 接收命令
*功能: 從模塊接收應答命令
*入口參數(shù):應答信號
*出口參數(shù):應答正確與否標志
**************************************************************************/
uchar Receive_Command(int rec)
{

do
{
rd[0] = rd_data();
}
while(rd[0]==0xff);
for(int idata=1;idata<64;idata++)
{rd[idata] = rd_data();}

if(rd[0] == rec&& rd[1]==0x01)
return 0;
else
return 1;
}
/*************************************************************************
* 接收數(shù)據(jù)
*功能: 從模塊接收應答數(shù)據(jù)
*入口參數(shù):無
*出口參數(shù):應答數(shù)據(jù)—數(shù)組data[]
**************************************************************************/
void receive_data()
{
int num;
num = rd[4]+(rd[5]<<8);
if(num)
{
int d=0;
for(;num>0;num--)
{
data[d] = rd_data();
d++;
}

}
}
/************************************************************************* *發(fā)送數(shù)據(jù)
*功能: 向模塊發(fā)送數(shù)據(jù)
*入口參數(shù):待寫入數(shù)組app[i]
*出口參數(shù):無
**************************************************************************/

void write_data(int lx,int hx)
{
int tempd;
tempd = hx<<8 +lx ;
for(int i=0;iwr_data(app[i]); //app[i]為待寫入數(shù)組
}
/**************************************************************************
* 發(fā)送檢測設備命令
* 入口參數(shù):無
* 返回值:0-正常,1-無響應, 2-返回數(shù)據(jù)錯誤
***************************************************************************/
uchar USB118R_Detect(void)
{
uchar i,command[64];
command[0] = 0x01;
command[1] = 0x00;
for(i=2;i<64;i++)
{
command[i] = 0x20;
}
Send_Command(command);
return Receive_Command(0x04);
}
/**************************************************************************
* 獲取磁盤空間
***************************************************************************/
uchar USB118R_GetDiskCapacity(void)
{
uchar i,command[64]; /*command數(shù)組用于存儲命令字節(jié)*/

command[0]=0x12; /*命令字節(jié)賦值*/
command[1]=0x00;
for(i=2;i<64;i++)
command[i]=0x20;

Send_Command(command); /*發(fā)送命令 0x12,無數(shù)據(jù)字節(jié)*/
return Receive_Command(0x22); /*接收返回值并校驗是否發(fā)送成功 */
/*校驗碼為0x22,0x01*/

}
/**************************************************************************
* 獲取當前系統(tǒng)的版本號
***************************************************************************/
uchar USB118R_GetVersion(void)
{
uchar i,command[64]; /*command數(shù)組用于存儲命令字節(jié)*/

command[0]=0x30; /*命令字節(jié)賦值*/
command[1]=0x00;
for(i=2;i<64;i++)
command[i]=0x20;

Send_Command(command); /*發(fā)送命令 0x30,無數(shù)據(jù)字節(jié)*/
return Receive_Command(0x40); /*接收返回值并校驗是否發(fā)送成功*/
/* 校驗碼為0x40,0x01*/
}
/**************************************************************************
* 創(chuàng)建文件
* 功能:在U 盤上創(chuàng)建指定文件名的文件
* 入口參數(shù):文件名, 8個字節(jié);擴展名,3個字節(jié)
***************************************************************************/
uchar USB118R_Create(int fi,int fj,int fk)
{
uchar i;
uchar command[64]={0x07,"D","A","T","A","I","E"," "," ","T","X","T"};
/*命令碼為0x07,文件名為DATAIE,擴展名為TXT*/
/*
*
*
* 根據(jù)FAT文件規(guī)范,在此可以添加文件
* 屬性、創(chuàng)建時間等信息。
*
*
*
*/
for(i=12;i<33;i++)command[i]=0x20;
command[33]=0x00; /*命令字節(jié)賦值*/
for(i=34;i<64;i++)command[i]=0x20;

Send_Command(command); /*發(fā)送命令 0x07,無數(shù)據(jù)字節(jié)*/
return Receive_Command(0x0A); /*接收返回值并校驗是否發(fā)送成功 */
/*校驗碼為0x0A,0x01*/
}
/**************************************************************************
* 列舉文件
* 功能:列舉目錄下面的所有文件和文件夾
*lx,hx限制文件數(shù)量,每個文件名32B,修改文件數(shù)量限制時,同時要修改返回信息
*添加接收數(shù)據(jù)函數(shù)即可
***************************************************************************/
uchar USB118R_List(uchar lx,uchar hx) /*lx為USB118R_List命令返回數(shù)據(jù)長度*/
/*低字節(jié);hx為高字節(jié)*/
{
uchar i,command[64]; /*command數(shù)組用于存儲命令字節(jié)*/
command[0]=0x10; /*命令字節(jié)賦值*/
command[1]=0x00;
command[2]=0x20; /*返回數(shù)據(jù)長度低字節(jié)*/
command[3]=0x20; /*返回數(shù)據(jù)長度高字節(jié)*/
for(i=4;i<64;i++)
command[i]=0x20;

Send_Command(command); /*發(fā)送命令 0x10,無數(shù)據(jù)字節(jié)*/
return Receive_Command(0x20);
/*接收返回值及返回數(shù)據(jù)并校驗是否發(fā)送成功 校驗碼為0x20,0x01*/
}

/**************************************************************************
* 讀取文件
* 功能:讀取已經(jīng)打開的文件
* 入口參數(shù):讀取文件長度低字節(jié),讀取文件長度高字節(jié)
***************************************************************************/
uchar USB118R_Read(uchar lx,uchar hx)
{
uchar i,command[64]; /*command數(shù)組用于存儲命令字節(jié)*/
uchar flag;
command[0]=0x08; /*命令字節(jié)*/
command[1]=lx; /*讀取文件長度低字節(jié)*/
command[2]=hx; /*讀取文件長度高字節(jié)*/
for(i=3;i<64;i++)
command[i]=0x20;
Send_Command(command); /*發(fā)送命令 0x08,無數(shù)據(jù)字節(jié)*/
flag = Receive_Command(0x0B);
/*接收返回值及返回數(shù)據(jù)并校驗是否發(fā)送成功 校驗碼為0x0B,0x01*/
receive_data();
return flag;
}
/**************************************************************************
* 打開文件
* 功能: 在U 盤上打開指定文件名的文件
* 入口參數(shù):A~H,文件名;x~z:擴展名
***************************************************************************/
uchar USB118R_Open(int fi,int fj,int fk)
{
uchar command[64]={0x06,"D","A","T","A","I","E"," "," ","T","X","T"};
Send_Command(command); /*發(fā)送命令 0x06,無數(shù)據(jù)字節(jié)*/
return Receive_Command(0x0D);
/*接收返回值并校驗是否發(fā)送成功 校驗碼為0x0D,0x01*/
}
/**************************************************************************
* 刪除文件
* 功能:刪除指定的文件
* 入口參數(shù):A~H,文件名;x~z:擴展名
***************************************************************************/
uchar USB118R_Remove(void)
{
uchar command[64]={0x11,0x00,"D","A","T","A","I","E"," "," ","T","X","T"};
/*命令碼為0x11,文件名為DATAIE,擴展名為TXT*/
Send_Command(command); /*發(fā)送命令 0x11,無數(shù)據(jù)字節(jié)*/
return Receive_Command(0x21);
/*接收返回值并校驗是否發(fā)送成功 校驗碼為0x21,0x01*/
}
/**************************************************************************
* 寫入數(shù)據(jù)
* 功能: 向已經(jīng)打開的文件中寫入數(shù)據(jù)
* 入口參數(shù):數(shù)據(jù)字節(jié)數(shù)
***************************************************************************/
uchar USB118R_Write(int lx,int hx)
{

uchar i,command[64]; /*command數(shù)組用于存儲命令字節(jié)*/

command[0]=0x09; /*命令字節(jié)賦值*/
command[1]=0x00;
command[2]=lx; /*寫入數(shù)據(jù)長度低字節(jié)*/
command[3]=hx; /*寫入數(shù)據(jù)長度高字節(jié)*/
for(i=4;i<64;i++)
command[i]=0x20;
Send_Command(command); /*發(fā)送命令 0x09,有數(shù)據(jù)字節(jié)*/
write_data(lx,hx);
return Receive_Command(0x0C);
/*接收返回值并校驗是否發(fā)送成功 校驗碼為0x0C,0x01*/
}
/**************************************************************************
* 設置指針
* 功能: 將文件指針移動到指定位置
* 入口參數(shù):指針位置
***************************************************************************/
uchar USB118R_SetFilePointer(uchar para_1,uchar para_2,uchar para_3,uchar para_4)
{ /*參數(shù)para_1,para_2,para_3,para_4用來設置指針位置。低字節(jié)在前*/
uchar i,command[64]; /*command數(shù)組用于存儲命令字節(jié)*/
command[0]=0x15; /*命令字節(jié)賦值*/
command[1]=0x00;
command[2]=para_1; /*設置指針位置*/
command[3]=para_2;
command[4]=para_3;
command[5]=para_4;
for(i=6;i<64;i++) /*命令字節(jié)賦值*/
command[i]=0x20;
Send_Command(command); /*發(fā)送命令 0x15,無數(shù)據(jù)字節(jié)*/
return Receive_Command(0x25);
/*接收返回值并校驗是否發(fā)送成功 校驗碼為0x25,0x01*/
}

主函數(shù)根據(jù)需要,調(diào)用各個子函數(shù)。

(轉載)

標簽:數(shù)據(jù)采集 我要反饋 
2024世界人工智能大會專題
即刻點擊并下載ABB資料,好禮贏不停~
優(yōu)傲機器人下載中心
西克
2024全景工博會
專題報道