Files
Hbridge/User.c
2025-07-05 21:24:38 +08:00

568 lines
17 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "MAIN.H"
#include "user.H"
//can信息
UnInfCan UnInfCan_1 _at_ 0xF5E8;
UnSwSample UnSwSample_1 = {0};
UnSwOut UnSwOut_1 = {0};
//CAN发送周期
uword CntCan_1 = 0;
bit FlgCan_1 = 0;
//第一次采集到有效数据指示
bit FlgOneTime = 0;
uword RgCanPerid = 1000;
//PWM 20181227
ubyte PwmH[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uword adc_result = 0;
//RAM重启保存标志
ubyte RestartDataFlg1 _at_ 0xF5E7;
ubyte RestartDataFlg2 _at_ 0xF600;
//KGF保存数据
uword RestartDataKGF _at_ 0xF5E5;
MotorDirection motor_dir;
MotorState motor_sta;
ubyte can_error_cnt = 0;
ubyte can_error_flg = 0;
//-----------------------------------------------------------------------
//RTC定时器
//-----------------------------------------------------------------------
void RTCProcess(void)
{
//************************************************************************
//////CAN发送周期
if(FlgCan_1){CntCan_1++;if(CntCan_1 >= RgCanPerid){FlgCan_1=0; CntCan_1=0;}}else{CntCan_1=0;}
//************************************************************************
}
//初始化完成发送CAN帧 20210706
//ubyte *pStt, 发送数据,只发送两个字节
void InitCanTransmit(ubyte InitCanTransmit1,ubyte InitCanTransmit2)
{
ubyte InitCanTransmitbuf[8] = {0,0,0,0,0,0,0,0};
//----------------------------------------------------------------
InitCanTransmitbuf[0] = 0;
InitCanTransmitbuf[1] = 0;
InitCanTransmitbuf[2] = InitCanTransmit1;
InitCanTransmitbuf[3] = InitCanTransmit2;
InitCanTransmitbuf[4] = 0;
InitCanTransmitbuf[5] = 0;
InitCanTransmitbuf[6] = 0;
InitCanTransmitbuf[7] = 0;
// CAN_waitTransmit(DF_SwTx);//不需要等待上一帧发送完成,因为这是第一次发送
//// Password();
CAN_vLoadData(DF_SwTxInit, (ulong *)(InitCanTransmitbuf)); // 装载数据
CAN_vTransmit(DF_SwTxInit);
}
//输出PWM 20181227
/*
ubyte *pStt, 状态机变量
bit Cmd, 状态机输入1根据PwmH的值来决定输出0输出0
bit Out, 状态机输出
ubyte *pCnt, 定时计数器
ubyte *pPwmH 状态机参数PWM的高电平时间
*/
bit funcPwmOut(ubyte *pStt,bit Cmd,ubyte *pCnt,ubyte *pPwmH)
{
ubyte PwmL = 0;
bit Out = 0;
//------------------------------------------------------------------------------------------------
if((*pPwmH) > dfPwmH)(*pPwmH) = dfPwmH; //限制最大值
PwmL = dfPwmH - (*pPwmH);//计算PWM低电平
if((1 == Cmd) )
{
if(0 == (*pPwmH)) //高电平为0表示PWM无效由Cmd来控制Cmd为1输出1Cmd为0输出0
{
Out = 1;
(*pStt) = 0;
}
else
{
switch((*pStt))
{
case 0:
(*pCnt) = 0;
(*pStt) = 1;
Out = 1;
break;
case 1:
if((*pCnt) >= (*pPwmH))
{
(*pCnt) = 0;
(*pStt) = 2;
Out = 0;
}
else
{
(*pCnt)++;
(*pStt) = 1;
Out = 1;
}
break;
case 2:
if((*pCnt) >= PwmL)
{
(*pCnt) = 0;
(*pStt) = 1;
Out = 1;
}
else
{
(*pCnt)++;
(*pStt) = 2;
Out = 0;
}
break;
//-----------------------------------------------------
default:;
}//switch
}//else
}//if
else
{
Out = 0;
(*pStt) = 0;
}
return Out;
}
//根据接收的CAN缓冲区数据驱动相应指示灯。
void LedDr(void)
{
static ubyte RgSTT[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static ubyte CntTime[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
ubyte i = 0;
//------------------------------------------------------------------------------------------------
dfOut_01 = funcPwmOut(&RgSTT[0 ],dfCmd_01,&CntTime[0 ],&PwmH[0 ]);
dfOut_02 = funcPwmOut(&RgSTT[1 ],dfCmd_02,&CntTime[1 ],&PwmH[1 ]);
dfOut_03 = funcPwmOut(&RgSTT[2 ],dfCmd_03,&CntTime[2 ],&PwmH[2 ]);
dfOut_04 = funcPwmOut(&RgSTT[3 ],dfCmd_04,&CntTime[3 ],&PwmH[3 ]);
dfOut_05 = funcPwmOut(&RgSTT[4 ],dfCmd_05,&CntTime[4 ],&PwmH[4 ]);
dfOut_06 = funcPwmOut(&RgSTT[5 ],dfCmd_06,&CntTime[5 ],&PwmH[5 ]);
dfOut_07 = funcPwmOut(&RgSTT[6 ],dfCmd_07,&CntTime[6 ],&PwmH[6 ]);
dfOut_08 = funcPwmOut(&RgSTT[7 ],dfCmd_08,&CntTime[7 ],&PwmH[7 ]);
dfOut_09 = funcPwmOut(&RgSTT[8 ],dfCmd_09,&CntTime[8 ],&PwmH[8 ]);
dfOut_10 = funcPwmOut(&RgSTT[9 ],dfCmd_10,&CntTime[9 ],&PwmH[9 ]);
dfOut_11 = funcPwmOut(&RgSTT[10],dfCmd_11,&CntTime[10],&PwmH[10]);
dfOut_12 = funcPwmOut(&RgSTT[11],dfCmd_12,&CntTime[11],&PwmH[11]);
dfOut_13 = funcPwmOut(&RgSTT[12],dfCmd_13,&CntTime[12],&PwmH[12]);
dfOut_14 = funcPwmOut(&RgSTT[13],dfCmd_14,&CntTime[13],&PwmH[13]);
dfOut_15 = funcPwmOut(&RgSTT[14],dfCmd_15,&CntTime[14],&PwmH[14]);
dfOut_16 = funcPwmOut(&RgSTT[15],dfCmd_16,&CntTime[15],&PwmH[15]);
i = dfOut_02; //20210906保存IO口状态 解决KGF重启指示灯闪烁问题
RestartDataKGF = dfOut_01;
RestartDataKGF = RestartDataKGF + (i<<1);
i = dfOut_03;
RestartDataKGF = RestartDataKGF + (i<<2);
i = dfOut_04;
RestartDataKGF = RestartDataKGF + (i<<3);
i = dfOut_05;
RestartDataKGF = RestartDataKGF + (i<<4);
i = dfOut_06;
RestartDataKGF = RestartDataKGF + (i<<5);
i = dfOut_07;
RestartDataKGF = RestartDataKGF + (i<<6);
i = dfOut_08;
RestartDataKGF = RestartDataKGF + (i<<7);
i = dfOut_09;
RestartDataKGF = RestartDataKGF + (i<<8);
i = dfOut_10;
RestartDataKGF = RestartDataKGF + (i<<9);
i = dfOut_11;
RestartDataKGF = RestartDataKGF + (i<<10);
i = dfOut_12;
RestartDataKGF = RestartDataKGF + (i<<11);
i = dfOut_13;
RestartDataKGF = RestartDataKGF + (i<<12);
i = dfOut_14;
RestartDataKGF = RestartDataKGF + (i<<13);
i = dfOut_15;
RestartDataKGF = RestartDataKGF + (i<<14);
i = dfOut_16;
RestartDataKGF = RestartDataKGF + (i<<15);
}
//can错误处理
void CanErrorProcess(void)
{
ubyte ubNSRL = 0;
ubyte ubNSRH = 0;
ubyte ubResetLEC = 0x3F;
//-------------------------------------------
EA = 0;
CAN_pushAMRegs(); // push the CAN Access Mediator Registers
SFR_PAGE(_su0, SST0); // switch to page 0
CAN_vWriteCANAddress(CAN_NSR0);
CAN_vReadEN();
ubNSRL = CAN_DATA0;
ubNSRH = CAN_DATA1;
if (ubNSRL & 0x20) // if ALERT
{
CAN_vInit();
}
if (ubNSRL & 0x07) // if LEC
{
ubResetLEC = 0x38;
}
//// Reset LEC, TXOK, RXOK, ALERT, EWRN, BOFF, LLE, LOE (if set)
CAN_vWriteCANAddress(CAN_NSR0); // Addressing CAN_NSR0
CAN_DATA0 = ~(ubNSRL & ubResetLEC); // load CAN_NSR0 status register[7-0]
CAN_DATA1 = ~(ubNSRH); // load CAN_NSR0 status register[15-8]
CAN_vWriteEN(D0_VALID+D1_VALID); // Data0 and Data1 are Valid for
SFR_PAGE(_su0, RST0); // restore the old SCU page
CAN_popAMRegs(); // restore the CAN Access Mediator Registers
EA = 1;
}
////效验算法
//void Password(void)
//{
// ubyte i;
////---------------------------------
// for(i=0;i<5;i++)
// {
// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][3];//CAN 第0个字节
// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][2];//CAN 第1个字节
// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][1];//CAN 第2个字节
// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][0];//CAN 第3个字节
// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][7];//CAN 第4个字节
// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][6];//CAN 第5个字节
// UnInfCan_1.ArrData.Arr[0][4] ^= UnInfCan_1.ArrData.Arr[0][5];//CAN 第6个字节
// }
//}
void CanTransmit(void)
{
// ulong i;
//----------------- --------
CAN_waitTransmit(DF_SwTx);//发送前等待上一帧发送完毕,这样不会丢帧
// Password();
CAN_vLoadData(DF_SwTx, (ulong *)(&UnInfCan_1.ArrData.Arr[0][0])); // 装载数据
CAN_vTransmit(DF_SwTx);
}
//CAN发送一帧
void CanTX(void)
{
//-----------------------------------
// if(1 == SwOut09)UnInfCan_1.ArrData.Arr[0][3] |= 0x01;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x01); //KGF1 //20200303修改为与接收到的数据一致反馈与接收到时数据为一致
// if(1 == SwOut10)UnInfCan_1.ArrData.Arr[0][3] |= 0x02;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x02); //KGF2
// if(1 == SwOut04)UnInfCan_1.ArrData.Arr[0][3] |= 0x04;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x04); //KGF3
// if(1 == SwOut03)UnInfCan_1.ArrData.Arr[0][3] |= 0x08;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x08); //KGF4
// if(1 == SwOut06)UnInfCan_1.ArrData.Arr[0][3] |= 0x10;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x10); //KGF5
// if(1 == SwOut05)UnInfCan_1.ArrData.Arr[0][3] |= 0x20;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x20); //KGF6
// if(1 == SwOut15)UnInfCan_1.ArrData.Arr[0][3] |= 0x40;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x40); //KGF7
// if(1 == SwOut16)UnInfCan_1.ArrData.Arr[0][3] |= 0x80;else UnInfCan_1.ArrData.Arr[0][3] &= (~0x80); //KGF8
// if(1 == SwOut13)UnInfCan_1.ArrData.Arr[0][2] |= 0x01;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x01); //KGF9
// if(1 == SwOut14)UnInfCan_1.ArrData.Arr[0][2] |= 0x02;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x02); //KGF10
// if(1 == SwOut08)UnInfCan_1.ArrData.Arr[0][2] |= 0x04;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x04); //KGF11
// if(1 == SwOut07)UnInfCan_1.ArrData.Arr[0][2] |= 0x08;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x08); //KGF12
// if(1 == SwOut02)UnInfCan_1.ArrData.Arr[0][2] |= 0x10;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x10); //KGF13
// if(1 == SwOut01)UnInfCan_1.ArrData.Arr[0][2] |= 0x20;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x20); //KGF14
// if(1 == SwOut11)UnInfCan_1.ArrData.Arr[0][2] |= 0x40;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x40); //KGF15
// if(1 == SwOut12)UnInfCan_1.ArrData.Arr[0][2] |= 0x80;else UnInfCan_1.ArrData.Arr[0][2] &= (~0x80); //KGF16
// if(1 == SwIn01 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x01);else UnInfCan_1.ArrData.Arr[0][1] |= 0x01; //Dia01 20200225修改为0数据变为1,1数据变为0这样大CPU方便处理
// if(1 == SwIn02 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x02);else UnInfCan_1.ArrData.Arr[0][1] |= 0x02; //Dia02
// if(1 == SwIn03 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x04);else UnInfCan_1.ArrData.Arr[0][1] |= 0x04; //Dia03
// if(1 == SwIn04 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x08);else UnInfCan_1.ArrData.Arr[0][1] |= 0x08; //Dia04
// if(1 == SwIn05 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x10);else UnInfCan_1.ArrData.Arr[0][1] |= 0x10; //Dia05
// if(1 == SwIn06 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x20);else UnInfCan_1.ArrData.Arr[0][1] |= 0x20; //Dia06
// if(1 == SwIn07 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x40);else UnInfCan_1.ArrData.Arr[0][1] |= 0x40; //Dia07
// if(1 == SwIn08 )UnInfCan_1.ArrData.Arr[0][1] &= (~0x80);else UnInfCan_1.ArrData.Arr[0][1] |= 0x80; //Dia08
UnInfCan_1.ArrData.Arr[0][3] = UnInfCan_1.ArrData.ArrRX[0][0];
UnInfCan_1.ArrData.Arr[0][2] = UnInfCan_1.ArrData.ArrRX[0][1];
UnInfCan_1.ArrData.Arr[0][1] = motor_sta;
UnInfCan_1.ArrData.Arr[0][0] = can_error_flg;
UnInfCan_1.ArrData.Arr[0][7] = 0;
UnInfCan_1.ArrData.Arr[0][6] = 0;
UnInfCan_1.ArrData.Arr[0][5] = (ubyte)(adc_result>>8);
UnInfCan_1.ArrData.Arr[0][4] = (ubyte)(adc_result);
CanTransmit();
}
/*-------- 电机控制函数 --------*/
// 电机正转通道0工作
void motorForward(void)
{
CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(0x0960*1/255);//这个是50us UnInfCan_1.ArrData.ArrRX[0][1]
CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(0x0960);//这个是50us
CC6_vEnableShadowTransfer_CC6_TIMER_12();
CC6_vEnableShadowTransfer_CC6_TIMER_13();
}
// 电机反转通道1工作
void motorReverse(void)
{
CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(0x0960);//这个是50us
CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(0x0960*1/255);//这个是50us
CC6_vEnableShadowTransfer_CC6_TIMER_12();
CC6_vEnableShadowTransfer_CC6_TIMER_13();
}
// 电机停止(所有通道关闭)
void motorStop(void)
{
CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(0x0960);//这个是50us
CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(0x0960);//这个是50us
CC6_vEnableShadowTransfer_CC6_TIMER_12();
CC6_vEnableShadowTransfer_CC6_TIMER_13();
}
// 电机停止(所有通道关闭)
void motorStop1(void)
{
CC6_vLoadChannelShadowRegister_CC6_CHANNEL_0(0x0960*UnInfCan_1.ArrData.ArrRX[0][1]/255);//这个是50us UnInfCan_1.ArrData.ArrRX[0][1]
CC6_vLoadChannelShadowRegister_CC6_CHANNEL_1(0x0960*UnInfCan_1.ArrData.ArrRX[0][1]/255);//这个是50us
CC6_vEnableShadowTransfer_CC6_TIMER_12();
CC6_vEnableShadowTransfer_CC6_TIMER_13();
}
// 电机状态机函数
// 电机状态机函数
void motorStateMachine(MotorState *current_state,
MotorDirection direction_cmd,
bool over_current)
{
switch (*current_state)
{
// 停止状态
case MOTOR_STOPPED:
if (over_current) {
*current_state = MOTOR_FAULT;
motorStop();
}
else if (direction_cmd == DIR_FORWARD) {
*current_state = MOTOR_FORWARD;
motorForward();
}
else if (direction_cmd == DIR_REVERSE) {
*current_state = MOTOR_REVERSE;
motorReverse();
}
else {
motorStop(); // 确保停止(处理其他无效值)
}
break;
// 正转状态
case MOTOR_FORWARD:
if (over_current) {
*current_state = MOTOR_FAULT;
motorStop();
}
else if (direction_cmd != DIR_FORWARD) {
*current_state = MOTOR_STOPPED;
motorStop();
}
// 否则保持正转状态
break;
// 反转状态
case MOTOR_REVERSE:
if (over_current) {
*current_state = MOTOR_FAULT;
motorStop();
}
else if (direction_cmd != DIR_REVERSE) {
*current_state = MOTOR_STOPPED;
motorStop();
}
// 否则保持反转状态
break;
// 故障状态(过流保护)
case MOTOR_FAULT:
// 只有在停止命令时才能退出故障状态
if (direction_cmd == DIR_STOP) {
*current_state = MOTOR_STOPPED;
}
// 否则保持故障状态,电机保持停止
motorStop();
break;
default:
// 异常处理
*current_state = MOTOR_STOPPED;
motorStop();
break;
}
}
//CAN发送接收
void CanRXTX(void)
{
stCAN_SWObj StrCanRx = {0};
uword tmp = 0;
ubyte i = 0,j = 0;
static ubyte first_sta = 0;
bool over_current1 = 0;
//------------------------------------
if(0 == first_sta)
{
first_sta = 1;
// 启动并行ADC请求假设通道0x80对应实际物理通道
ADC_vStartParReqChNum(0x80);
// 设置加载事件(需确认函数参数)
ADC_vSetLoadEvent();
}
// 等待转换完成(需明确仲裁槽号)
if(0 == ADC_ubBusy())
{
UnInfCan_1.ArrData.Arr[0][3] ++;
// 获取结果
adc_result = ADC_uwGetResultData0();
// 启动并行ADC请求假设通道0x80对应实际物理通道
ADC_vStartParReqChNum(0x80);
// 设置加载事件(需确认函数参数)
ADC_vSetLoadEvent();
}
if(CAN_ubNewData(DF_SwRx))
{
CAN_vGetMsgObj(DF_SwRx, &StrCanRx);
UnInfCan_1.ArrData.ArrRX[0][3] = StrCanRx.ulDATAL.ubDB[0];
UnInfCan_1.ArrData.ArrRX[0][2] = StrCanRx.ulDATAL.ubDB[1];
UnInfCan_1.ArrData.ArrRX[0][1] = StrCanRx.ulDATAL.ubDB[2];
UnInfCan_1.ArrData.ArrRX[0][0] = StrCanRx.ulDATAL.ubDB[3];
UnInfCan_1.ArrData.ArrRX[0][7] = StrCanRx.ulDATAH.ubDB[0];
UnInfCan_1.ArrData.ArrRX[0][6] = StrCanRx.ulDATAH.ubDB[1];
UnInfCan_1.ArrData.ArrRX[0][5] = StrCanRx.ulDATAH.ubDB[2];
UnInfCan_1.ArrData.ArrRX[0][4] = StrCanRx.ulDATAH.ubDB[3];
CAN_vReleaseObj(DF_SwRx);
//CAN发送周期 50-5000ms
tmp = (uword)UnInfCan_1.ArrData.ArrRX[0][6];
tmp = (tmp << 8);
tmp |= ((uword)UnInfCan_1.ArrData.ArrRX[0][7]);
if(tmp >= 50)RgCanPerid = tmp;
if(tmp >= 5000)RgCanPerid = 5000;
}
// 读取方向控制信号(根据您的硬件接口)
if (1 == UnInfCan_1.BitData.D21 && 0 == UnInfCan_1.BitData.D22)
{
motor_dir = DIR_FORWARD;
}
else if (0 == UnInfCan_1.BitData.D21 && 1 == UnInfCan_1.BitData.D22)
{
motor_dir = DIR_REVERSE;
}
else
{
motor_dir = DIR_STOP;
}
if(adc_result < OVRE_CURRENT_MAX)//过流状态采集到的是低电平,正常是高电平。
{
over_current1 = 1;
}
else
{
over_current1 = 0;
}
motorStateMachine(&motor_sta, motor_dir, over_current1); //处理电机
if(CAN_ubNewData(DF_SwRxPwm))
{
CAN_vGetMsgObj(DF_SwRxPwm, &StrCanRx);
UnInfCan_1.ArrData.ArrRX[1][2] = StrCanRx.ulDATAL.ubDB[0];
UnInfCan_1.ArrData.ArrRX[1][3] = StrCanRx.ulDATAL.ubDB[1];
UnInfCan_1.ArrData.ArrRX[1][0] = StrCanRx.ulDATAL.ubDB[2];
UnInfCan_1.ArrData.ArrRX[1][1] = StrCanRx.ulDATAL.ubDB[3];
UnInfCan_1.ArrData.ArrRX[1][6] = StrCanRx.ulDATAH.ubDB[0];
UnInfCan_1.ArrData.ArrRX[1][7] = StrCanRx.ulDATAH.ubDB[1];
UnInfCan_1.ArrData.ArrRX[1][4] = StrCanRx.ulDATAH.ubDB[2];
UnInfCan_1.ArrData.ArrRX[1][5] = StrCanRx.ulDATAH.ubDB[3];
CAN_vReleaseObj(DF_SwRxPwm);
//接收的数据保存到PWM数据结构中20181227
PwmH[0 ] = (ubyte)UnInfCan_1.BitData.Pwm_01;
PwmH[1 ] = (ubyte)UnInfCan_1.BitData.Pwm_02;
PwmH[2 ] = (ubyte)UnInfCan_1.BitData.Pwm_03;
PwmH[3 ] = (ubyte)UnInfCan_1.BitData.Pwm_04;
PwmH[4 ] = (ubyte)UnInfCan_1.BitData.Pwm_05;
PwmH[5 ] = (ubyte)UnInfCan_1.BitData.Pwm_06;
PwmH[6 ] = (ubyte)UnInfCan_1.BitData.Pwm_07;
PwmH[7 ] = (ubyte)UnInfCan_1.BitData.Pwm_08;
PwmH[8 ] = (ubyte)UnInfCan_1.BitData.Pwm_09;
PwmH[9 ] = (ubyte)UnInfCan_1.BitData.Pwm_10;
PwmH[10] = (ubyte)UnInfCan_1.BitData.Pwm_11;
PwmH[11] = (ubyte)UnInfCan_1.BitData.Pwm_12;
PwmH[12] = (ubyte)UnInfCan_1.BitData.Pwm_13;
PwmH[13] = (ubyte)UnInfCan_1.BitData.Pwm_14;
PwmH[14] = (ubyte)UnInfCan_1.BitData.Pwm_15;
PwmH[15] = (ubyte)UnInfCan_1.BitData.Pwm_16;
// UnInfCan_1.ArrData.Arr[0][3] = UnInfCan_1.ArrData.ArrRX[1][0];
// UnInfCan_1.ArrData.Arr[0][2] = UnInfCan_1.ArrData.ArrRX[1][1];
// UnInfCan_1.ArrData.Arr[0][1] = UnInfCan_1.ArrData.ArrRX[1][2]; 20200225注释不更新诊断数据
// UnInfCan_1.ArrData.Arr[0][0] = UnInfCan_1.ArrData.ArrRX[1][3];
// UnInfCan_1.ArrData.Arr[0][7] = UnInfCan_1.ArrData.ArrRX[1][4];
// UnInfCan_1.ArrData.Arr[0][6] = UnInfCan_1.ArrData.ArrRX[1][5];
// UnInfCan_1.ArrData.Arr[0][5] = UnInfCan_1.ArrData.ArrRX[1][6];
// UnInfCan_1.ArrData.Arr[0][4] = UnInfCan_1.ArrData.ArrRX[1][7];
// CanTransmit();
}
//接收一帧,调用一次点灯程序。
// LedDr();
//100ms发送一帧
if(!FlgCan_1)
{
FlgCan_1 = 1;
CanTX();
}
if( (0x40 == can_error_cnt) || (0x80 == can_error_cnt) )//20250625判断是否出现总线错误
{
can_error_flg = can_error_cnt;
CAN_vInit();
can_error_cnt = 0;
}
}