產品發表 包羅萬象 模型拍賣 綜合討論 直昇機 飛機 同協會 回首頁

 找回密碼
 申請
樓主: kris000

來幫 PowerLab8 加一些東西

[複製鏈接]
 樓主| 發表於 2011年8月10日 08:58 PM | 顯示全部樓層
原帖由 水云天 於 2011-8-10 19:55 發表
kris老兄可否把pl8的串口通信协议告诉大家呢,我们也可以试着用其他单片机实现对pl8的操控,因为逆向工程我们搞不定的


公開可以,但你們要幫忙找出幾個我不確定的數值,例如在512個char中找出內阻值來.
還有Set Presets的格式(這個我還沒時間去研究),如果有人要參與,我檢現成.
回復 按讚

使用道具 舉報

發表於 2011年8月10日 11:07 PM | 顯示全部樓層
原帖由 kris000 於 2011年8月10日 08:58 PM 發表


公開可以,但你們要幫忙找出幾個我不確定的數值,例如在512個char中找出內阻值來.
還有Set Presets的格式(這個我還沒時間去研究),如果有人要參與,我檢現成. ...

感觉好难
回復 按讚

使用道具 舉報

 樓主| 發表於 2011年8月11日 02:09 AM | 顯示全部樓層
PL8的通訊是我見過少數難搞的,採雙工通訊,就算沒有要求資料,也會不停的收到資料流,要跟PL8對話時機掌握很重要.
使用現成庫函數的人必須改寫底層代碼,否則無法使用.
最困難的是接收到的資料並不是我們要的值,而是ADC量測到的刻度,要自己量化才是最令人困擾.


如果底下能做到,即可接收到資料.第一步若成功再說,如果不成功,後面更難~寫出來也沒意義.
1.單片機的串口分別接到PL8的紅線(RD),及黑線(TX),白色為共點.不可直接進I/O口,要透過串口芯片來通訊.
2.通訊速率:19200BPS,8,N,1
3.MCU的串口要使用非同步方式,步驟如下:

void WaitForSend(void)//等待通訊時機
{
u16 len;
while(1)
  {
   len=USART_RX_Length;//收到的封包長度
   MySleep(30);//等待30微秒
   if(len==USART_RX_Length && len==0){USART_RX_Length=0;break;}//如果找到空檔則OK,否則繼續等.
  }
}

u8 GetPL8Data(void)
{
u8 t;
u8 pGetData[4]={0x52,0x61,0x6d,0x00};//要求PL8送出狀態封包
u16 raw;
float f;

//等待通訊時機
WaitForSend();
//送出請求
for(t=0;t<=3;t++)
  {
   USART1->DR=pGetData[t];
   while((USART1->SR&0X40)==0);
  }
//接收資料
for(t=0;t<=9;t++)
  {
   MySleep(20);
   if(USART_RX_Length>=150)break;
  }
if(USART_RX_Length<150){USART_RX_Length=0;return 0;}
  
//輸入電壓
PL8_IV=(USART_RX_BUF[28]*256+USART_RX_BUF[29])*0.0114676;
//輸入電流
raw=USART_RX_BUF[84]*256+USART_RX_BUF[85];
if(USART_RX_BUF[84]&128)PL8_IA=-(((raw^0xFFFF)+1)/150.0); else PL8_IA=(raw/150.0);
if(PL8_IA<0)PL8_IA*=-1;//取絕對值
//輸入功率
PL8_IW=PL8_IV*PL8_IA;
//輸出電壓
PL8_OV=(USART_RX_BUF[36]*256+USART_RX_BUF[37])*0.0114676;
//輸出電流
raw=USART_RX_BUF[46]*256+USART_RX_BUF[47];
if(USART_RX_BUF[46]&128)PL8_OA=-(((raw^0xFFFF)+1)/600.0); else PL8_OA=(raw/600.0);
if(PL8_OA<0)PL8_OA*=-1;//取絕對值
//輸出功率
PL8_OW=PL8_OV*PL8_OA;
//進度
PL8_PS=(USART_RX_BUF[42]*256+USART_RX_BUF[43])/10;
//時間
PL8_SEC=USART_RX_BUF[32]*256+USART_RX_BUF[33];
//充電容量
PL8_CAP_C=(USART_RX_BUF[38]*16777216+USART_RX_BUF[39]*65536+USART_RX_BUF[40]*256+USART_RX_BUF[41])/2160.0;
//放電容量
PL8_CAP_D=(USART_RX_BUF[88]*16777216+USART_RX_BUF[89]*65536+USART_RX_BUF[90]*256+USART_RX_BUF[91])/2160.0;
//8個CELL電壓及平衡ByPass
for(t=0;t<=7;t++)
  {
   PL8_CELL[t]=(USART_RX_BUF[6+(t*2)]*256+USART_RX_BUF[7+(t*2)])*0.0000781;
   if(PL8_CELL[t]>0.0)
    {
     PL8_BYPASS[t]=USART_RX_BUF[128+t]*3.0;
    }else PL8_BYPASS[t]=0;
  }
//狀態(閒置=0,準備=1,充電中=2,放電中=3,顯示=4,充電完成=5,放電完成=6)
PL8_ST=USART_RX_BUF[137];
}




以上是確定沒問題的值,內阻值我只知道:
byte[72,73]是量測到的參考電流
byte[118,119]是校正調整值
byte[56,57]...連續的8組,是量測到的每個CELL刻度.
但一時之間我還無法理解之間的關係.



程序中的數字怎麼來的?
例如電壓計算中的0.0114676,那是知道PL8的ADC是12Bits,而12Bits刻度為0~4095,也知道傳感器規格.
所以46.96/4095=0.0114676
這要非常了解硬體線路才有辦法理解,所以用就好,別問怎麼來的...
回復 按讚

使用道具 舉報

發表於 2011年8月12日 10:30 AM | 顯示全部樓層
kris000设备完成了,这两天就发给你。
IMG_0001.jpg
IMG_0007.jpg
回復 按讚

使用道具 舉報

發表於 2011年8月12日 12:46 PM | 顯示全部樓層
真漂亮耶。
回復 按讚

使用道具 舉報

發表於 2011年8月12日 08:45 PM | 顯示全部樓層
kris000大...我看你可以設計一顆12~16S~120A以上的電變來玩看看..相信你的能力.可以做出比美K牌性能的東西...12~16S..相信是下一個電變的趨勢...
回復 按讚

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 申請

本版積分規則

世界各國訪RCTW統計

手機版|台灣遙控模型-RCTW

GMT+8, 2024年12月15日 06:37 AM

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回復 返回頂部 返回列表