实例介绍
【实例截图】
【文件目录】
│ BMS Master-B 101023.pcb
│ BMS Master-B gerber 101023.rar
│ BMS Master-B.pdf
│ 上位机PCB.dwg
│ 上位机PCB.pdf
│
├─gerber
│ art001.pho
│ art002.pho
│ dd001024.pho
│ drl001.drl
│ drl001.lst
│ drl001.rep
│ sm001021.pho
│ sm002028.pho
│ smd001023.pho
│ smd002022.pho
│ ssb002029.pho
│ sst001026.pho
│
└─shangweiji_V1.1
├─chongdianji
│ code.h
│ count.c
│ count.o
│ ECAN1Config.c
│ ECAN1Config.h
│ ECAN1Config.o
│ ECAN2Config
│ ECAN2Config.c
│ global.h
│ init.c
│ init.o
│ initial.c
│ initial.o
│ LCD.C
│ LCD.o
│ main.c
│ main1.c
│ main1.o
│ Makefile
│ NMakefile
│ send.c
│ send.o
│ shangweiji.cof
│ shangweiji.hex
│ shangweiji.map
│ shangweiji.mcp
│ shangweiji.mcs
│ shangweiji.mcw
│ soc.c
│ soc.h
│ soc.o
│
├─waibujinzhen
│ ├─gaibian
│ │ code.h
│ │ count.c
│ │ count.o
│ │ ECAN1Config.c
│ │ ECAN1Config.h
│ │ ECAN1Config.o
│ │ ECAN2Config.c
│ │ ECAN2Config.o
│ │ global.h
│ │ init.c
│ │ init.o
│ │ initial.c
│ │ initial.o
│ │ LCD.C
│ │ LCD.o
│ │ main1.c
│ │ main1.o
│ │ send.c
│ │ send.o
│ │ shangweiji.cof
│ │ shangweiji.hex
│ │ shangweiji.map
│ │ shangweiji.mcp
│ │ shangweiji.mcs
│ │ shangweiji.mcw
│ │ soc.c
│ │ soc.h
│ │ soc.o
│ │
│ └─SOC
│ ECAN1Config.c
│ ECAN1Config.h
│ ECAN1Config.o
│ ecan_init.c
│ ecan_init.o
│ main.c
│ main.o
│ soc.c
│ soc.cof
│ soc.h
│ soc.hex
│ soc.map
│ soc.mcp
│ soc.mcs
│ soc.mcw
│ soc.o
│
└─zuixinneibujingzhen
├─gaibian
│ code.h
│ count.c
│ count.o
│ ECAN1Config.c
│ ECAN1Config.h
│ ECAN1Config.o
│ ECAN2Config.c
│ ECAN2Config.o
│ global.h
│ init.c
│ init.o
│ initial.c
│ initial.o
│ LCD.C
│ LCD.o
│ main1.c
│ main1.o
│ send.c
│ send.o
│ shangweiji.cof
│ shangweiji.hex
│ shangweiji.map
│ shangweiji.mcp
│ shangweiji.mcs
│ shangweiji.mcw
│ soc.c
│ soc.h
│ soc.o
│
└─SOC
ECAN1Config.c
ECAN1Config.h
ECAN1Config.o
ecan_init.c
ecan_init.o
main.c
main.o
soc.c
soc.cof
soc.h
soc.hex
soc.map
soc.mcp
soc.mcs
soc.mcw
soc.o
#if defined(__dsPIC33F__)
#include "p33Fxxxx.h"
#elif defined(__PIC24H__)
#include "p24Hxxxx.h"
#endif
#include "soc.h"
#define uchar unsigned char // 8bit, 0 ~ 255
#define uint unsigned int // 16bit, 0 ~ 65,535
#define ulong unsigned long // 32bit, 0 ~ 4,294,967,295
#define LCDBUS PORTD
ulong Q=0; //定义开机显示电量满,即100AH
ulong Q1=10000;
ulong q0=0;
uint soc_time=0;
uint q_sum=0;
ulong v_sum=0;
ulong v_sum_buff = 0;
uint v_sum_H = 0;
uint v_sum_L = 0;
ulong c_sum=0;
uint c_sum_H=0;
uint c_sum_L=0;
ulong c_sum_buff=0;
uchar zcflg_sign=0;
uint flg_chong=0;
void soc_init(void)
{
InitMCPWM(); //初始化时钟
A2_DDR=0;
A1_DDR=0;
A0_DDR=0; //设置A2,A1,A0为输出;
A2=1;
A1=1;
A0=1;
AD1CON1bits.ADON=0;
// AD1PCFGH=0xffff;
AD1PCFGL=0xffff;
HOLDA_DDR=0;
HOLDB_DDR=0;
HOLDC_DDR=0; //设置HOLDA,B,C为输出;
HOLDA=1;
HOLDB=1;
HOLDC=1;
ECO_SOC_DDR=1; // 设置转换完毕中断口为输入;
// ECO_SOC=1; //初始化
CLK_SOC_DDR=0; // 设置时钟输出口;
CLK_SOC=1; //初始化
RD_SOC_DDR=0; // 读输出口;
RD_SOC=1; //初始化
Nop();
Nop();
Nop();
WR_SOC_DDR=0; //写输出口
WR_SOC=1; //初始化
CS_SOC_DDR=0; //片选
CS_SOC=1; //初始化
ADD_SOC_DDR=0;
ADD_SOC=0;
RESET_SOC_DDR=0; //复位输出
RESET_SOC=1;
//TRISE=TRISE&0xFF83;
// TRISF=TRISF&0xFF87;
//TRISG=0xFCFF&TRISG;
Nop();
ECO_SOC_DDR=1; // 设置转换完毕中断口为输入;
Nop();
ECO_SOC=1; //初始化
Nop();
//DATA_SOC_DDR=0xffff; // 数据输入口
TRISB=0xffff;
//PORTB=0xffff;
//CS_SOC=0;
RESET_SOC=1;
Nop();
Nop();
Nop();
Nop();
RESET_SOC=0; //输出复位信号
Nop();
Nop();
Nop();
RESET_SOC=1;
Nop();
Nop();
// AD1PCFGH=0xffff;
// AD1PCFGL=0xffff;
//InitMCPWM(); //初始化时钟
INTCON2bits.INT1EP=1; //开外部中断1;下降沿中断
IPC5bits.INT1IP=7;
IEC1bits.INT1IE=1;
CS_SOC=0;
Nop();
Nop();
HOLDA=1; //关闭A口采集
// HOLDB=1;
Nop();
Nop();
Nop();
HOLDA=0; //开启A口采集
// HOLDB=0;
//HOLDC=0;
Nop();
Nop();
Nop();
Nop();
// HOLDA=1;
//CS_SOC=1;
//A2=1;
//A1=1;
//A0=0;
}
void InitMCPWM(void)
{
//TRISEbits.TRISE3=0;
PTPER = 0xA0;
PWMCON1 = 0x0F20; // disable PWMs
OVDCON = 0x0800; // allow control using OVD
//PDC1 = 1014; // get value,
//PDC2 = 1014; // and load all three PWM
// PDC4 = 40; // duty cycles
PDC2 = 160;
SEVTCMP = PTPER;
PWMCON2 = 0x0000; // 16 postscale values
PTCON = 0x8000; // start PWM
}
void function(ulong temp) //q0单位为0.1mAH
{
if(temp<120960)
{
q0=0;
}
else if((temp>=120960)&&(temp<152640))
{
q0=(158*temp-19090900)/100;
}
else if((temp>=152640)&&(temp<168000))
{
q0=(5950*temp-903287500)/100;
}
else if((temp>=168000)&&(temp<=182400))
{
q0=(250*temp 54400000)/100;
}
else
{
q0=1000000;
}
}
void SOC(void)
{
v_sum_buff = ( ulong )v_sum_H ;
v_sum_buff = ( ((v_sum_buff<<16)) |(ulong) v_sum_L );
v_sum = v_sum_buff ;
//if(flg_chong==0x0000) //充放电结束后(静态时)一段时间,检测电量初始值;
// {
soc_time ;
if(soc_time>=200)
{
soc_time=0;
function(v_sum);
Q=q0/100; //单位1AH
Q1=Q;
q_sum=Q;
}
q_sum=Q1;
// }
// else
// {
/* soc_time=0;
if(flg_chong==0xff00)//充电积分; Q单位为0.1mAs;
{
Q=Q1*360000 (ulong)(c_sum/1000);
Q=Q/360000; //单位0.01AH
}
if(flg_chong==0x00ff)//放电积分; Q单位为0.1mAs;
{
Q=Q1*360000-(ulong)(c_sum/1000);
Q=Q/360000; //单位0.01AH
}
Q1=Q;
q_sum=(uint)Q;
}*/
}
void oscConfig(void)
{
PLLFBDbits.PLLDIV=41; // M=43
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
OSCTUN=0; // Tune FRC oscillator, if FRC is used
// Disable Watch Dog Timer
RCONbits.SWDTEN=0;
// Clock switch to incorporate PLL
__builtin_write_OSCCONH(0x01); // Initiate Clock Switch to
// FRC with PLL (NOSC=0b001)
__builtin_write_OSCCONL(0x01); // Start clock switching
while (OSCCONbits.COSC!= 0b01); // Wait for Clock switch to occur
// Wait for PLL to lock
while(OSCCONbits.LOCK!=1);
}
void dianliu_count(void) //传感器电流信号处理
{
if(SOC_DATA[0]<=32767)
{
c_sum=((SOC_DATA[0]*25*1499)/32767);
zcflg_sign=0; //符号位
if(SOC_DATA[0]>1000) //以1A为基准
{
flg_chong=0xff00; // 充电 充电时flg_chong显示为0xff00,放电时为0x00ff
}
else
{
flg_chong=0x0000;
}
}
else
{
c_sum=(( 65536-SOC_DATA[0] )*25*1499)/32767; //显示前面须加一负号
zcflg_sign=1; //符号位
if(SOC_DATA[0]<64536)
{
flg_chong=0x00ff; //放电 充电时flg_chong显示为0xff00,放电时为0x00ff
}
else
{
flg_chong=0x0000;
}
}
if(c_sum>=29000) // 当电流大于29A时 采用通道2计数电流
{
if(SOC_DATA[1]<=32767)
{
c_sum=(SOC_DATA[1]*25*17540)/32767;
zcflg_sign=0; //符号位
}
else
{
c_sum=((65536-SOC_DATA[1] )*25*17540)/32767; //显示前面须加一负号
zcflg_sign=1; //符号位
}
}
if(c_sum<2000) // 在1A内显示零
{
c_sum = 0 ;
zcflg_sign = 0 ; //符号位
}
c_sum_buff = c_sum ;
//c_sum_buff = 123123 ;
c_sum_L =(uint) (c_sum_buff&0xffff) ;
c_sum_H = (uint) ((c_sum_buff)>>16) ;
}
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)