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.
main.cpp
- Committer:
- shaorui
- Date:
- 2021-01-25
- Revision:
- 0:571a1835428e
File content as of revision 0:571a1835428e:
#include "mbed.h"
#include "struct.h"
#include "PositionSensor.h"
#include "PreferenceWriter.h"
#include "brake.h"
#include "user_config.h"
PreferenceWriter prefs(6);
float __float_reg[64]; // Floats stored in flash
int __int_reg[256];
GPIOStruct gpio;
ControllerStruct controller;
Serial pc(PA_2, PA_3);
PositionSensorAM5147 spi(16384, 0.0, 0); //14 bits encoder, 21 NPP
int brake_state=0;
int flag=0;
Ticker flipper;
void serial_interrupt(void){
while(pc.readable()){
char c = pc.getc();
switch (c){
case 'z':
spi.SetMechOffset(0);
spi.Sample(0.000025);
wait_us(20);
M_OFFSET = spi.GetMechPosition();
if (!prefs.ready()) prefs.open();
prefs.flush(); // Write new prefs to flash
prefs.close();
prefs.load();
spi.SetMechOffset(M_OFFSET);
printf("\n\r Saved new zero position: %.4f\n\r\n\r", M_OFFSET);
break;
}
}
}
void time1_check()
{
spi.Sample(0.000025);
//pc.printf("%.3f\n\r",controller.theta_mech); // sample position sensor
controller.theta_elec = spi.GetElecPosition();
controller.theta_mech = spi.GetMechPosition();
controller.dtheta_mech = spi.GetMechVelocity();
controller.dtheta_elec = spi.GetElecVelocity();
/*
if(gpio.indicate->read()==1)
{
gpio.brake->write(1);
}
else{
gpio.brake->write(0);
}*/
if(gpio.indicate->read()==1)
{
brake_state=1;
}
else{
brake_state=0;
}
controller.loop_count++;
if(controller.loop_count>80000)
{
controller.loop_count=80000;
}
if(brake_state=1&&controller.loop_count>=80000)
{
flag=-flag;
if(flag)
{
gpio.brake->write(1);
}
if(flag)
{
gpio.brake->write(0);
}
}
if(brake_state=1&&controller.loop_count<80000)
{
gpio.brake->write(1);
}
else
{
gpio.brake->write(0);
}
}
int main()
{
Init_Brake(&gpio);
controller.loop_count=0;
prefs.load(); // Read flash
if(isnan(E_OFFSET)){E_OFFSET = 0.0f;}
if(isnan(M_OFFSET)){M_OFFSET = 0.0f;}
spi.SetElecOffset(E_OFFSET); // Set position sensor offset
spi.SetMechOffset(M_OFFSET);
int lut[128] = {0};
memcpy(&lut, &ENCODER_LUT, sizeof(lut));
spi.WriteLUT(lut); // Set potision sensor nonlinearity lookup table
pc.baud(115200); // set serial baud rate
wait(.01);
wait(.01);
pc.attach(&serial_interrupt); // attach serial interrupt
flipper.attach_us(&time1_check,25);
while(1) {
printf("%.3f\n\r",controller.theta_mech);
printf("%.3d\n\r",spi.GetRawPosition());
wait_ms(1000);
}
}