找回密码
 立即注册
搜索
查看: 9159|回复: 72

直播——锂电池保护板主控部分大电流板PCB和程序制作

[复制链接]

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 12:09:28 | 显示全部楼层 |阅读模式
本帖最后由 bsm56321 于 2018-4-25 14:13 编辑

本人业余,,弄着玩,不对处请立即回复我,
和别人设计不同,我把主控做在大电流板上,此板MOS管用TO263或者TO263-7型号通用,当C-端有放电或者充电电路自动工作,此端无电流3分钟自动进入休眠,无待机电流。工作时芯片测量电流,放电:100ma-125a,充电电流:100ma-25a.还可以根据需要通过硬件调节检测范围。此电路是初版,设计成有采样电阻和我采样电阻(用场效应管道通电阻)通用。/********************************************/
本板基本参数,输入电压30-150V,电流120A(根据电压电流选择合适的MOS管)。连接36串均衡板只要地线+RXD+TXD的3根线。电池范围:锂,铁锂,钛酸锂通吃,连接手机APP控制一切参数。




使用道具 举报

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 12:10:20 | 显示全部楼层
本帖最后由 bsm56321 于 2018-4-23 19:34 编辑

现在开始写程序
#include "stc8a8k.h"
//#include <EEPROM.h>
#include "math.h"
#include "adc.h"
#include "xs.h"
#include "intrins.h"
#include "SYSADC.h"
#include "uart_tt.h"
#define u16 unsigned int
#define u32 unsigned long
#define u8 unsigned char
#define NOP()
#define T1MS  65536-2400//定时器初值设定,24MHZ现在设定为        1MS
uchar  m_ucData[]={0};
sbit f_out   =P4^0;                  //放电输出
sbit c_out   =P3^3;                  //充电输出
sbit pow_off   =P3^4;          //总电源休眠
sbit at     =P2^0;                  //蓝牙发at指令控制脚
sbit pwrc   =P4^1;                  //蓝牙休眠唤醒控制脚
sbit ly_it  =P2^0;                  //蓝牙状态判断



