📄 mc33984.h
字号:
#define MC33984_WAKE PTC_PTC2
#define MC33984_RESET PTC_PTC3
#define EN PTC_PTC5 //74HC154使能低有效
sys_data_type _MC33984_FLAGS,MC33984_OUT[15],MC33984_STATUS0,MC33984_STATUS1;//MC33984标志,输出寄存器,故障寄存器
#define fault_flag _MC33984_FLAGS.Bit.BIT0 //MC33984故障检测标志
#define fault_ok _MC33984_FLAGS.Bit.BIT1 //MC33984故障检测完成标志
#define fault_clk _MC33984_FLAGS.Bit.BIT2 //故障清除时序
unsigned char fault_count=0; //MC33984故障计数器
unsigned char out_count=0; //MC33984输出计数器
//////////////////////////////////////////////////////////////
//定义: void init_33984(void) //
//描述: 对MC33984进行初始化 //
//参量: unsigned char CommandWord:要写入的命令字 //
//说明: 过压、欠压保护开,不进行过压、欠压故障判断 //
//////////////////////////////////////////////////////////////
void Init_MC33984(void) //984初始化
{
void SPI_33984(unsigned char _33984_CS,unsigned char _33984_CMD);
unsigned char i;
for(i=0;i<15;i++)
{
MC33984_OUT[i].Byte=0x1a; //关闭所有输出
SPI_33984(i,0x28);
//SOCHLR 电流过高或过低限制寄存器SOCHLR
SPI_33984(i,0xa8);
//SOCHLR 电流过高或过低限制寄存器SOCHLR
// 位 赋值 定义
// s 0 输出0
// 1 输出1
// 0 0\
// 1 1 | 地址位
// 0 0/
//
// SOCH 1 大额过流设置:75A
// SOCL2 0\
// SOCL1 0 | 小额过流设置:25A
// SOCL0 0/
//SOCL2(D2) SOCL1(D1) SOCL0(D0) 低过流量症断(A)
//0 0 0 25
//0 0 1 22.5
//0 1 0 20
//0 1 1 17.5
//1 0 0 15
//1 0 1 12.5
//1 1 0 10
//1 1 1 7.5
//SOCH (D3) 高过流量症断(A)
//0 100
//1 75
SPI_33984(i,0x30);
//CDTOLR 电流检测寄存器
SPI_33984(i,0xb0);
//CDTOLR 电流检测寄存器
// 位 赋值 定义
// s 0 输出0
// 1 输出1
// 0 0\
// 1 1 | 地址位
// 1 1/
// OL dis 0 使能小额过流检测
// CD dis 0 使能开路检测
// OCLT1 0\
// | 电流检测时间155ms
// OCLT0 0/
SPI_33984(i,0x42); //屏蔽端口直接控制
//SPI_33984(i,0x44); //使能端口直接控制,另外,在使用中发现,使能该寄存器,由spi控制状态检测仍有效
//DICR 直接输入控制寄存器
SPI_33984(i,0xc2); //屏蔽端口直接控制
//SPI_33984(i,0xc4); //使能端口直接控制,另外,在使用中发现,使能该寄存器,由spi控制状态检测仍有效
//DICR 直接输入控制寄存器
// 位 赋值 定义
// s 0 输出0
// 1 输出1
// 1 1\
// 0 0 | 地址位
// 0 0/
// FAST SR 0 低速电流复制 | 1 高速电流复制
// CSNS high 0 高电流复制比1:41000 | 0 1;20500
// IN dis 1 屏蔽端口直接操作输出 | 0 使能端口直接操作
// A/O 0
SPI_33984(i,0x50);
//OSDR 输入开关延时寄存器
// 位 赋值 定义
// 0 0\
// 1 1 | 地址位
// 0 0 |
// 1 1/
// 0 0
// OSD2 0\
// OSD1 0 | 开关输出不延时
// OSD0 0/
//OSD[2:0](D2,D1,D0) HS0开关延时间(ms) HS1开关延时间(ms)
//000 0 0
//001 75 0
//010 150 150
//011 225 150
//100 300 300
//101 375 300
//110 450 450
//111 525 450
SPI_33984(i,0xd1);
//WDR 看门狗时间设置寄存器
// 位 赋值 定义
// 1 1\
// 1 1 | 地址位
// 0 0 |
// 1 1/
// 0 0
// 0 0
// WD1 1\
// | 看门狗时间1250ms
// WD0 1/
//WD[1:0](D1,D0) 看门狗溢出时间 (ms)
//00 620
//01 310
//10 2500
//11 1250
SPI_33984(i,0xe3);
//UOVR 过电压低电压配置寄存器
// 位 赋值 定义
// 1 1\
// 1 1 | 地址位
// 1 1 |
// 0 0/
// 0 0
// 0 0
// UV_dis 0\
// |使能过电压,低电压检测 | 1 屏蔽该功能
// OV_dis 0/
}
}
//////////////////////////////////////////////////////////////
//定义: void Out_33984_1(void) //
//描述: 对MC33984输出端口控制 //
//说明: CSNS1 EN与CSNS2 EN为两路端口电流反馈设置 //
//////////////////////////////////////////////////////////////
void Out_MC33984(void)
{
void SPI_33984(unsigned char _33984_CS,unsigned char _33984_CMD);
unsigned char out_num;
for(out_num=0;out_num<15;out_num++) SPI_33984(out_num,MC33984_OUT[out_num].Byte);
}
//////////////////////////////////////////////////////////////
// 定义: void Dog_33984(void) //
// 描述: 对MC33984进行喂狗处理 //
//////////////////////////////////////////////////////////////
void Dog_MC33984(void)
{
void SPI_33984(unsigned char _33984_CS,unsigned char _33984_CMD);
unsigned char dog_num;
for(dog_num=0;dog_num<15;dog_num++) SPI_33984(dog_num,0xd1);
}
//////////////////////////////////////////////////
//定义: void Sleep_33984(void) //
//描述: 对MC33984芯片执行休眠 //
//说明:此函数对于MC33984执行休眠功能 //
// 此功能操作为芯片唤醒,复位端口均为低电平//
//////////////////////////////////////////////////
void Sleep_33984(void)
{
MC33984_WAKE=0;
MC33984_RESET=0;
}
///////////////////////////////////////////////////////////////
//定义: void Wake_33984(void) //
//描述: 唤醒MC33984芯片 //
//说明:唤醒MC33984,此功能操作为芯片唤醒,复位端口均为低电平//
///////////////////////////////////////////////////////////////
void Wake_33984(void)
{
MC33984_WAKE=1;
MC33984_RESET=1;
}
//////////////////////////////////////////////////////////////////////////////////
//定义: void SPI_33984(unsigned char _33984_CS,unsigned char _33984_CMD) //
//描述: 写命令给MC33984芯片 //
//说明: SPI返回值丢弃 //
//////////////////////////////////////////////////////////////////////////////////
unsigned char SPI_33984(unsigned char _33984_CS,unsigned char _33984_CMD)
{
PTA=PTA&0x0f;
_33984_CS=_33984_CS<<4;
PTA=PTA|_33984_CS;
EN=0; //片选
asm nop
asm nop
SPDR=_33984_CMD;
while((SPSCR&0x80)==0);
asm nop
asm nop
EN=1;
return(SPDR);
}
//////////////////////////////////////////////////////////////
//定义: void Fault_33984(void) //
//描述: 判断故障,根据故障组织报文 //
//说明:此函数是对输出端口操作后,检测是否有故障产生 //
// 应当在void Out_33984()函数后紧接使用 //
// 此外,984芯片开路状态检测必须为输出断开后 //
//////////////////////////////////////////////////////////////
void FAULT_MC33984(void)
{
sys_data_type fault_temp;
//状态寄存器STATR
//OD7 (s) = 输出选择: logic [0] = HS0, logic [1] = HS1.
//OD6 (OTF) = 过温标志.
//OD5 (OCHFs) = 高过流标志. (此故障状态为锁存状态.)
//OD4 (OCLFs) = 低过流标志. (此故障状态为锁存状态.)
//OD3 (OLFs) = 开路标志.
//OD2 (UVF) = 低电压标志.
//OD1 (OVF) = 过电压标志.
//OD0 (FAULTs) =记录故障位(有故障时该位为1)
MC33984_STATUS0.Byte=SPI_33984(fault_count,0x00); //HS0故障诊断
MC33984_STATUS0.Byte=SPI_33984(fault_count,0x00); //MC33984返回值为对上一次命令的响应--故障
MC33984_STATUS1.Byte=SPI_33984(fault_count,0x80); //HS1故障诊断
MC33984_STATUS1.Byte=SPI_33984(fault_count,0x80); //返回故障
if(MC33984_OUT[fault_count].Byte!=0x1a) //如果MC33984有输出,关闭输出后进行开路检测
{
fault_temp.Byte=SPI_33984(fault_count,0x1a); //关闭输出
delay(160); //延时200us
if(MC33984_OUT[fault_count].Bit.BIT0) //HS0有输出
{
fault_temp.Byte=SPI_33984(fault_count,0x00); //HS0故障诊断
fault_temp.Byte=SPI_33984(fault_count,0x00); //返回故障
if(fault_temp.Bit.BIT3) //HS0开路
{
MC33984_STATUS0.Bit.BIT3=1; //编写开路故障代码
MC33984_STATUS0.Bit.BIT0=1; //设定故障位
}
}
if(MC33984_OUT[fault_count].Bit.BIT2) //HS1有输出
{
fault_temp.Byte=SPI_33984(fault_count,0x80); //HS1故障诊断
fault_temp.Byte=SPI_33984(fault_count,0x80); //返回故障
if(fault_temp.Bit.BIT3) //HS1开路
{
MC33984_STATUS1.Bit.BIT3=1; //编写开路故障代码
MC33984_STATUS1.Bit.BIT0=1; //设定故障位
}
}
fault_temp.Byte=SPI_33984(fault_count,MC33984_OUT[fault_count].Byte);//恢复MC33984输出状态
}
fault_ok=1;
if(fault_count==14) fault_flag=0; //故障检测完成标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -