您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > PIC18F单片机CAN通信程序及AD采样
一、程序流程图二、功能描述:AD数据采集,AD采集20组数据,每组数据50个采样值,然后将采样值经过计算平均值并转换为十进制数据后发送到CAN,在PC机上用CANTools软件调试主函数流程图中断函数流程图三、程序源码/*********************************************************************************************************************************/#includepic18f4680.h/*PIC18系列的头文件*/charCAN_TX_Adress_H,CAN_TX_Adress_L;/*CAN发送邮箱标识符高低字节*/charCAN_RX_Adress_H,CAN_RX_Adress_L;/*CAN接收邮箱标识符高低字节*/#defineCHANNEL70X1D//选择模拟通道7采集正输出电压#defineCHANNEL60X19//选择模拟通道6采集正输出电流#defineCHANNEL30X0D//选择模拟通道3采集正输出电压#defineCHANNEL20X09//选择模拟通道2采集正输出电流#defineCHANNEL10X05//选择模拟通道1采集负输出电流启动程序系统初始化开始采样命令为真?否1000次采样完毕?计算均值选择通道CAN发送数据采样命令清零所有通道采样完毕?AD采样是否等待CAN接收中断是否发送成功?是是否中断入口CAN接收中断产生?接收是否匹配?是中断返回否否修改采样命令是#defineCHANNEL00X01//选择模拟通道0采集负输出电压#defineLN50//采集50次进行平均#defineLAN20//采集20个平均值bank2uintAD[LN];//存放50次采样值uintRES[LAN];//存放20个平均值uintRESVP=0x0000;//存放正输出电压采样值,供CAN上传数据uintRESIP=0X0000;//存放正输出电流电压采样值,供CAN上传数据uintRESVN=0X0000;//存放负输出电压采样值,供CAN上传数据uintRESIN=0X0000;//存放负输出电流正电压采样值,供CAN上传数据ucharWAIT_FLAG;//等待中断标志位uintcount;//100次计数/*******************************************************************函数名:initial()**功能描述:系统初始化子程序,放在程序首部****************************************************************/voidinitial(){count=0;INTCON=0x00;/*bit7-bit0:关总中断*/PIE1=0;/*PIE1的中断不使能*/PIE2=0;/*PIE2的中断不使能*/PIE3=0;/*PIE3的中断不使能*/}/*******************************************************************函数名:initcan()**功能描述:CAN初始化子程序,采用标准标识符,正常工作模式****************************************************************/voidinitcan(){//设置发送邮箱0标识符:10011001010=0x04CACAN_TX_Adress_L=0x55;//CAN低地址标识符CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;CAN_TX_Adress_H=0x99;//CAN高地址标识符,应与发送方标识符相同//设置接收邮箱0标识符:00110011111=0x019FCAN_RX_Adress_H=0x33;//CAN高地址标识符CAN_RX_Adress_L=0xe0;//CAN低地址标识符,应与发送方标识符相同CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;//************设置对CAN进行配置***************TRISB=TRISB&0XFB;//设置CANRX/RB3输入,CANTX/RB2输出CANCON=0X80;//CANCON,bit7-5:1XX请求配置while((CANSTAT&0X80)==0)//CAN状态寄存器。bit7-5:100配置方式{;//等待进入CAN配置模式OPMODE=100}//***********波特率设置**************************BRGCON1=0X07;//Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,则TQ=((2*(BRP+1))/Fosc=16/32M=0.5usBRGCON2=0X90;//bit7=1自由编程,bit6=0总线在采样点采样1次;phase_Seg1(bit5-3)=3TQ;BRGCON3=0X42;//Prog_Seg(bit2-0)=1TQ,设置Phase_Seg2(bit2-0)=3TQ//标称位时间=TQ*(Sync_Seg+Prop_Seg+Phase_seg1+Phase_seg2)=(1+1+3+3)TQ=8TQ,//位率=1/(8*0.5us)=250Kbps//******设置发送邮箱0和初始发送的数据*****TXB0SIDL=CAN_TX_Adress_L&0xe0;//bit3=0标准标识符,bit7-5:标准标识符2-0位TXB0SIDH=CAN_TX_Adress_H;//标准标识符的10-3位TXB0CON=0X03;//bit1-0:发送优先级,设置TXB0为最高优先级3TXB0DLC=0X08;//设置数据长度为8个字节TXB0D0=0X00;/*写发送缓冲器数据区数据初值*/TXB0D1=0X00;TXB0D2=0X00;TXB0D3=0X00;TXB0D4=0X00;TXB0D5=0X00;TXB0D6=0X00;TXB0D7=0X00;/*接收缓冲区0的ID、数据长度写无效,故不需设置*/RXB0CON=0X20;//bit6-5=01只接收有效的标准标识符信息//*******初始化接收滤波器0和接收屏蔽****************RXF0SIDH=CAN_RX_Adress_H;RXF0SIDL=CAN_RX_Adress_L&0xe0;//高3位为标识符低3位,低5位是配置RXM0SIDH=0XFF;RXM0SIDL=0XE0;//11个1表示接收11位标识符进行滤波,标识符不同不接收;若全为0,若正确信息,全部接收//*******设置CAN工作模式****************************CANCON=0X00;//=0X40,进入自测试模式;=0x00,正常操作模式while((CANSTAT&0XE0)!=0);//检测CAN配置完成/*初始化CAN的中断,PIR3为CAN的外围中断标志寄存器*/PIR3=0X00;//清所有CAN中断标志PIE3=PIE3|0X01;//使能接收缓冲器0的接收中断IPR3=IPR3|0X01;//接收缓冲器0的接收中断为最高优先级}voidCAN_SEND(){TXB0REQ=0;/*关发送,该位发送成功则自动清零*/TXB0D0=RESVP/100;TXB0D1=(RESVP%100)/10;TXB0D1=(TXB0D14)|((RESVP%100)%10);TXB0D2=RESIP/100;TXB0D3=(RESIP%100)/10;TXB0D3=(TXB0D34)|((RESIP%100)%10);TXB0D4=RESVN/100;TXB0D5=(RESVN%100)/10;TXB0D5=(TXB0D54)|((RESVN%100)%10);TXB0D6=RESIN/100;TXB0D7=(RESIN%100)/10;TXB0D7=(TXB0D74)|((RESIN%100)%10);TXB0REQ=1;/*bit3(TXREQ)=1请求发送,开始发送数据*/while(TXB0REQ==1);//等待发送完成}/*******************************************************************函数名:interruptHI_ISR()**功能描述:高优先级中断子程序:RXB0接收邮箱0接收中断子程序****************************************************************/voidinterruptHI_ISR(){if(RXB0IF==1){if(RXB0D0==0xF0)//判断命令,是否要上传数据{WAIT_FLAG=0x00;//置接收到CAN数据}RXB0FUL=0;//bit7=0打开接收缓冲器接收新信息RXB0IF=0;//清接收中断标志}}voidget_ad(uint*x){GODONE=1;//开始AD转换,转换完成后GODONE清零while(GODONE);//等待转换完成*x=(ADRESH8)+ADRESL;}//************************主程序****************************voidmain(){ucharia,ib;osc_config(0x70,0x40);//8MHz,四倍频Fosc=8MHz*4initial();//系统初始化子程序io_init();adc_init();initcan();//CAN设置初始化IPEN=1;//使能中断高低优先级INTCON=INTCON|0xC0;//开总中断、开外围接口中断TXB0REQ=0;/*关发送,TXB0REQ=0;缓冲区没有要发送的数据*/RXB0FUL=0;/*清零RXB0FUL,表示缓冲区未接收到数据*/WAIT_FLAG=0X01;//关发送,TXB0REQ=0;while(1){while(WAIT_FLAG==0X01);//等待中断//****************测正电压**************for(ib=0;ibLAN;ib++)//LAN==16(20){for(ia=0;iaLN;ia++)//LN==64(50){ADCON0=CHANNEL3;get_ad(&AD[ia]);}RES[ib]=0x0000;for(ia=0;iaLN;ia++){RES[ib]+=AD[ia];}RES[ib]=RES[ib]/50;}RESVP=0X0000;//保存平均的结果for(ib=0;ibLAN;ib++){RESVP=RESVP+RES[ib];}RESVP=RESVP/20;//*****************测正压ACS输出******************for(ib=0;ibLAN;ib++){for(ia=0;iaLN;ia++){ADCON0=CHANNEL2;get_ad(&AD[ia]);}RES[ib]=0x0000;for(ia=0;iaLN;ia++){RES[ib]+=AD[ia];}RES[ib]=RES[ib]/50;}RESIP=0X0000;//保存平均的结果for(ib=0;ibLAN;ib++){RESIP+=RES[ib];}RESIP=RESIP/20;//**********************测负电压********************for(ib=0;ibLAN;ib++){for(ia=0;iaLN;ia++){ADCON0=CHANNEL0;get_ad(&AD[ia]);}RES
本文标题:PIC18F单片机CAN通信程序及AD采样
链接地址:https://www.777doc.com/doc-5263065 .html