在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → BMS下位机和上位机代码示例

BMS下位机和上位机代码示例

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:5.01M
  • 下载次数:80
  • 浏览次数:832
  • 发布时间:2020-02-24
  • 实例类别:嵌入式开发
  • 发 布 人:bingo12138
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 上位机 下位机 示例 代码

实例介绍

【实例简介】关于BMS的示例代码

【实例截图】

from clipboard

【文件目录】

│  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) ;
 } 

 

实例下载地址

BMS下位机和上位机代码示例

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 小僧风 发表于: 2023-12-02 15:57 01
我丢

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警