added motor test code as starting point
This commit is contained in:
parent
f2a99ede08
commit
1a690a3722
|
@ -1,3 +1,6 @@
|
||||||
|
# Custom stuffs
|
||||||
|
.vscode
|
||||||
|
|
||||||
# ---> C
|
# ---> C
|
||||||
# Prerequisites
|
# Prerequisites
|
||||||
*.d
|
*.d
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
|
||||||
|
This directory is intended for project header files.
|
||||||
|
|
||||||
|
A header file is a file containing C declarations and macro definitions
|
||||||
|
to be shared between several project source files. You request the use of a
|
||||||
|
header file in your project source file (C, C++, etc) located in `src` folder
|
||||||
|
by including it, with the C preprocessing directive `#include'.
|
||||||
|
|
||||||
|
```src/main.c
|
||||||
|
|
||||||
|
#include "header.h"
|
||||||
|
|
||||||
|
int main (void)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Including a header file produces the same results as copying the header file
|
||||||
|
into each source file that needs it. Such copying would be time-consuming
|
||||||
|
and error-prone. With a header file, the related declarations appear
|
||||||
|
in only one place. If they need to be changed, they can be changed in one
|
||||||
|
place, and programs that include the header file will automatically use the
|
||||||
|
new version when next recompiled. The header file eliminates the labor of
|
||||||
|
finding and changing all the copies as well as the risk that a failure to
|
||||||
|
find one copy will result in inconsistencies within a program.
|
||||||
|
|
||||||
|
In C, the usual convention is to give header files names that end with `.h'.
|
||||||
|
It is most portable to use only letters, digits, dashes, and underscores in
|
||||||
|
header file names, and at most one dot.
|
||||||
|
|
||||||
|
Read more about using header files in official GCC documentation:
|
||||||
|
|
||||||
|
* Include Syntax
|
||||||
|
* Include Operation
|
||||||
|
* Once-Only Headers
|
||||||
|
* Computed Includes
|
||||||
|
|
||||||
|
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
|
@ -0,0 +1,14 @@
|
||||||
|
; PlatformIO Project Configuration File
|
||||||
|
;
|
||||||
|
; Build options: build flags, source filter
|
||||||
|
; Upload options: custom upload port, speed and extra flags
|
||||||
|
; Library options: dependencies, extra library storages
|
||||||
|
; Advanced options: extra scripting
|
||||||
|
;
|
||||||
|
; Please visit documentation for the other options and examples
|
||||||
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
|
[env:teensy40]
|
||||||
|
platform = teensy
|
||||||
|
board = teensy40
|
||||||
|
framework = arduino
|
|
@ -0,0 +1,393 @@
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <FlexCAN_T4.h>
|
||||||
|
|
||||||
|
/*CODE BY TIM VAN HAUWERMEIREN 2022*/
|
||||||
|
/*SLIGHT CHANGES BY NIELS DANZON 2023*/
|
||||||
|
|
||||||
|
#define FILTER_ID -1
|
||||||
|
/*
|
||||||
|
0: ERPM, Duty Cycle, Input Voltage
|
||||||
|
1: AC Current, DC Current
|
||||||
|
2: Controller temperature, Motor temperature, Fault code
|
||||||
|
3: Id, Iq
|
||||||
|
4: Throttle Signal, Brake Signal, DI1, DI2, DI3, DI4, DO1, DO2, DO3, DO4, Drive Enable, Capacitor Temp Limit, DC Current Limit,
|
||||||
|
Drive Enable Limit, IGBT Acceleration Temp Limit, IGBT Temp Limit, Input Voltage Limit, Motor Acceleration Temp Limit, Motor Temp Limit, RPM Min Limit, RPM Max Limit, Power Limit
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Pin Declaration
|
||||||
|
#define AnalogIn 17
|
||||||
|
#define statusLED 13
|
||||||
|
#define AnalogAct 12
|
||||||
|
#define ManualAct 11
|
||||||
|
#define Stop 10
|
||||||
|
|
||||||
|
//Set Speed value used in Set Mode
|
||||||
|
#define setSpeed 500
|
||||||
|
|
||||||
|
//Function Declaration
|
||||||
|
void printMessage(const CAN_message_t *); // function for writing to the terminal
|
||||||
|
void setupCan();
|
||||||
|
void sendEnable(); // function to turn the inverter on DON'T FORGET TO EDIT THE ID OF THE DRIVE
|
||||||
|
void sendERPM(); // function to change the speed DON'T FORGET TO EDIT THE ID OF THE DRIVE
|
||||||
|
void calculateSpeed();
|
||||||
|
void blinkLED();
|
||||||
|
|
||||||
|
//Variable Declaration
|
||||||
|
uint64_t time_last_update;
|
||||||
|
uint64_t time_last_update_can;
|
||||||
|
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> Can0;
|
||||||
|
elapsedMillis sinceSpeedUpdate; // counter voor snelheidssignaal
|
||||||
|
long speed;
|
||||||
|
bool analog = false;
|
||||||
|
bool manual = false;
|
||||||
|
bool stop = false;
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// put your setup code here, to run once:
|
||||||
|
setupCan();
|
||||||
|
pinMode(statusLED, OUTPUT);
|
||||||
|
pinMode(AnalogIn, INPUT);
|
||||||
|
pinMode(AnalogAct, INPUT_PULLUP);
|
||||||
|
pinMode(ManualAct, INPUT_PULLUP);
|
||||||
|
pinMode(Stop, INPUT_PULLUP);
|
||||||
|
Serial.print("Over 5 sec: test starten");
|
||||||
|
delay(5000); // 5 seconden wachten
|
||||||
|
|
||||||
|
// onderstaande code geschreven door Niels Danzon (nog niet getest dus als het niet werkt aanpassen of die van Tim gebruiken)
|
||||||
|
speed = 1000; // Set ERPM=RPM*number of poles --> RPM = ERPM/10 (for emrax 208)
|
||||||
|
sendERPM();
|
||||||
|
sinceSpeedUpdate = 0;
|
||||||
|
while (speed <= 50000)
|
||||||
|
{
|
||||||
|
sendERPM();
|
||||||
|
if (sinceSpeedUpdate >= 2000)
|
||||||
|
{
|
||||||
|
sinceSpeedUpdate = 0;
|
||||||
|
speed += 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* OLD CODE BY TIM VAN HAUWERMEIREN:
|
||||||
|
problem with code is that it constantly accelerates and deaccelerates the motor because of the delay between the commands
|
||||||
|
|
||||||
|
delay(10000);
|
||||||
|
speed = 1000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 2000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 3000;
|
||||||
|
sendERPM();
|
||||||
|
speed = 4000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 5000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 6000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 7000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 8000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 9000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 10000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 11000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 12000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 13000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 14000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 15000;
|
||||||
|
sendERPM();
|
||||||
|
speed = 16000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 17000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 18000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 19000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 20000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 21000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 22000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 23000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 24000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 25000;
|
||||||
|
sendERPM();
|
||||||
|
speed = 26000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 27000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 28000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 29000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 30000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 31000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 32000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 33000;
|
||||||
|
sendERPM();
|
||||||
|
speed = 34000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 35000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 36000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 37000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 38000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 39000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 40000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 41000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 41500;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 42000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 42500;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 43000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 43500;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 44000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 44500;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 45000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 46000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 47000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 48000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 49000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);
|
||||||
|
speed = 50000;
|
||||||
|
sendERPM();
|
||||||
|
delay(2000);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() { // no idea if this is still needed with the new code (I don't know C++)
|
||||||
|
// Wait Loop
|
||||||
|
while(!(analog || manual)){
|
||||||
|
stop = false;
|
||||||
|
//calculateSpeed();
|
||||||
|
|
||||||
|
speed = 50000;
|
||||||
|
sendERPM();
|
||||||
|
//delay(500);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//blinkLED();
|
||||||
|
if(digitalRead(AnalogAct)){
|
||||||
|
analog = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
analog = true;
|
||||||
|
Serial.print("Analog Mode\n");
|
||||||
|
}
|
||||||
|
if(digitalRead(ManualAct)){
|
||||||
|
manual = false;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
manual = true;
|
||||||
|
Serial.print("Manual Mode\n");
|
||||||
|
}
|
||||||
|
Serial.print("Waiting\n");
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Analog Mode
|
||||||
|
while(analog){
|
||||||
|
calculateSpeed();
|
||||||
|
sendERPM();
|
||||||
|
if(digitalRead(Stop)){
|
||||||
|
analog = true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
analog = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//Set Mode
|
||||||
|
while(manual){
|
||||||
|
speed = 500;
|
||||||
|
sendERPM();
|
||||||
|
if(digitalRead(Stop)){
|
||||||
|
manual = true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
manual = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printMessage(const CAN_message_t &msg) {
|
||||||
|
/*This function is called when a CAN message is received via the CAN bus. The message will be printed to the Serial for debugging purposes.
|
||||||
|
:param msg: Received Can message
|
||||||
|
:type msg: CAN_message_t
|
||||||
|
:return: void
|
||||||
|
:rtype: void
|
||||||
|
*/
|
||||||
|
Serial.println("test");
|
||||||
|
if(msg.id == FILTER_ID || FILTER_ID == -1){
|
||||||
|
Serial.print("MB "); Serial.print(msg.mb);
|
||||||
|
Serial.print(" LEN: "); Serial.print(msg.len);
|
||||||
|
Serial.print(" TS: "); Serial.print(msg.timestamp);
|
||||||
|
Serial.print(" ID: "); Serial.print(msg.id, HEX);
|
||||||
|
Serial.print(" Buffer: ");
|
||||||
|
for ( uint8_t i = 0; i < msg.len; i++ ) {
|
||||||
|
Serial.print(msg.buf[i]); Serial.print(" ");
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setupCan() {
|
||||||
|
/*Initialize all CAN elements
|
||||||
|
:return: void
|
||||||
|
:rtype: void
|
||||||
|
*/
|
||||||
|
Serial.begin(115200);
|
||||||
|
delay(400);
|
||||||
|
//Set up the clock and controller
|
||||||
|
Can0.begin();
|
||||||
|
//Set the symbol datarate to 1.000.000, TODO check max value
|
||||||
|
Can0.setBaudRate(500000);
|
||||||
|
//Set the maximal amount of MailBox'es (MB), an MB is a single buffer for a specific message type
|
||||||
|
//For transmitting frames on the CAN bus you can put them into a mailbox and they'll be scheduled to be sent when possible.
|
||||||
|
//Each mailbox is set either as a transmission or reception box.
|
||||||
|
Can0.setMaxMB(16);
|
||||||
|
// Enable FIFO, allows more than one instance of the same message to be stored before the CPU is interrupted
|
||||||
|
// therefore preventing any information loss for high frequency messages
|
||||||
|
Can0.enableFIFO();
|
||||||
|
// This allows frames to be interrupt driven rather than polling them in the loop.
|
||||||
|
Can0.enableFIFOInterrupt();
|
||||||
|
Can0.onReceive(printMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ID bij ons was 79 = 0x4F
|
||||||
|
|
||||||
|
void sendEnable() {
|
||||||
|
CAN_message_t msg_DriveEnable;
|
||||||
|
msg_DriveEnable.flags.extended = 1;
|
||||||
|
msg_DriveEnable.id = 0x24 << 8 | 0x4F; // INVERTER ID INSTELLEN VOLGENS VOLGEND FORMAT: 0x24 << 8 | 0x"ID"
|
||||||
|
msg_DriveEnable.buf[0] = 1;
|
||||||
|
msg_DriveEnable.buf[1] = 255;
|
||||||
|
msg_DriveEnable.buf[2] = 0xFF;
|
||||||
|
msg_DriveEnable.buf[3] = 0xFF;
|
||||||
|
msg_DriveEnable.buf[4] = 0xFF;
|
||||||
|
msg_DriveEnable.buf[5] = 0xFF;
|
||||||
|
msg_DriveEnable.buf[6] = 0xFF;
|
||||||
|
msg_DriveEnable.buf[7] = 0xFF;
|
||||||
|
Can0.write(msg_DriveEnable);
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void sendERPM() {
|
||||||
|
if ( millis() - time_last_update_can > 100 ) {
|
||||||
|
|
||||||
|
sendEnable();
|
||||||
|
Serial.print("Enable");
|
||||||
|
|
||||||
|
CAN_message_t msg_ERPM;
|
||||||
|
msg_ERPM.flags.extended = 1;
|
||||||
|
msg_ERPM.id = 0x1C << 8 | 0x4F; // INVERTER ID INSTELLEN VOLGENS VOLGEND FORMAT: 0x1C << 8 | 0x"ID"
|
||||||
|
msg_ERPM.buf[0] = (speed >> 24);
|
||||||
|
msg_ERPM.buf[1] = (speed >> 16) & 0xFF;
|
||||||
|
msg_ERPM.buf[2] = (speed >> 8) & 0xFF;
|
||||||
|
msg_ERPM.buf[3] = speed & 0xFF;
|
||||||
|
Can0.write(msg_ERPM);
|
||||||
|
Serial.println("ERPM");
|
||||||
|
printMessage(msg_ERPM);
|
||||||
|
time_last_update_can = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void calculateSpeed(){
|
||||||
|
uint64_t analogSpeed = analogRead(AnalogIn);
|
||||||
|
|
||||||
|
speed = map(analogSpeed, 0, 1023, 0, 45000);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void blinkLED(){
|
||||||
|
digitalWrite(statusLED, HIGH);
|
||||||
|
delay(500);
|
||||||
|
digitalWrite(statusLED, LOW);
|
||||||
|
delay(500);
|
||||||
|
}
|
Loading…
Reference in New Issue