您當前的位置:首頁 > 體育

上位機-串列埠通訊波形顯示資料

作者:由 番茄炒雞蛋 發表于 體育時間:2022-03-11

最近一直忙於無刷電機底層驅動設計和研發,在除錯電機過程中,發現缺少一種用於顯示轉速的上位機介面。於是在原有上位機的基礎上,簡單做了一款顯示轉速波形和電壓 電流的上位機。當然了其中還存在一些問題,不過用於顯示和除錯PID問題不大。

1。整體介面如下

分為串列埠選擇和設定區,資料顯示區,監控資訊區,資料快取以及曲線顯示。

上位機-串列埠通訊波形顯示資料

2。上位機在獲取多個數據時候,串列埠如何識別哪個是電流電壓和轉速呢?

由於串列埠一次傳送一個位元組。對於超過255的資料 只能分開發。一次性發很多資料,上位機也不能把一組資料提取出來進行整合顯示對應的物理量。基於以上問題,我就採用了以下的方法。

單片機發送資料以一個包進行傳送,包的開始以0xFF開始,結束以0x55結束(當然了也有侷限性),程式如下:

if(Transmit_Time>=800) //5ms

{

Transmit_Time=0;

Main_Num++;

if( Main_Num==1)

{

USART_SendData(USART1,0xFF); //位元組0

}

if( Main_Num==2) //實時性高的傳送優先順序高——轉速 顯示曲線

{

USART_SendData(USART1,Motor。ActualSpeed/255); //位元組1

USART_SendData(USART1,Motor。ActualSpeed%255); //位元組2

}

if( Main_Num==3) //優先順序次之——-電流

{

USART_SendData(USART1,((uint16_t)(Motor。Current))/255);//位元組3

USART_SendData(USART1,((uint16_t)(Motor。Current))%255);//位元組4

}

if(Main_Num==4) //電壓

{

USART_SendData(USART1,ADCSampPare。BUS_Voltage); //位元組5

}

if(Main_Num==5) //PCB溫度

{

USART_SendData(USART1,ADCSampPare。PCB_Temp);//位元組 6

}

if( Main_Num==3)

{

Main_Num=0;

USART_SendData(USART1,0xFF); //位元組7

}

}

上位機接受資料程式:

private void serialPort1_DataReceived(object sender, System。IO。Ports。SerialDataReceivedEventArgs e)

{

try

{

int n = serialPort1。BytesToRead;

byte[] Receive = new byte[n];

serialPort1。Read(Receive, 0, Receive。Length);

bool DataCatched = false;//資料可以分析的標誌

//快取資料

ReceBuffer。AddRange(Receive);

//完整性判斷

while (ReceBuffer。Count >= 8)

{

//這裡可以寫成對資料的校驗如CRC

if (ReceBuffer[0] == 0xff && ReceBuffer[7] == 0xff)

{

ReceBuffer。CopyTo(0, DataTemp, 0, 8);

DataBuf。AddRange(DataTemp);

DataCatched = true;

ReceBuffer。RemoveRange(0, 8);//獲得一條正確的資料,刪除快取

}

else

{

ReceBuffer。RemoveAt(0);//不是資料頭,刪除資料

}

}

//分析資料

if (DataCatched == true)

{

while (DataBuf。Count > 0)

{

DataBuf。CopyTo(0, DataTemp2, 0, 8);

//資料分析

Test。Speed_Buffer[0] = DataTemp2[1] * 255 + DataTemp2[2];//轉速

Test。Speed_Buffer[2] = DataTemp2[3] * 255 + DataTemp2[4];//電流

if (Test。Speed_Buffer[0] > 0)

{

Flag_Data_Save = true;

}

string str = Convert。ToString((DataTemp2[1] * 255 + DataTemp2[2]), 10)。ToUpper(); //轉速

string str1 = Convert。ToString(DataTemp2[3] * 255 + DataTemp2[4], 10)。ToUpper(); //電流

string str2 = Convert。ToString(DataTemp2[5], 10)。ToUpper(); //電壓

string str3 = Convert。ToString(DataTemp2[6], 10)。ToUpper(); //溫度

if ((Test。Speed_Buffer[0] - Test。Speed_Buffer[1]) > 50 || ((Test。Speed_Buffer[1] - Test。Speed_Buffer[0]) > 50))

{

textBox3。Text = str + “r/min”;

}

if ((Test。Speed_Buffer[2] - Test。Speed_Buffer[3]) > 50 || ((Test。Speed_Buffer[3] - Test。Speed_Buffer[2]) > 50))

{

textBox2。Text = str1 + “mA”;

}

textBox1。Text = str2 + “V”;

textBox4。Text = str3 + “℃”;

Speed_Temp = str;

if ((Test。Speed_Buffer[1] - Test。Speed_Buffer[0]>200)&&(Test。Speed_Buffer[0]>1000) ) //當前轉速低於上一個太多

{

textBox5。AppendText(“轉速異常\r\n”);

}

Test。Speed_Buffer[1] = Test。Speed_Buffer[0];

Test。Speed_Buffer[3] = Test。Speed_Buffer[2];

textBox1。AppendText((str。Length == 1 ? “0” + str : str) + “ ”);//速度

progressBar1。Value = DataTemp2[5]; //電壓

progressBar2。Value = DataTemp2[3] * 255 + DataTemp2[4]; //電流

progressBar3。Value = DataTemp2[6]; //PCB溫度

progressBar4。Value = DataTemp2[1] * 255 + DataTemp2[2];//轉速

if(progressBar2。Value>=19000)

{

textBox5。AppendText(“電流過大\r\n”);

}

Delay(1000);//不延時的話不顯示

Thread。Sleep(10);

DataBuf。RemoveRange(0, 4);

}

}

}

catch { }

}

資料能夠正常接收和顯示,但這只是基礎版本的,還有很多細節沒有處理,後面會不管完善!以下是我電機轉速調節轉速曲線圖:

上位機-串列埠通訊波形顯示資料

標簽: speed  test  buffer  DataTemp2  255