|  | 
 
 樓主|
發表於 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
 這要非常了解硬體線路才有辦法理解,所以用就好,別問怎麼來的...
 | 
 |