/***********************************************************/
//系统变量初始化                                                                                   */
//输入:无                                                                                                   */
//输出:无                                                                                                   */
/***********************************************************/
void SYS_init()
{         
         /***端口模式设置********/
          pow_off=0; //初始化总电源休眠关闭
          f_out=0;         //初始化放电关闭
          c_out=0;         //初始化充电关闭
         
        0M0 = 0x00;
        0M1 = 0x00;
               
                P1M0 = 0x00;
        1M1 = 0x00;
                                                                                                   
        2M0 = 0x01;        //设置P20脚为推挽输出
        2M1 = 0x00;

        3M0 = 0x18;        //设置P33,p34脚为推挽输出
        3M1 = 0x00;                                   

        4M0 = 0x01;         //设置P40脚为推挽输出
        4M1 = 0x00;

            5M0 = 0x00;
        P5M1 = 0x00;

        P6M0 = 0x00;
        P6M1 = 0x00;

        P7M0 = 0x00;
        P7M1 = 0x00;

使用道具 举报

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 12:18:06 | 显示全部楼层
不懂,支持鼓捣。出板上测试看看。

使用道具 举报

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 12:36:08 | 显示全部楼层
先把这断代码烧进去测试下板子状态
/*************************串口通讯和数据解包***********************************/

void U_in()           //接收数据
{
       
            static u8 lent,sta_m;
          if(RI==1)
          {                             RI=0;

                                  if(sta_m== 0)       // 协议解析状态机
                                {
                                     if(SBUF == 0xa0){f_out=0;c_out=0;}               //当收到0xa0,关闭充放电管   测试用
                                         else  if(SBUF == 0xa1){f_out=1;c_out=1;}  //当收到0xa1,开启充放电管   测试用
                                         else  if(SBUF == 0xa2){pow_off=1;}                   //当收到0xa2,总电源休眠           测试用
                                         else  if(SBUF == 0xa3){ly_it=1;}                   //当收到0xa3,总唤醒蓝牙           测试用
                                                                                                                                         
                                }

使用道具 举报

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 12:48:25 | 显示全部楼层
然后呢???

使用道具 举报

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 12:48:59 | 显示全部楼层
楼主很牛了,我这高中毕业都不如你懂的多。。。。

使用道具 举报

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 12:52:37 | 显示全部楼层
本帖最后由 bsm56321 于 2018-4-22 12:53 编辑

一步步来,先测试板子,后面还没有写
#include "stc8a8k.h"
//#include <EEPROM.h>
#include "math.h"
#include "adc.h"
#include "xs.h"
#include "intrins.h"
#include "SYSADC.h"
#include "uart_tt.h"
#define u16 unsigned int
#define u32 unsigned long
#define u8 unsigned char
#define NOP()
#define T1MS  65536-1000//定时器初值设定,24MHZ现在设定为        1MS
u8  m_ucData[]={0};
sbit f_out   =P4^0;                  //放电输出
sbit c_out   =P3^3;                  //充电输出
sbit pow_off   =P3^4;          //总电源休眠
sbit at     =P2^0;                  //蓝牙发at指令控制脚
sbit pwrc   =P4^1;                  //蓝牙休眠唤醒控制脚
sbit ly_it  =P2^0;                  //蓝牙状态判断



/***********************************************************/
//系统变量初始化                                                                                   */
//输入:无                                                                                                   */
//输出:无                                                                                                   */
/***********************************************************/
void SYS_init()
{         
         /***端口模式设置********/
          pow_off=0; //初始化总电源休眠关闭
          f_out=0;         //初始化放电关闭
          c_out=0;         //初始化充电关闭
          
        0M0 = 0x00;
        0M1 = 0x00;
               
                P1M0 = 0x00;
        1M1 = 0x00;
                                                                                                  
        2M0 = 0x01;        //设置P20脚为推挽输出
        2M1 = 0x00;

        3M0 = 0x18;        //设置P33,p34脚为推挽输出
        3M1 = 0x00;                                  

        4M0 = 0x01;         //设置P40脚为推挽输出
        4M1 = 0x00;

            5M0 = 0x00;
        P5M1 = 0x00;

        P6M0 = 0x00;
        P6M1 = 0x00;

        P7M0 = 0x00;
        P7M1 = 0x00;

       
                  
}
void timer_init()                //1毫秒@24.000MHz
{

  AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x08;                //设置定时初值
        TH0 = 0x0F;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        ET0=1;
        EA=1;
        TR0 = 1;                //定时器0开始计时时
        // pwm6=1;
}

//void timer_init()
//{
//            AUXR=0x40;                  
//     //AUXR &=0x80;            //12分频
//         TL0 = T10MS&0xff;       //1ms
//         TH0 = (T10MS>>8)&0xff;       
//         TL1 = T1MS&0xff;      
//     TH1 = (T1MS>>8)&0xff;
//         TMOD= 0X11;
//         ET0 = 1;                                                                            
//         TR0 = 1;
//         ET1 = 1;         
//         AUXR |=0x40;                //设置定时器0为12T模式,定时器1为1T模式
//         TR1 = 1;
//         EA=1;
//}
//
/***********************************************************/
//定时器0中断服务程序                                                                           */
//输入:无                                                                                                   */
//输出:无                                                                                                   */
/***********************************************************/


void timer0() interrupt 1
{         

}


/*************************串口通讯和数据解包***********************************/

void U_in()           //接收数据
{
       
            static u8 lent,sta_m;
          if(RI==1)
          {                             RI=0;

                                  if(sta_m== 0)       // 协议解析状态机
                                {
                                     if(SBUF == 0xa0){f_out=0;c_out=0;}               //当收到0xa0,关闭充放电管   测试用
                                         else  if(SBUF == 0xa1){f_out=1;c_out=1;}  //当收到0xa1,开启充放电管   测试用
                                         else  if(SBUF == 0xa2){pow_off=1;}                   //当收到0xa2,总电源休眠           测试用
                                         else  if(SBUF == 0xa3){ly_it=1;}                   //当收到0xa3,总唤醒蓝牙           测试用
                                         sta_m = 0;      // 状态机复位                                                                                                
                                }
                                else if(sta_m == 1)
                                {                  
                                 
                                                if(SBUF == 0xaa)       // 接收到帧头第2个数据
                                         {  
                                                                                                                                                                                                                                   
                                                     sta_m = 2;
                                                                                                        
                                                 }
                                      else
                                         sta_m = 0;      // 状态机复位                
                                               
                                     
                                               
                                                 
                                }
                        else         if(sta_m == 2)
                                {
                                          
                                                if(SBUF == 0x77)       // 接收到帧头第3个数据
                                         {  
                                                                                                                                                                                                                                   
                                                     sta_m =3;
                                                                                                        
                                                 }
                                      else
                                         sta_m = 0;      // 状态机复位                
                                       
                                       
                                                 
                                }
                        else         if(sta_m == 3)
                                {
                               
                                                if(SBUF == 0x55)       // 接收到帧头第4个数据
                                         {  
                                                                                                                                                                                                                                   
                                                     sta_m = 4;
                                                                                                        
                                                 }
                                      else
                                         sta_m = 0;      // 状态机复位                
                                                  
                                }
                        else         if(sta_m ==4 || sta_m == 5)
                                {
                                              
                                      m_ucData[lent++] = SBUF;     // 数据保存
                                                                      
                                       UartSend(SBUF);
                                      if(lent ==4)      // 判断数据是否接收完毕
                                          {
                                          sta_m = 6;                    
                                          }
                                      else
                                          {
                                          sta_m = 5;
                                          }
                                }
                        else         if(sta_m == 6)
                                {          
                                            
                                      if(SBUF ==0x0D )       // 判断是否接收到帧尾结束符
                                      {
                                         UartSend(0x0d);    // 置标志,表示一个数据包接收到
                                                    // 复位状态机

                                                 sta_m = 0;                                                                                     
                                      }                                     
                                }                          
            }

}
/******************************电池电压扫描**********************************/         
void xs()
{                    
                                
}
/****************************************************************/
void main()
{
        SYS_init();          
    SYS_ADC();
        timer_init();
        UartInit();
       
        while(1)                                                                                         
        {         
                U_in();                       
            xs();
          
        }                   
}


使用道具 举报

76

主题

892

回帖

3130

金币

超级版主

注册时间:2021-3-14

在线时间:534 小时

发表于 2018-4-22 12:55:13 | 显示全部楼层
既然是征求意见,没必要作者可见吧
回复

使用道具 举报

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 13:13:49 | 显示全部楼层
整了这么多仅自己可见。。。。

使用道具 举报

24万

主题

442万

回帖

323

金币

版主

注册时间:2021-3-11

在线时间:9 小时

发表于 2018-4-22 13:19:39 | 显示全部楼层
烧录了机次没有成功,原来MCU的模拟电源没有连接

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|电动车论坛

GMT+8, 2024-10-5 23:25 , Processed in 0.055320 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表