This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好,
我正在Code Composer Studio软件环境中的两个微控制器之间进行基于CAN的消息传输。 通信接口的方框图结构如下所示:
根据上图,需要通过编程开发的应用程序包括以下几个步骤:
在转换器2 (直流-交流3相逆变器)中发生故障时,
(A) MCU2必须 检测Conv2中的故障。
(B) MCU2必须将故障状态告知MCU1。
(c)因此,MCU1将向CONV1生成门控信号 ,以便将直流链路电压降至零。
(D)最后 ,Conv2的输入电压将为零,因此同样会停止工作并为负载提供3相输出功率。
如果有人建议为上述情况进行编程,我将非常有义务。
谢谢你。
此致
Sumanta
您好,Sumantha:
请查看您可以尝试的修改代码。 请注意我的评论,它以“// info:”开头。 由于需要定义正在运行的正确函数,因此代码将不会按其本身进行编译,但下面的示例应让您了解要修改的内容以及在何处放置函数调用。 您可以为每个MCU使用类似的代码,并且实际上可以将任意多个节点连接到CAN总线。 最好为每个MCU分配一个唯一的ID,以便您知道哪个节点传输了故障条件。 希望示例代码有所帮助。
此致,
约瑟夫
//###################################################################
//
//文件:can_loop.c.
//
//标题:演示基本CAN设置和使用的示例。
//
//! \addtogroup cpu01_example_list
//! <H1>CAN外部环回(CAN_Loopback)</H1>
//!
//! 此示例显示了CAN的基本设置,以便传输和接收
//! CAN总线上的信息。 CAN外围设备配置为传输
//! 具有特定CAN ID的消息。 然后,每传输一次消息
//! 其次,使用简单的延迟回路进行计时。 发送的消息为
//! 包含递增模式的4字节消息。 CAN中断
//! handler用于确认消息传输并计算的数量
//! 已发送的邮件。
//!
//! 本示例将CAN控制器设置为外部环回测试模式。
//! 传输的数据在CAN0TX引脚上可见,可通过接收
//! 适当的邮箱配置。
//!
//
//###################################################################
//$TI发行版:F2837xD支持库V200 $
//$发布日期:星期二六月21 13:00:02 CDT 2016 $
//$Copyright:版权所有(C) 2013-2016 Texas2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//###################################################################
//
//包含的文件
//
#include "F28x_Project.h"
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/HW_CAN.h"
#include "driverlib/can.h"
//
//全局
//
volatile unsigned long g_ulMsgCount =0;//跟踪的计数器
//传输的次数
//成功。
volatile unsigned long g_bErrFlag =0;//指示某些的标志
//发生传输错误。
//
//主菜单
//
内部
主(无效)
{
tCANMsgObject sTXCANMessage;
tCANMsgObject sRXCANMessage;
unsigned char ucTXMsgData[4],ucRXMsgData[4];
//
//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数可在F2837xD_sysctrl.c文件中找到。
//
InitSysCtrl();
//
//步骤2. 初始化GPIO:
//此示例函数可在F2837xD_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
//
伊尼特·格皮奥();
GPIO_SetupPinMux (30,GPIO _MUX_CPU1,1);//GPIO30 - CANRXA
GPIO_SetupPinMux (31,GPIO _MUX_CPU1,1);//GPIO31 - CANTXA
GPIO设置PIN选项(30,GPIO输入,GPIO _异步);
GPIO设置引脚选项(31,GPIO输出,GPIO推送);
//
//初始化CAN控制器
//
CANInit (Cana_base);
//
//可以为设置计时,使M3/主子系统时钟不工作
//
CANClkSourceSelect(Cana_base, 0);
//
//设置CAN总线的比特率。 此功能设置CAN
//额定配置的总线定时。 您可以实现更多的控制
//通过CAN总线定时,改为使用函数CANBitTimingSet()
//(如果需要)。
//在本例中,CAN总线设置为500 kHz。 在下面的函数中,
//调用SysCltlClockGatet()用于确定其时钟速率
//用于为CAN外围设备计时。 这可以替换为
//固定值(如果知道系统时钟的值),保存额外的值
//函数调用。 对于某些零件,CAN外围设备由固定的计时器计时
// 8 MHz,无论系统时钟如何,在这种情况下,呼叫
// SysClockCatlockGatet()应替换为800万。 查阅数据
//表,了解有关CAN外围设备时钟的更多信息。
//
CANBitRateSet(Cana_base, 2亿, 50万);
//
//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
//
色调;
//
//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于F2837xD_PIECTRL.c文件中。
//
InitPieCtrl();
//
//禁用CPU中断并清除所有CPU中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程位于F2837xD_DefaultIsr.C.中
//此函数位于F2837xD_PieVect.C.中
//
InitPieVectorTable();
//
//启用测试模式并选择外部回送
//
//HWREG (Cana_base + CAN_O_CTL)|= CAN_CTL_TEST;
HWREG (Cana_base + CAN_O_TEST)= CAN_TEST_EXL;
//
//启用CAN以进行操作。
//
CANEnable (Cana_base);
//
//初始化将用于接收CAN的消息对象
//消息。
//
*(unsigned long *) ucRXMsgData = 0;
sRXCANMessage.ui32MsgID = 1;// CAN消息ID -使用1
sRXCANMessage.ui32MsgIDMask = 0;// TX不需要掩码
sRXCANMessage.ui32Flags = MSG_OBJ_NO_FLAGS;
sRXCANMessage.ui32MsgLen = sizeof(RXucMsgData);//邮件大小为4
sRXCANMessage.pucMsgData = ucRXMsgData;// ptr至邮件内容
//
//设置用于接收消息的消息对象
//
CANMessageSet (Cana_base,2,&sRXCANMessage,MSG_OBJ_TYPE_RX);
while (1)// info:将此部分放在MCU能够运行功能的程序的一部分中
{//可能会导致故障
faultOccured = OtherMCUFunction1();// info:如果MCU中发生故障,将返回该函数
faultcode = OtherMCUFunction2();// info:这将是确定故障代码的功能
RestOfMCUFunctions();
:
:
:
TransmitAndMonitorFault();// info:这将调用CAN函数以传输和接收故障
}
}
TransmitAndMonitorFault()
{
//
//使用对象编号1发送CAN消息(与
// CAN ID,在本例中也是1)。 此功能将导致
//要立即传输的消息。
//
IF (FaultOccured)// INFO:如果发生故障,MCU将变量设置为true,仅在发生故障时传输
{
//
//初始化将用于发送CAN的消息对象
//消息。 消息将为4个字节,其中包含增量
//值。 最初它将被设置为0。
//
*(unsigned long *) ucTXMsgData = faultCode;// info:分配要传输的故障代码
sTXCANMessage.ui32MsgID = MCUID;// INFO:为每个MCU分配唯一ID,以便您知道谁在传输故障
sTXCANMessage.ui32MsgIDMask = 0;// TX不需要掩码
sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;//在TX上启用中断
sTXCANMessage.ui32MsgLen = sizeof(ucTXMsgData);//邮件大小为4
sTXCANMessage.pucMsgData = ucTXMsgData;// PTR到消息内容
CANMessageSet (Cana_base,1,&sTXCANMessage,MSG_OBJ_TYPE_TX);
//
//现在等待1秒钟,然后继续
//
DELAY _US(1000*1000);</s>1000
}
//
//获取接收消息
//
CANMessageGet (Cana_base,1,&sRXCANMessage,TRUE);
//传输故障的MCU将把ID存储在sRXCANMessage.ui32MsgID中
//故障代码将在rxMsgData中可用
}
//
//文件结束
//