上位機-串列埠通訊波形顯示資料
最近一直忙於無刷電機底層驅動設計和研發,在除錯電機過程中,發現缺少一種用於顯示轉速的上位機介面。於是在原有上位機的基礎上,簡單做了一款顯示轉速波形和電壓 電流的上位機。當然了其中還存在一些問題,不過用於顯示和除錯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 { }
}
資料能夠正常接收和顯示,但這只是基礎版本的,還有很多細節沒有處理,後面會不管完善!以下是我電機轉速調節轉速曲線圖:
上一篇:咖啡豆的研磨知多少
下一篇:家養不易掉毛的小型犬