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