版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 程序流程圖</b></p><p> 功能描述:AD數(shù)據(jù)采集,AD采集20組數(shù)據(jù),每組數(shù)據(jù)50個采樣值,然后將采樣值經(jīng)過</p><p> 計算平均值并轉(zhuǎn)換為十進制數(shù)據(jù)后發(fā)送到CAN,在PC機上用CANTools軟件調(diào)試</p><p> 主函數(shù)流程圖 中斷函數(shù)流
2、程圖</p><p><b> 程序源碼</b></p><p> /* ****************************************************************</p><p> ***********************************************************
3、**** */</p><p> #include"pic18f4680.h"/* PIC18系列的頭文件 */</p><p> charCAN_TX_Adress_H,CAN_TX_Adress_L;/* CAN 發(fā)送郵箱標(biāo)識符高低字節(jié) */</p><p> charCAN_RX_Adress_H,CAN_RX_Adre
4、ss_L;/* CAN 接收郵箱標(biāo)識符高低字節(jié) */</p><p> #define CHANNEL7 0X1D //選擇模擬通道7采集正輸出電壓</p><p> #define CHANNEL6 0X19//選擇模擬通道6采集正輸出電流</p><p> #define CHANNEL3 0X0D//選擇模擬通道3采集正輸出電壓</p>
5、<p> #define CHANNEL2 0X09//選擇模擬通道2采集正輸出電流</p><p> #define CHANNEL1 0X05//選擇模擬通道1采集負(fù)輸出電流</p><p> #define CHANNEL0 0X01//選擇模擬通道0采集負(fù)輸出電壓</p><p> #define LN 50 //采集50次進行平均<
6、;/p><p> #define LAN 20 //采集20個平均值</p><p> bank2 uint AD[LN];//存放50次采樣值 </p><p> uint RES[LAN]; //存放20個平均值</p><p> uint RESVP=0x0000; //存放正輸出電壓采樣值,供CAN上傳數(shù)據(jù)</p>
7、;<p> uint RESIP=0X0000;//存放正輸出電流電壓采樣值,供CAN上傳數(shù)據(jù)</p><p> uint RESVN=0X0000;//存放負(fù)輸出電壓采樣值,供CAN上傳數(shù)據(jù)</p><p> uint RESIN=0X0000;//存放負(fù)輸出電流正電壓采樣值,供CAN上傳數(shù)據(jù)</p><p> uchar WAIT_FLAG
8、; //等待中斷標(biāo)志位</p><p> uint count; //100次計數(shù)</p><p> /* ****************************************************************</p><p> ** 函 數(shù) 名: initial()&
9、lt;/p><p> ** 功能描述: 系統(tǒng)初始化子程序,放在程序首部</p><p> *************************************************************** */</p><p> voidinitial()</p><p><b> {</b></
10、p><p><b> count=0;</b></p><p> INTCON=0x00;/* bit7-bit0:關(guān)總中斷 */ </p><p> PIE1=0;/* PIE1 的中斷不使能 */</p><p> PIE2=0;/* PIE2 的中斷不使能 */</
11、p><p> PIE3=0;/* PIE3 的中斷不使能 */</p><p><b> }</b></p><p> /* ****************************************************************</p><p> ** 函 數(shù) 名: initc
12、an()</p><p> ** 功能描述: CAN初始化子程序,采用標(biāo)準(zhǔn)標(biāo)識符,正常工作模式</p><p> *************************************************************** */</p><p> voidinitcan()</p><p><b> {&
13、lt;/b></p><p> // 設(shè)置發(fā)送郵箱0標(biāo)識符 :10011001010=0x04CA </p><p> CAN_TX_Adress_L=0x55; //CAN低地址標(biāo)識符</p><p> CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;</p><p> CAN_TX_A
14、dress_H=0x99; //CAN高地址標(biāo)識符,應(yīng)與發(fā)送方標(biāo)識符相同</p><p> // 設(shè)置接收郵箱0標(biāo)識符 :00110011111=0x019F </p><p> CAN_RX_Adress_H=0x33; //CAN高地址標(biāo)識符</p><p> CAN_RX_Adress_L=0xe0; //C
15、AN低地址標(biāo)識符,應(yīng)與發(fā)送方標(biāo)識符相同</p><p> CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;</p><p> // ************設(shè)置對CAN進行配置*************** </p><p> TRISB=TRISB & 0XFB; // 設(shè)置CANRX/RB
16、3輸入,CANTX/RB2輸出 </p><p> CANCON=0X80; //CANCON,bit7-5:1XX請求配置 </p><p> while((CANSTAT & 0X80)==0) // CAN狀態(tài)寄存器。bit7-5:100配置方式</p><p><b> {</b></p&g
17、t;<p> ; // 等待進入CAN配置模式OPMODE=100</p><p><b> } </b></p><p> // ***********波特率設(shè)置 ************************** </p><p> BRGCON1=0X07;
18、// Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,則TQ=((2*(BRP+1))/Fosc=16/32M=0.5us </p><p> BRGCON2=0X90;//bit7=1自由編程,bit6=0總線在采樣點采樣1次;phase_Seg1(bit5-3)=3TQ;</p><p> BRGCON3=0X42;// Prog_Seg(b
19、it2-0)=1TQ,設(shè)置Phase_Seg2(bit2-0)=3TQ </p><p> // 標(biāo)稱位時間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)=(1+1+3+3)TQ=8TQ, </p><p> //位率=1/(8*0.5us)=250Kbps</p><p> // ******設(shè)置發(fā)送郵箱0
20、和初始發(fā)送的數(shù)據(jù)***** </p><p> TXB0SIDL=CAN_TX_Adress_L&0xe0; //bit3=0標(biāo)準(zhǔn)標(biāo)識符,bit7-5:標(biāo)準(zhǔn)標(biāo)識符2-0位</p><p> TXB0SIDH=CAN_TX_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識符的10-3位</p><p> TXB0CON=0X03;// bit1-0:發(fā)送
21、優(yōu)先級,設(shè)置TXB0為最高優(yōu)先級3</p><p> TXB0DLC=0X08;// 設(shè)置數(shù)據(jù)長度為8個字節(jié) </p><p> TXB0D0=0X00; /* 寫發(fā)送緩沖器數(shù)據(jù)區(qū)數(shù)據(jù)初值 */</p><p> TXB0D1=0X00;</p><p> TXB0D2=0X00;
22、 </p><p> TXB0D3=0X00;</p><p> TXB0D4=0X00;</p><p> TXB0D5=0X00;</p><p> TXB0D6=0X00;</p><p> TXB0D7=0X00;</p><p> /*接收緩沖區(qū)0的
23、ID、數(shù)據(jù)長度寫無效,故不需設(shè)置*/</p><p> RXB0CON=0X20;// bit6-5=01只接收有效的標(biāo)準(zhǔn)標(biāo)識符信息 </p><p> // *******初始化接收濾波器0和接收屏蔽**************** </p><p> RXF0SIDH=CAN_RX_Adress_H;</p><p>
24、 RXF0SIDL=CAN_RX_Adress_L&0xe0; //高3位為標(biāo)識符低3位,低5位是配置 </p><p> RXM0SIDH=0XFF;</p><p> RXM0SIDL=0XE0;// 11個1表示接收11位標(biāo)識符進行濾波,標(biāo)識符不同不接收;若全為0,若正確信息,全部接收</p><p> // *******設(shè)置C
25、AN工作模式**************************** </p><p> CANCON=0X00;//=0X40,進入自測試模式;=0x00,正常操作模式</p><p> while((CANSTAT&0XE0)!=0); // 檢測CAN配置完成 </p><p> /* 初始化CAN的中斷,PIR3
26、為CAN的外圍中斷標(biāo)志寄存器 */</p><p> PIR3=0X00; // 清所有CAN中斷標(biāo)志 </p><p> PIE3=PIE3|0X01; //使能接收緩沖器0的接收中斷 </p><p> IPR3=IPR3|0X01; // 接收緩沖器0的接收中斷為最高優(yōu)先級
27、</p><p><b> }</b></p><p> void CAN_SEND()</p><p><b> {</b></p><p> TXB0REQ=0; /* 關(guān)發(fā)送 ,該位發(fā)送成功則自動清零*/ </p><p> TX
28、B0D0=RESVP/100;</p><p> TXB0D1=(RESVP%100)/10;</p><p> TXB0D1=(TXB0D1<<4)|((RESVP%100)%10);</p><p> TXB0D2=RESIP/100;</p><p> TXB0D3=(RESIP%100)/10;
29、 </p><p> TXB0D3=(TXB0D3<<4)|((RESIP%100)%10);</p><p> TXB0D4=RESVN/100;</p><p> TXB0D5=(RESVN%100)/10;</p><p> TXB0D5=(TXB0D5<<4)|((RESVN%100)%
30、10);</p><p> TXB0D6=RESIN/100;</p><p> TXB0D7=(RESIN%100)/10;</p><p> TXB0D7=(TXB0D7<<4)|((RESIN%100)%10); </p><p> TXB0REQ=1; /* bit3(TXR
31、EQ)=1請求發(fā)送 ,開始發(fā)送數(shù)據(jù)*/</p><p> while(TXB0REQ==1); //等待發(fā)送 完成 </p><p><b> }</b></p><p> /* ******************************************************
32、**********</p><p> ** 函 數(shù) 名: interruptHI_ISR()</p><p> ** 功能描述: 高優(yōu)先級中斷子程序:RXB0接收郵箱0接收中斷子程序</p><p> *************************************************************** */</p>
33、<p> void interruptHI_ISR()</p><p><b> {</b></p><p> if(RXB0IF==1)</p><p><b> { </b></p><p> if(RXB0D0==0xF0) //判斷命令,是否要上傳數(shù)據(jù)&l
34、t;/p><p><b> {</b></p><p> WAIT_FLAG=0x00;// 置接收到 CAN 數(shù)據(jù) </p><p><b> } </b></p><p> RXB0FUL=0;// bit7=0打開接收緩沖器接收新信息 </p><
35、p> RXB0IF=0;// 清接收中斷標(biāo)志 </p><p><b> }</b></p><p><b> }</b></p><p> void get_ad(uint *x)</p><p><b> {</b></p><p
36、> GODONE=1; //開始AD轉(zhuǎn)換,轉(zhuǎn)換完成后GODONE清零</p><p> while(GODONE); //等待轉(zhuǎn)換完成</p><p> *x=(ADRESH<<8)+ADRESL;</p><p><b> }</b></p>&l
37、t;p> //************************主程序****************************</p><p> void main()</p><p><b> {</b></p><p> uchar ia,ib;</p><p> osc_config(0x70,0x
38、40); //8MHz,四倍頻Fosc=8MHz*4</p><p> initial(); // 系統(tǒng)初始化子程序 </p><p> io_init();</p><p> adc_init();</p><p> initcan();// CAN設(shè)置初始化 </p><p> I
39、PEN=1;// 使能中斷高低優(yōu)先級 </p><p> INTCON=INTCON|0xC0;// 開總中斷、開外圍接口中斷 </p><p> TXB0REQ=0;/* 關(guān)發(fā)送,TXB0REQ=0;緩沖區(qū)沒有要發(fā)送的數(shù)據(jù) */</p><p> RXB0FUL=0; /*清零RXB0FUL,表示緩沖區(qū)未接
40、收到數(shù)據(jù)*/</p><p> WAIT_FLAG=0X01;// 關(guān)發(fā)送,TXB0REQ=0; </p><p><b> while(1)</b></p><p><b> {</b></p><p> while (WAIT_FLAG==0X01); //等待中斷</
41、p><p> //* ***************測正電壓**************</p><p> for (ib=0;ib<LAN;ib++) //LAN==16(20)</p><p><b> {</b></p><p> for (ia=0;ia<LN;ia++)
42、//LN==64(50)</p><p><b> {</b></p><p> ADCON0=CHANNEL3;</p><p> get_ad(&AD[ia]); </p><p><b> }</b></p><p> RES[i
43、b]=0x0000;</p><p> for (ia=0;ia<LN;ia++)</p><p><b> {</b></p><p> RES[ib]+=AD[ia];</p><p><b> }</b></p><p> RES[ib]=RES[ib]
44、/50;</p><p><b> }</b></p><p> RESVP=0X0000; //保存平均的結(jié)果</p><p> for (ib=0;ib<LAN;ib++)</p><p><b> {</b></p><p>
45、; RESVP=RESVP+RES[ib];</p><p><b> }</b></p><p> RESVP=RESVP/20; </p><p> //*****************測正壓ACS輸出******************</p><p> for (ib=0;ib<LAN;ib+
46、+)</p><p><b> {</b></p><p> for (ia=0;ia<LN;ia++)</p><p><b> {</b></p><p> ADCON0=CHANNEL2;</p><p> get_ad(&AD[ia]);<
47、;/p><p><b> }</b></p><p> RES[ib]=0x0000;</p><p> for (ia=0;ia<LN;ia++)</p><p><b> {</b></p><p> RES[ib]+=AD[ia];</p>&
48、lt;p><b> }</b></p><p> RES[ib]=RES[ib]/50;</p><p><b> }</b></p><p> RESIP=0X0000; //保存平均的結(jié)果</p><p> for (ib=0;ib<L
49、AN;ib++)</p><p><b> {</b></p><p> RESIP+=RES[ib];</p><p><b> }</b></p><p> RESIP=RESIP/20; </p><p> //**********************測
50、負(fù)電壓********************</p><p> for (ib=0;ib<LAN;ib++)</p><p><b> {</b></p><p> for (ia=0;ia<LN;ia++)</p><p><b> {</b></p><
51、p> ADCON0=CHANNEL0;</p><p> get_ad(&AD[ia]); </p><p><b> }</b></p><p> RES[ib]=0x0000;</p><p> for (ia=0;ia<LN;ia++)</p>&l
52、t;p><b> {</b></p><p> RES[ib]+=AD[ia];</p><p><b> }</b></p><p> RES[ib]=RES[ib]/50; //保存平均的結(jié)果</p><p><b> }</b></p>&l
53、t;p> RESVN=0X0000; </p><p> for (ib=0;ib<LAN;ib++)</p><p> RESVN+=RES[ib];</p><p> RESVN=RESVN/20; </p><p> //*******************
54、測負(fù)電源ACS輸出*******************</p><p> for (ib=0;ib<LAN;ib++)</p><p><b> {</b></p><p> for (ia=0;ia<LN;ia++)</p><p><b> {</b></p>
55、<p> ADCON0=CHANNEL1;</p><p> get_ad(&AD[ia]); </p><p><b> }</b></p><p> RES[ib]=0x0000;</p><p> for (ia=0;ia<LN;ia++)</p>
56、;<p><b> {</b></p><p> RES[ib]+=AD[ia];</p><p><b> }</b></p><p> RES[ib]=RES[ib]/50;</p><p><b> }</b></p><p&g
57、t; RESIN=0X0000;</p><p> for (ib=0;ib<LAN;ib++)</p><p><b> {</b></p><p> RESIN+=RES[ib];</p><p><b> }</b></p><p> RESIN=RE
58、SIN/20; </p><p> CAN_SEND(); </p><p> if(count>=99)</p><p><b> {</b></p><p> WAIT_FLAG=0X01; //發(fā)送完一百個數(shù)據(jù)后關(guān)閉發(fā)送</p><p> count=0;
59、 //等待下一次接收CAN的命令</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> count++;</b></p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- pic單片機
- pic單片機自學(xué)手記之串口通信
- pic單片機原理及應(yīng)用
- pic18系列單片機指令中文講解
- picc環(huán)境寫pic單片機程序的探討
- 超聲波PIC單片機C程序.rar
- 超聲波PIC單片機C程序.rar
- 基于pic18f4580單片機實現(xiàn)瞬態(tài)轉(zhuǎn)速測量的設(shè)計與應(yīng)用
- pic單片機原理及應(yīng)用(原稿)
- pic單片機原理及應(yīng)用考卷
- pic單片機課程設(shè)計
- 單片機課程設(shè)計--基于pic16f877單片機與ds18b20的溫度采集與顯示
- 小型pic單片機與pc機模擬串行通信【外文翻譯】
- 單片機學(xué)習(xí)之pic單片機c語言編程教程
- 基于pic16f877a單片機的溫度,時間顯示
- 達(dá)內(nèi)學(xué)費--pic單片機中斷程序設(shè)計技巧
- pic單片機c語言編程教程
- 開題報告--pic單片機的研究
- 單片機程序
- 關(guān)于pic16f616單片機的一些經(jīng)驗
評論
0/150
提交評論