| User | Revision | Line number | New contents of line |
| TzuChingChen |
0:654bd6e4a0f9
|
1
|
#include "mbed.h"
|
| TzuChingChen |
0:654bd6e4a0f9
|
2
|
#include "main.h"
|
| TzuChingChen |
0:654bd6e4a0f9
|
3
|
#include <stdint.h>
|
| TzuChingChen |
0:654bd6e4a0f9
|
4
|
#include <math.h>
|
| TzuChingChen |
0:654bd6e4a0f9
|
5
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
6
|
/*
|
| TzuChingChen |
0:654bd6e4a0f9
|
7
|
* IO pins declaration
|
| TzuChingChen |
0:654bd6e4a0f9
|
8
|
*/
|
| TzuChingChen |
0:654bd6e4a0f9
|
9
|
AnalogIn Trq_raw(PC_1);
|
| TzuChingChen |
0:654bd6e4a0f9
|
10
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
11
|
/*
|
| TzuChingChen |
0:654bd6e4a0f9
|
12
|
* Mbed Objects declaration
|
| TzuChingChen |
0:654bd6e4a0f9
|
13
|
*/
|
| TzuChingChen |
0:654bd6e4a0f9
|
14
|
Serial pc(USBTX, USBRX, 115200);
|
| TzuChingChen |
0:654bd6e4a0f9
|
15
|
CAN can1(PB_8, PB_9, 1000000); //1Mbps, contain critical torque command message
|
| TzuChingChen |
0:654bd6e4a0f9
|
16
|
Ticker ticker1; //100Hz task
|
| TzuChingChen |
0:654bd6e4a0f9
|
17
|
CANMessage can_msg_Rx;
|
| TzuChingChen |
0:654bd6e4a0f9
|
18
|
CANMessage can_msg_Tx;
|
| TzuChingChen |
0:654bd6e4a0f9
|
19
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
20
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
21
|
//Timers
|
| TzuChingChen |
0:654bd6e4a0f9
|
22
|
void timer1_interrupt(void)
|
| TzuChingChen |
0:654bd6e4a0f9
|
23
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
24
|
HSTick += 1;
|
| TzuChingChen |
0:654bd6e4a0f9
|
25
|
LSTick += 1;
|
| TzuChingChen |
0:654bd6e4a0f9
|
26
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
27
|
if (HSTick > 9) // 100Hz
|
| TzuChingChen |
0:654bd6e4a0f9
|
28
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
29
|
HST_EXFL = 1;
|
| TzuChingChen |
0:654bd6e4a0f9
|
30
|
HSTick = 0;
|
| TzuChingChen |
0:654bd6e4a0f9
|
31
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
32
|
if (LSTick > 99) // 10Hz
|
| TzuChingChen |
0:654bd6e4a0f9
|
33
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
34
|
LST_EXFL = 1;
|
| TzuChingChen |
0:654bd6e4a0f9
|
35
|
LSTick = 0;
|
| TzuChingChen |
0:654bd6e4a0f9
|
36
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
37
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
38
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
39
|
int main()
|
| TzuChingChen |
0:654bd6e4a0f9
|
40
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
41
|
// Initializing
|
| TzuChingChen |
0:654bd6e4a0f9
|
42
|
printf("Motor_upper_control starts up\n");
|
| TzuChingChen |
0:654bd6e4a0f9
|
43
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
44
|
//Init CAN network
|
| TzuChingChen |
0:654bd6e4a0f9
|
45
|
CAN_init(); // Note now in Gloable test mode only for testing 2019/11/17
|
| TzuChingChen |
0:654bd6e4a0f9
|
46
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
47
|
//attach IRQs after all other things are ready
|
| TzuChingChen |
0:654bd6e4a0f9
|
48
|
ticker1.attach_us(&timer1_interrupt, 1000); //1 ms Systick
|
| TzuChingChen |
0:654bd6e4a0f9
|
49
|
while(1) {
|
| TzuChingChen |
0:654bd6e4a0f9
|
50
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
51
|
if(HST_EXFL) {
|
| TzuChingChen |
0:654bd6e4a0f9
|
52
|
HST_EXFL = false;
|
| TzuChingChen |
0:654bd6e4a0f9
|
53
|
// pc.printf("High speed says hi! \n");
|
| TzuChingChen |
0:654bd6e4a0f9
|
54
|
Tx_High_CAN1();
|
| TzuChingChen |
0:654bd6e4a0f9
|
55
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
56
|
if(LST_EXFL) {
|
| TzuChingChen |
0:654bd6e4a0f9
|
57
|
LST_EXFL = false;
|
| TzuChingChen |
0:654bd6e4a0f9
|
58
|
// pc.printf("Low speed says hi! \n");
|
| TzuChingChen |
0:654bd6e4a0f9
|
59
|
printf("Torque read: %.1f ", float(Trq_raw));
|
| TzuChingChen |
0:654bd6e4a0f9
|
60
|
Tx_Low_CAN1();
|
| TzuChingChen |
0:654bd6e4a0f9
|
61
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
62
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
63
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
64
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
65
|
void CAN_init(void)
|
| TzuChingChen |
0:654bd6e4a0f9
|
66
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
67
|
//Set CAN system
|
| TzuChingChen |
0:654bd6e4a0f9
|
68
|
SET_BIT(CAN1->MCR, CAN_MCR_ABOM); // Enable auto reboot after bus off
|
| TzuChingChen |
0:654bd6e4a0f9
|
69
|
// can1.filter(Trq_send_ID,0xFFFF,CANStandard,0); // ID filter listing mode
|
| TzuChingChen |
0:654bd6e4a0f9
|
70
|
// can1.filter(Id_cmd_ID,0xFFFF,CANStandard,1);
|
| TzuChingChen |
0:654bd6e4a0f9
|
71
|
// can1.filter(Iq_cmd_ID,0xFFFF,CANStandard,2);
|
| TzuChingChen |
0:654bd6e4a0f9
|
72
|
// can1.mode(CAN::GlobalTest); // Add only for testing 2019/11/13
|
| TzuChingChen |
0:654bd6e4a0f9
|
73
|
can1.attach(&Rx_CAN1, CAN::RxIrq); // CAN1 Recieve Irq
|
| TzuChingChen |
0:654bd6e4a0f9
|
74
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
75
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
76
|
void Rx_CAN1(void)
|
| TzuChingChen |
0:654bd6e4a0f9
|
77
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
78
|
// LED = 1;
|
| TzuChingChen |
0:654bd6e4a0f9
|
79
|
int16_t tmp;
|
| TzuChingChen |
0:654bd6e4a0f9
|
80
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
81
|
if(can1.read(can_msg_Rx)) {
|
| TzuChingChen |
0:654bd6e4a0f9
|
82
|
// switch(can_msg_Rx.id) { //Filtered input message
|
| TzuChingChen |
0:654bd6e4a0f9
|
83
|
// Start of 100Hz msg
|
| TzuChingChen |
0:654bd6e4a0f9
|
84
|
// case Some_ID://1
|
| TzuChingChen |
0:654bd6e4a0f9
|
85
|
// //HSB from FL motor drive
|
| TzuChingChen |
0:654bd6e4a0f9
|
86
|
// Something1 = can_msg_Rx.data[6] & 0x03; //Get DSM_STAT
|
| TzuChingChen |
0:654bd6e4a0f9
|
87
|
// tmp = can_msg_Rx.data[5] << 8 | can_msg_Rx.data[4];
|
| TzuChingChen |
0:654bd6e4a0f9
|
88
|
// Something2 = tmp*1.0f;
|
| TzuChingChen |
0:654bd6e4a0f9
|
89
|
// tmp = can_msg_Rx.data[3] << 8 | can_msg_Rx.data[2];
|
| TzuChingChen |
0:654bd6e4a0f9
|
90
|
// Something3 = tmp * 0.01f;
|
| TzuChingChen |
0:654bd6e4a0f9
|
91
|
// tmp = can_msg_Rx.data[1] << 8 | can_msg_Rx.data[0];
|
| TzuChingChen |
0:654bd6e4a0f9
|
92
|
// Something4 = tmp * 0.01f;
|
| TzuChingChen |
0:654bd6e4a0f9
|
93
|
// break;
|
| TzuChingChen |
0:654bd6e4a0f9
|
94
|
// }
|
| TzuChingChen |
0:654bd6e4a0f9
|
95
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
96
|
// LED = 0;
|
| TzuChingChen |
0:654bd6e4a0f9
|
97
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
98
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
99
|
void Tx_High_CAN1(void) // 100 Hz
|
| TzuChingChen |
0:654bd6e4a0f9
|
100
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
101
|
int16_t tmp;
|
| TzuChingChen |
0:654bd6e4a0f9
|
102
|
tmp = (int16_t) (Id_cmd * 100.0f);
|
| TzuChingChen |
0:654bd6e4a0f9
|
103
|
temp_msg[0] = tmp;
|
| TzuChingChen |
0:654bd6e4a0f9
|
104
|
temp_msg[1] = tmp >> 8U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
105
|
temp_msg[2] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
106
|
tmp = (int16_t) (Iq_cmd * 100.0f);
|
| TzuChingChen |
0:654bd6e4a0f9
|
107
|
temp_msg[3] = tmp;
|
| TzuChingChen |
0:654bd6e4a0f9
|
108
|
temp_msg[4] = tmp >> 8U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
109
|
temp_msg[5] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
110
|
temp_msg[6] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
111
|
temp_msg[7] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
112
|
can_msg_Tx = CANMessage(Trq_send_ID,temp_msg,8,CANData,CANStandard);
|
| TzuChingChen |
0:654bd6e4a0f9
|
113
|
CANpendTX();
|
| TzuChingChen |
0:654bd6e4a0f9
|
114
|
can1.write(can_msg_Tx);
|
| TzuChingChen |
0:654bd6e4a0f9
|
115
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
116
|
|
| TzuChingChen |
0:654bd6e4a0f9
|
117
|
void Tx_Low_CAN1(void) // 10 Hz
|
| TzuChingChen |
0:654bd6e4a0f9
|
118
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
119
|
int16_t tmp;
|
| TzuChingChen |
0:654bd6e4a0f9
|
120
|
tmp = (int16_t) (Trq_send * 100.0f);
|
| TzuChingChen |
0:654bd6e4a0f9
|
121
|
temp_msg[0] = tmp;
|
| TzuChingChen |
0:654bd6e4a0f9
|
122
|
temp_msg[1] = tmp >> 8U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
123
|
temp_msg[2] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
124
|
temp_msg[3] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
125
|
temp_msg[4] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
126
|
temp_msg[5] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
127
|
temp_msg[6] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
128
|
temp_msg[7] = 0U;
|
| TzuChingChen |
0:654bd6e4a0f9
|
129
|
can_msg_Tx = CANMessage(Trq_send_ID,temp_msg,8,CANData,CANStandard);
|
| TzuChingChen |
0:654bd6e4a0f9
|
130
|
CANpendTX();
|
| TzuChingChen |
0:654bd6e4a0f9
|
131
|
can1.write(can_msg_Tx);
|
| TzuChingChen |
0:654bd6e4a0f9
|
132
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
133
|
void CANpendTX(void)
|
| TzuChingChen |
0:654bd6e4a0f9
|
134
|
{
|
| TzuChingChen |
0:654bd6e4a0f9
|
135
|
//Pend till TX box has empty slot, timeout will generate error
|
| TzuChingChen |
0:654bd6e4a0f9
|
136
|
uint32_t timeout = 0;
|
| TzuChingChen |
0:654bd6e4a0f9
|
137
|
while(!(CAN1->TSR & CAN_TSR_TME_Msk)) {
|
| TzuChingChen |
0:654bd6e4a0f9
|
138
|
//Wait till non empty
|
| TzuChingChen |
0:654bd6e4a0f9
|
139
|
timeout += 1;
|
| TzuChingChen |
0:654bd6e4a0f9
|
140
|
if(timeout > 10000) {
|
| TzuChingChen |
0:654bd6e4a0f9
|
141
|
// Put some timeout error handler
|
| TzuChingChen |
0:654bd6e4a0f9
|
142
|
break;
|
| TzuChingChen |
0:654bd6e4a0f9
|
143
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
144
|
}
|
| TzuChingChen |
0:654bd6e4a0f9
|
145
|
} |