Matlab版本:MatlabR2016b
开发板:AC7811QBFE开发板
直接上模型(Motorola_Creat_Signal模块为自定义模块用于解析Motorola格式的CAN报文,模块内部根据StartBit进入不同的分支再结合Length、Factor进行移位等算术运算):
模型的功能:从底层输入Test_Msg报文,解析后将结果输出给底层。
CAN报文的DBC文件如下:
首先配置Simulink的解算器Solver
选择定步长(基础采样时间设置为0.1S)解算器算法选用离散算法。
再配置下Code Generation
系统生成目标文件选择ert.tlc(Embedded Coder)。
Build之后会生成test_ert_rtw文件夹(因为模型文件名为test.slx),将该文件夹拷贝至Keil工程根目录下。
在Keil中进行设置(C/C++包含路径),随后将test.c和test_data.c文件加入工程。
打开test.c和test.h文件查看模型的输入输出量。
在底层CAN中断中调用。
else if(RxMessage_Can1.IDE == 1)
{
if(RxMessage_Can1.ID == TEST_ADDRESS_1801FF33)
{
Can_Rec_Test_Frame_Flag = 1;
test_U.Test_Msg[0] = (uint8_t) RxMessage_Can1.Data[0];
test_U.Test_Msg[1] = (uint8_t) RxMessage_Can1.Data[1];
test_U.Test_Msg[2] = (uint8_t) RxMessage_Can1.Data[2];
test_U.Test_Msg[3] = (uint8_t) RxMessage_Can1.Data[3];
test_U.Test_Msg[4] = (uint8_t) RxMessage_Can1.Data[4];
test_U.Test_Msg[5] = (uint8_t) RxMessage_Can1.Data[5];
test_U.Test_Msg[6] = (uint8_t) RxMessage_Can1.Data[6];
test_U.Test_Msg[7] = (uint8_t) RxMessage_Can1.Data[7];
//Debug_Frame_Management();
test_step();
send_can_message_task2();
}
}
test_step函数定义在test.c中即模型中Motorola_Creat_Signal模块执行的解析功能。然后将解析后的数据还原作为响应报文在中断中发送。
extern void send_can_message_task2(void)
{
if(Can_Rec_Test_Frame_Flag ==1)
{
uint8_t i = 0;
TxMessage.ID = ACK_TEST_ADDRESS_1801FF66;
TxMessage.RTR = 0;
TxMessage.IDE = 1;
TxMessage.DLC = 8;
TxMessage.Data[i++] = test_Y.Test_Enable;
TxMessage.Data[i++] = ((test_Y.Test_Vol * 10) >> 8) & 0xFF;
TxMessage.Data[i++] = (test_Y.Test_Vol * 10) & 0xFF;
TxMessage.Data[i++] = (((test_Y.Test_Curr + 300) * 100) >> 8 ) & 0xFF;
TxMessage.Data[i++] = ((test_Y.Test_Curr + 300) * 100) & 0xFF;;
TxMessage.Data[i++] = 0;
TxMessage.Data[i++] = 0;
TxMessage.Data[i++] = 0;
if(CAN_MessageSend(CAN1, &TxMessage, TRANSMIT_SECONDARY) != 0)
{
}
Can_Rec_Test_Frame_Flag = 0;
}
}
效果:
————————————————
版权声明:本文为CSDN博主「无名小屁喵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46099600/article/details/125772895
|