Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed_amf_controlsystem by
Revision 0:8a6003b8bb5b, committed 2016-02-03
- Comitter:
- mborchers
- Date:
- Wed Feb 03 17:19:21 2016 +0000
- Child:
- 1:7eddde9fba60
- Commit message:
- Erster Commit
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Misc/SystemTimer.cpp Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,33 @@
+#include <Misc/SystemTimer.h>
+
+
+SystemTimer::SystemTimer(){
+
+ systemUptimeMillis = 0;
+
+ systemTicker.attach_us(this,&SystemTimer::systemTickerHandler,1000);
+
+}
+
+void SystemTimer::systemTickerHandler(){
+
+ systemUptimeMillis++;
+
+}
+
+
+uint64_t SystemTimer::getUptimeMillis(){
+ return systemUptimeMillis;
+}
+
+
+bool SystemTimer::isTimeoutPassed(uint64_t *timestampMillis, uint32_t timeoutMillis){
+
+ if((systemUptimeMillis - *timestampMillis) > timeoutMillis){
+ *timestampMillis = systemUptimeMillis;
+ return true;
+ }else{
+ return false;
+ }
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Misc/SystemTimer.h Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,29 @@
+#ifndef SYSTEMTIMER_H_
+#define SYSTEMTIMER_H_
+
+#include "mbed.h"
+
+class SystemTimer {
+
+private:
+
+ uint64_t systemUptimeMillis;
+
+ Ticker systemTicker;
+
+public:
+
+ SystemTimer();
+
+ void systemTickerHandler();
+
+ uint64_t getUptimeMillis();
+
+ bool isTimeoutPassed(uint64_t *timestampMillis, uint32_t timeoutMillis);
+
+
+};
+
+
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Periphery/SupportSystem.cpp Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,265 @@
+#include <Periphery/SupportSystem.h>
+
+
+SupportSystem::SupportSystem(){
+
+ init(0,0);
+
+ transmissionErrorCount = 0;
+ lightManagerCommand = 0;
+}
+
+SupportSystem::SupportSystem(uint8_t i2cAddress, I2C *i2c){
+
+ init(i2cAddress, i2c);
+
+ transmissionErrorCount = 0;
+ lightManagerCommand = 0;
+}
+
+void SupportSystem::init(uint8_t i2cAddress, I2C *i2c){
+
+ this->i2cAddress = i2cAddress;
+ this->i2c = i2c;
+
+}
+
+
+
+void SupportSystem::readData(uint8_t registerAddress, void *buffer, size_t length){
+
+
+ i2c->write(i2cAddress,(const char*)®isterAddress,sizeof(uint8_t),false);
+ i2c->read(i2cAddress,(char*)buffer,length,false);
+
+}
+
+void SupportSystem::writeData(uint8_t registerAddress, void *buffer, size_t length){
+
+
+ i2c->start();
+
+
+ if(!i2c->write(i2cAddress & 0xfe)){
+ i2c->stop();
+ return;
+ }
+
+ if(!i2c->write(registerAddress)){
+ i2c->stop();
+ return;
+ }
+
+ for(uint32_t i=0; i<length; i++){
+ if(!i2c->write(*((uint8_t*)buffer))){
+ *(uint8_t*)buffer += 1;
+ i2c->stop();
+ return;
+ }
+ }
+
+ i2c->stop();
+
+
+}
+
+
+uint16_t SupportSystem::crc16_update(uint16_t crc, uint8_t a) {
+ int i;
+
+ crc ^= a;
+ for (i = 0; i < 8; ++i) {
+ if (crc & 1)
+ crc = (crc >> 1) ^ 0xA001;
+ else
+ crc = (crc >> 1);
+ }
+
+ return crc;
+}
+
+uint16_t SupportSystem::generateChecksum(void *data, size_t len){
+
+ uint16_t i, crc = 0;
+
+ char *baseAddress = (char*)(data);
+
+ for(i=0;i<len;i++){
+ char c = baseAddress[i];
+ crc = crc16_update(crc, c);
+ }
+
+ return crc;
+
+}
+
+uint32_t SupportSystem::getTransmissionErrorCount(){
+ return transmissionErrorCount;
+}
+
+/************************************************************
+ *
+ * Maintenance
+ *
+ ***********************************************************/
+
+uint32_t SupportSystem::readMaintenanceUptimeMillis(){
+
+ uint32_t uptimeMillis;
+
+ readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_UPTIME,(void*)&uptimeMillis,sizeof(uint32_t));
+
+ return uptimeMillis;
+}
+
+/************************************************************
+ *
+ * IMU
+ *
+ ***********************************************************/
+
+//float SupportSystem::readImuDistanceX(){
+//
+// float traveledDistance;
+//
+// readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_DISTANCE_X,(void*)&traveledDistance,sizeof(float));
+//
+// return traveledDistance;
+//
+//}
+//
+//
+//void SupportSystem::writeImuCommandResetDistanceX(){
+//
+// uint8_t command = (1<<1);
+//
+// writeData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMMAND,(void*)&command,sizeof(uint8_t));
+//
+//}
+
+
+IMU_RegisterDataBuffer_t *SupportSystem::getImuRegisterDataBuffer(){
+
+ uint8_t tries = 0;
+ uint16_t checksum;
+
+ do{
+
+ readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET,(void*)&IMU_registerDataBuffer,sizeof(IMU_RegisterDataBuffer_t));
+ checksum = generateChecksum(&IMU_registerDataBuffer,(sizeof(IMU_RegisterDataBuffer_t) - sizeof(uint16_t)));
+
+ }while(tries++ < 5 && checksum != IMU_registerDataBuffer.completeChecksum);
+
+ transmissionErrorCount += tries-1;
+
+ return &IMU_registerDataBuffer;
+
+}
+
+
+/************************************************************
+ *
+ * LightManager
+ *
+ ***********************************************************/
+
+void SupportSystem::writeLightManagerCommand(){
+
+ uint8_t tries = 0;
+ uint8_t control;
+
+ do{
+
+ writeData(SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_COMMAND,(void*)&lightManagerCommand,sizeof(uint8_t));
+ readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_COMMAND,(void*)&control,sizeof(uint8_t));
+
+ }while(tries++ < 5 && control != lightManagerCommand);
+
+ transmissionErrorCount += tries-1;
+
+}
+
+void SupportSystem::setLightManagerCommandBit(bool value, uint8_t bit){
+
+ if(value){
+ lightManagerCommand |= (1<<bit);
+ }else{
+ lightManagerCommand &= ~(1<<bit);
+ }
+}
+
+void SupportSystem::setLightManagerBrakeLight(bool active, bool writeOut){
+
+ setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_BRAKE_LIGHT);
+
+ if(writeOut){
+ writeLightManagerCommand();
+ }
+
+}
+
+void SupportSystem::setLightManagerRemoteLight(bool active, bool writeOut){
+
+ setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_REMOTE_LIGHT);
+
+ if(writeOut){
+ writeLightManagerCommand();
+ }
+
+}
+
+void SupportSystem::setLightManagerSignalLeft(bool active, bool writeOut){
+
+ setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_LEFT);
+
+ if(writeOut){
+ writeLightManagerCommand();
+ }
+
+}
+
+void SupportSystem::setLightManagerSignalRight(bool active, bool writeOut){
+
+ setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_RIGHT);
+
+ if(writeOut){
+ writeLightManagerCommand();
+ }
+
+}
+
+void SupportSystem::setLightManagerSignalBoth(bool active, bool writeOut){
+
+
+ setLightManagerCommandBit(active,SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_BOTH);
+
+ if(writeOut){
+ writeLightManagerCommand();
+ }
+
+}
+
+
+/************************************************************
+ *
+ * RadioDecoder
+ *
+ ***********************************************************/
+
+RadioDecoder_RegisterDataBuffer_t *SupportSystem::getRadioDecoderRegisterDataBuffer(){
+
+ uint8_t tries = 0;
+ uint16_t checksum;
+
+ do{
+
+ readData(SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET,(void*)&RadioDecoder_registerDataBuffer,sizeof(RadioDecoder_RegisterDataBuffer_t));
+ checksum = generateChecksum(&RadioDecoder_registerDataBuffer,sizeof(uint8_t)*12);
+
+ }while(tries++ < 5 && checksum != RadioDecoder_registerDataBuffer.checksum);
+
+ transmissionErrorCount += tries-1;
+
+ return &RadioDecoder_registerDataBuffer;
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Periphery/SupportSystem.h Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,218 @@
+#ifndef SUPPORTSYSTEM_H_
+#define SUPPORTSYSTEM_H_
+
+#include <mbed.h>
+#include <I2C.h>
+
+/*
+ * Necessary for strcut sizes
+ */
+#pragma pack (1)
+
+
+/*
+ * Data container
+ */
+
+typedef struct {
+ uint8_t i2cDeviceAddress;
+ uint32_t uptimeMillis;
+} Main_MaintenanceRegisterDataBuffer_t;
+
+typedef struct {
+
+ uint8_t commandRegister;
+
+ int32_t sensorRawXRegister;
+ int32_t sensorRawYRegister;
+
+ float velocityXRegister;
+ float velocityXFilteredRegister;
+ float velocityAngularRegister;
+ float velocityAngularFilteredRegister;
+
+ float positionXRegister;
+ float positionYRegister;
+ float positionAngleRegister;
+
+ float conversionFactorRegister;
+
+ float sensorPositionXRegister;
+ float sensorPositionYRegister;
+ float sensorPositionAngleRegister;
+
+ int32_t curveRadiusRegister;
+
+ float distanceXRegister;
+
+ uint16_t squal;
+
+ uint16_t completeChecksum;
+// uint16_t velocityChecksumRegister;
+// uint16_t positionChecksumRegister;
+
+} IMU_RegisterDataBuffer_t;
+
+typedef struct {
+ uint8_t commands;
+} LightManager_RegisterDataBuffer_t;
+
+typedef struct {
+
+ uint8_t channelValid[3];
+ uint16_t channelActiveTime[3];
+ int8_t channelPercent[3];
+ uint16_t checksum;
+
+} RadioDecoder_RegisterDataBuffer_t;
+
+
+
+
+/*
+ * Support system - software register
+ */
+
+// Maintenance
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET 0
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_ADDRESS (SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET + 0)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_UPTIME (SUPPORT_SYSTEM_REGISTER_ADDRESS_MAINTENANCE_OFFSET + 1)
+
+// IMU
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET sizeof(Main_MaintenanceRegisterDataBuffer_t)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMMAND (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 0)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_RAW_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 1)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_RAW_Y (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 5)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 9)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_X_FILTERED (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 13)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_ANGULAR (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 17)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_ANGULAR_FILTERED (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 21)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 25)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_Y (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 29)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_ANGLE (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 33)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CONVERSION_FACTOR (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 37)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 41)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_Y (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 45)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SENSOR_POSITION_ANGLE (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 49)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CURVE_RADIUS (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 53)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_DISTANCE_X (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 57)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_SQUAL (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 61)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMPLETE_CHECKSUM (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 63)
+
+//#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_VELOCITY_CHECKSUM (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 63)
+//#define SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_POSITION_CHECKSUM (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + 65)
+
+// Light manager
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET (SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_OFFSET + sizeof(IMU_RegisterDataBuffer_t))
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_COMMAND (SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET + 0)
+
+// Radio decoder
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET (SUPPORT_SYSTEM_REGISTER_ADDRESS_LIGHTMANAGER_OFFSET + sizeof(LightManager_RegisterDataBuffer_t))
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_VALID (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 0)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_VALID (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 1)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_VALID (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 2)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_ACTIVE_TIME (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 3)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_ACTIVE_TIME (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 5)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_ACTIVE_TIME (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 7)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_ONE_PERCENTAGE (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 9)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_TWO_PERCENTAGE (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 10)
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHANNEL_THREE_PERCENTAGE (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 11)
+
+#define SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_CHECKSUM (SUPPORT_SYSTEM_REGISTER_ADDRESS_RADIODECODER_OFFSET + 12)
+
+
+
+/*
+ * LightManager
+ */
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_REMOTE_LIGHT 0
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_LEFT 1
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_RIGHT 2
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_SIGNAL_BOTH 3
+#define SUPPORT_SYSTEM_LIGHTMANAGER_BIT_BRAKE_LIGHT 4
+
+
+class SupportSystem{
+
+
+private:
+
+ uint8_t i2cAddress;
+ I2C *i2c;
+ uint32_t transmissionErrorCount;
+
+ uint16_t crc16_update(uint16_t crc, uint8_t a);
+ uint16_t generateChecksum(void *data, size_t len);
+
+ /*
+ * IMU
+ */
+ uint8_t imuCommand;
+ IMU_RegisterDataBuffer_t IMU_registerDataBuffer;
+
+ /*
+ * LightManager
+ */
+ uint8_t lightManagerCommand;
+ void setLightManagerCommandBit(bool value, uint8_t bit);
+
+ /*
+ * RadioDecoder
+ */
+ RadioDecoder_RegisterDataBuffer_t RadioDecoder_registerDataBuffer;
+
+public:
+
+ SupportSystem();
+ SupportSystem(uint8_t i2cAddress, I2C *i2c);
+
+ void init(uint8_t i2cAddress, I2C *i2c);
+
+ void readData(uint8_t registerAddress, void *buffer, size_t length);
+ void writeData(uint8_t registerAddress, void *buffer, size_t length);
+
+ uint32_t getTransmissionErrorCount();
+
+ /*
+ * Maintenance
+ */
+ uint32_t readMaintenanceUptimeMillis();
+
+
+ /*
+ * IMU
+ */
+ IMU_RegisterDataBuffer_t *getImuRegisterDataBuffer();
+
+
+
+ /*
+ * LightManager
+ */
+ void writeLightManagerCommand();
+ void setLightManagerBrakeLight(bool active, bool writeOut=true);
+ void setLightManagerRemoteLight(bool active, bool writeOut=true);
+ void setLightManagerSignalLeft(bool active, bool writeOut=true);
+ void setLightManagerSignalRight(bool active, bool writeOut=true);
+ void setLightManagerSignalBoth(bool active, bool writeOut=true);
+
+ /*
+ * RadioDecoder
+ */
+ RadioDecoder_RegisterDataBuffer_t *getRadioDecoderRegisterDataBuffer();
+
+};
+
+
+
+#endif /* SUPPORTSYSTEM_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Starter.h Wed Feb 03 17:19:21 2016 +0000 @@ -0,0 +1,6 @@ +#ifndef STARTER_H +#define STARTER_H + + + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Threads/MachineDirectionControl.cpp Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,7 @@
+#include "Threads/MachineDirectionControl.h"
+
+void machine_direction_control_thread(void const *args) {
+ while (true) {
+ Thread::wait(100);
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Threads/MachineDirectionControl.h Wed Feb 03 17:19:21 2016 +0000 @@ -0,0 +1,10 @@ +#ifndef MACHINE_DIRECTION_CONTROL_H +#define MACHINE_DIRECTION_CONTROL_H + +#include <mbed.h> +#include <I2C.h> +#include <rtos.h> + +void machine_direction_control_thread(void); + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Feb 03 17:19:21 2016 +0000
@@ -0,0 +1,226 @@
+#include <mbed.h>
+#include "rtos.h"
+#include "Periphery/SupportSystem.h"
+#include "Misc/SystemTimer.h"
+#include "Threads/MachineDirectionControl.h"
+
+#define PI 3.14159265
+
+Serial serialMinnow(p13, p14);
+PwmOut drivePWM(p22);
+PwmOut steerPWM(p21);
+I2C i2c(p9, p10);
+
+DigitalOut heartbeatLED(LED1);
+DigitalOut buttonLED(LED2);
+DigitalOut redlightLED(LED3);
+
+DigitalIn buttonOne(p25);
+DigitalIn buttonTwo(p26);
+DigitalIn buttonThree(p29);
+DigitalIn buttonFour(p30);
+
+IMU_RegisterDataBuffer_t *IMU_registerDataBuffer;
+RadioDecoder_RegisterDataBuffer_t *RadioDecoder_registerDataBuffer;
+
+uint32_t pulse_duration_drive_pwm_current, pulse_duration_drive_pwm_last;
+
+// Queues von der Bahnplanung
+Queue<float, 2> quadrature_queue;
+Queue<float, 2> machine_direction_queue;
+float steering_angle_minnow_queue;
+float velocity_minnow_queue;
+
+
+// Queues von dem Maussensor
+Queue<float, 2> imu_queue_velocity;
+Queue<float, 2> imu_queue_steering_angle;
+float steering_angle_imu_queue;
+float velocity_imu_queue;
+
+
+// Variablen von der Trajektorienplanung
+
+float velocity_set = 0, steering_angle_set = 0;
+
+// Variablen für die Längsregelung
+float velocity_current = 0, velocity_last = 0;
+
+
+// Variablen für die Querregelung
+float steering_angle_current = 0, steering_angle_last = 0;
+
+uint8_t timer_steering_angle_sampling_time = 0.01;
+
+float q_Kp = 8.166343211;
+float q_Ki = 18.6661236;
+float feed_forward_control_factor = 13.37091452;
+float q_esum = 0;
+float feed_forward = 0;
+float q_Ki_sampling_time = q_Ki * timer_steering_angle_sampling_time;
+float q_PI_controller, q_PWM, q_e, q_output;
+
+// Variablen für die Querregelung Ende
+
+void serial_thread(void const *args) {
+ while (true) {
+ Thread::wait(100);
+ }
+}
+
+void machine_direction_control(void const *args) {
+ osEvent velocity_set_event = machine_direction_queue.get(0);
+ if (velocity_set_event.status == osEventMessage) {
+ velocity_set = *(float*)velocity_set_event.value.p;
+ }
+
+ osEvent velocity_current_event = imu_queue_velocity.get(0);
+ if (velocity_current_event.status == osEventMessage) {
+ velocity_current = *(float *)velocity_current_event.value.p;
+ }
+
+ drivePWM.pulsewidth_us(1800);
+}
+
+void quadrature_control(void const *args) {
+ osEvent steering_angle_set_event = quadrature_queue.get(0);
+ if (steering_angle_set_event.status == osEventMessage) {
+ steering_angle_set = *(float *)steering_angle_set_event.value.p;
+ }
+
+ osEvent steering_angle_current_event = imu_queue_steering_angle.get(0);
+ if (steering_angle_current_event.status == osEventMessage) {
+ steering_angle_current = *(float *)steering_angle_current_event.value.p;
+ }
+
+ q_e = steering_angle_set - steering_angle_current;
+ q_esum = q_esum + q_e;
+
+ feed_forward = steering_angle_set * feed_forward_control_factor;
+ q_PI_controller = q_Kp*q_e + q_Ki_sampling_time * q_esum;
+
+ q_output = feed_forward + q_PI_controller;
+
+ if(q_output > 500){q_output = 500;} // evtl Begrenzung schon auf z.b. 300/ -300 stellen (wegen Linearität)
+ if(q_output < -500){q_output = - 500;}
+
+ q_PWM = 1500 + q_output;
+
+ steerPWM.pulsewidth_us(q_PWM);
+}
+
+int main() {
+ serialMinnow.baud(115200);
+
+ drivePWM.period_ms(20);
+ steerPWM.period_ms(20);
+
+ SystemTimer *millis = new SystemTimer();
+
+ SupportSystem *supportSystem = new SupportSystem(0x80, &i2c);
+
+ Thread machineDirectionControl(test_thread);
+
+ RtosTimer machine_direction_control_timer(machine_direction_control);
+ RtosTimer quadrature_control_timer(quadrature_control);
+
+ // Konfiguration AMF-IMU
+ // [0]: Conversation Factor
+ // [1]: Sensor Position X
+ // [2]: Sensor Position Y
+ // [3]: Sensor Position Angle
+ float configData[4] = {0.002751114f, 167.0f, 0.0f, 269.0f};
+
+ supportSystem->writeData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_CONVERSION_FACTOR, configData, sizeof(float)*4);
+
+ // Flag setzen
+ uint8_t command = 1<<3;
+ supportSystem->writeData(SUPPORT_SYSTEM_REGISTER_ADDRESS_IMU_COMMAND, &command, sizeof(uint8_t));
+
+ bool timer_started = false;
+
+ wait(0.1);
+
+ velocity_minnow_queue = 12.0;
+ quadrature_queue.put(&velocity_minnow_queue);
+
+ while(true) {
+ IMU_registerDataBuffer = supportSystem->getImuRegisterDataBuffer();
+ RadioDecoder_registerDataBuffer = supportSystem->getRadioDecoderRegisterDataBuffer();
+
+ for(uint8_t i=0; i<3; i++) {
+ serialMinnow.printf("RadioDecoder - Ch[%d] Valid: %d\r\n",i,RadioDecoder_registerDataBuffer->channelValid[i]);
+ serialMinnow.printf("RadioDecoder - Ch[%d] ActiveTime: %d\r\n",i,RadioDecoder_registerDataBuffer->channelActiveTime[i]);
+ serialMinnow.printf("RadioDecoder - Ch[%d] Percentage: %d\r\n",i,RadioDecoder_registerDataBuffer->channelPercent[i]);
+ }
+
+ uint16_t rc_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[0];
+ uint8_t rc_valid = RadioDecoder_registerDataBuffer->channelValid[0];
+
+ uint16_t drive_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[1];
+ uint8_t drive_valid = RadioDecoder_registerDataBuffer->channelValid[1];
+
+ uint16_t steer_percentage = RadioDecoder_registerDataBuffer->channelActiveTime[2];
+ uint8_t steer_valid = RadioDecoder_registerDataBuffer->channelValid[2];
+
+
+ if (rc_percentage > (uint16_t) 1800 && rc_valid != 0) {
+ // oben => Wettbewerb
+ heartbeatLED = true;
+ buttonLED = false;
+ redlightLED = false;
+ supportSystem->setLightManagerRemoteLight(false, true);
+ if (!timer_started) {
+ timer_started = true;
+ machine_direction_control_timer.start(10);
+ quadrature_control_timer.start(10);
+ }
+ } else if (rc_percentage > (uint16_t) 1200 && rc_valid != 0) {
+ // unten => RC-Wettbewerb
+ heartbeatLED = false;
+ buttonLED = false;
+ redlightLED = true;
+ supportSystem->setLightManagerRemoteLight(true, true);
+ if (drive_valid) {
+ drivePWM.pulsewidth_us(drive_percentage);
+ }
+ if (steer_valid) {
+ steerPWM.pulsewidth_us(steer_percentage);
+ }
+ if (timer_started) {
+ timer_started = false;
+ machine_direction_control_timer.stop();
+ quadrature_control_timer.stop();
+ }
+ } else if (rc_percentage > (uint16_t) 800 && rc_valid != 0) {
+ // mitte => RC-Training
+ heartbeatLED = false;
+ buttonLED = true;
+ redlightLED = false;
+ supportSystem->setLightManagerRemoteLight(true, true);
+ if (drive_valid) {
+ drivePWM.pulsewidth_us(drive_percentage);
+ }
+ if (steer_valid) {
+ steerPWM.pulsewidth_us(steer_percentage);
+ }
+ if (timer_started) {
+ timer_started = false;
+ machine_direction_control_timer.stop();
+ quadrature_control_timer.stop();
+ }
+ }
+
+ velocity_imu_queue = IMU_registerDataBuffer->velocityXFilteredRegister;
+ imu_queue_velocity.put(&velocity_imu_queue);
+
+ float radius = IMU_registerDataBuffer->velocityXFilteredRegister/IMU_registerDataBuffer->velocityAngularFilteredRegister;
+
+ steering_angle_imu_queue = atan(0.205/radius)*180/PI;
+ imu_queue_steering_angle.put(&steering_angle_imu_queue);
+
+
+ serialMinnow.printf("%f\r\n\r\n", IMU_registerDataBuffer->sensorPositionAngleRegister);
+ Thread::wait(50);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Wed Feb 03 17:19:21 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#3d9d2b8b8f17
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Feb 03 17:19:21 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/6f327212ef96 \ No newline at end of file
