版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 程序流程圖</b></p><p> 功能描述:AD數(shù)據(jù)采集,AD采集20組數(shù)據(jù),每組數(shù)據(jù)50個采樣值,然后將采樣值經過</p><p> 計算平均值并轉換為十進制數(shù)據(jù)后發(fā)送到CAN,在PC機上用CANTools軟件調試</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ā)送郵箱標識符高低字節(jié) */</p><p> charCAN_RX_Adress_H,CAN_RX_Adre
4、ss_L;/* CAN 接收郵箱標識符高低字節(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采集負輸出電流</p><p> #define CHANNEL0 0X01//選擇模擬通道0采集負輸出電壓</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;//存放負輸出電壓采樣值,供CAN上傳數(shù)據(jù)</p><p> uint RESIN=0X0000;//存放負輸出電流正電壓采樣值,供CAN上傳數(shù)據(jù)</p><p> uchar WAIT_FLAG
8、; //等待中斷標志位</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:關總中斷 */ </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初始化子程序,采用標準標識符,正常工作模式</p><p> *************************************************************** */</p><p> voidinitcan()</p><p><b> {&
13、lt;/b></p><p> // 設置發(fā)送郵箱0標識符 :10011001010=0x04CA </p><p> CAN_TX_Adress_L=0x55; //CAN低地址標識符</p><p> CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;</p><p> CAN_TX_A
14、dress_H=0x99; //CAN高地址標識符,應與發(fā)送方標識符相同</p><p> // 設置接收郵箱0標識符 :00110011111=0x019F </p><p> CAN_RX_Adress_H=0x33; //CAN高地址標識符</p><p> CAN_RX_Adress_L=0xe0; //C
15、AN低地址標識符,應與發(fā)送方標識符相同</p><p> CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;</p><p> // ************設置對CAN進行配置*************** </p><p> TRISB=TRISB & 0XFB; // 設置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> // ***********波特率設置 ************************** </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,設置Phase_Seg2(bit2-0)=3TQ </p><p> // 標稱位時間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)=(1+1+3+3)TQ=8TQ, </p><p> //位率=1/(8*0.5us)=250Kbps</p><p> // ******設置發(fā)送郵箱0
20、和初始發(fā)送的數(shù)據(jù)***** </p><p> TXB0SIDL=CAN_TX_Adress_L&0xe0; //bit3=0標準標識符,bit7-5:標準標識符2-0位</p><p> TXB0SIDH=CAN_TX_Adress_H;// 標準標識符的10-3位</p><p> TXB0CON=0X03;// bit1-0:發(fā)送
21、優(yōu)先級,設置TXB0為最高優(yōu)先級3</p><p> TXB0DLC=0X08;// 設置數(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ù)長度寫無效,故不需設置*/</p><p> RXB0CON=0X20;// bit6-5=01只接收有效的標準標識符信息 </p><p> // *******初始化接收濾波器0和接收屏蔽**************** </p><p> RXF0SIDH=CAN_RX_Adress_H;</p><p>
24、 RXF0SIDL=CAN_RX_Adress_L&0xe0; //高3位為標識符低3位,低5位是配置 </p><p> RXM0SIDH=0XFF;</p><p> RXM0SIDL=0XE0;// 11個1表示接收11位標識符進行濾波,標識符不同不接收;若全為0,若正確信息,全部接收</p><p> // *******設置C
25、AN工作模式**************************** </p><p> CANCON=0X00;//=0X40,進入自測試模式;=0x00,正常操作模式</p><p> while((CANSTAT&0XE0)!=0); // 檢測CAN配置完成 </p><p> /* 初始化CAN的中斷,PIR3
26、為CAN的外圍中斷標志寄存器 */</p><p> PIR3=0X00; // 清所有CAN中斷標志 </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; /* 關發(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;// 清接收中斷標志 </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轉換,轉換完成后GODONE清零</p><p> while(GODONE); //等待轉換完成</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設置初始化 </p><p> I
39、PEN=1;// 使能中斷高低優(yōu)先級 </p><p> INTCON=INTCON|0xC0;// 開總中斷、開外圍接口中斷 </p><p> TXB0REQ=0;/* 關發(fā)送,TXB0REQ=0;緩沖區(qū)沒有要發(fā)送的數(shù)據(jù) */</p><p> RXB0FUL=0; /*清零RXB0FUL,表示緩沖區(qū)未接
40、收到數(shù)據(jù)*/</p><p> WAIT_FLAG=0X01;// 關發(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; //保存平均的結果</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; //保存平均的結果</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、負電壓********************</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; //保存平均的結果</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、測負電源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ù)后關閉發(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- pic單片機
- pic單片機自學手記之串口通信
- pic單片機原理及應用
- pic18系列單片機指令中文講解
- picc環(huán)境寫pic單片機程序的探討
- 超聲波PIC單片機C程序.rar
- 超聲波PIC單片機C程序.rar
- 基于pic18f4580單片機實現(xiàn)瞬態(tài)轉速測量的設計與應用
- pic單片機原理及應用(原稿)
- pic單片機原理及應用考卷
- pic單片機課程設計
- 單片機課程設計--基于pic16f877單片機與ds18b20的溫度采集與顯示
- 小型pic單片機與pc機模擬串行通信【外文翻譯】
- 單片機學習之pic單片機c語言編程教程
- 基于pic16f877a單片機的溫度,時間顯示
- 達內學費--pic單片機中斷程序設計技巧
- pic單片機c語言編程教程
- 開題報告--pic單片機的研究
- 單片機程序
- 關于pic16f616單片機的一些經驗
評論
0/150
提交評論