aa
Dependencies: mbed
main.cpp
- Committer:
- hajime_nntc
- Date:
- 2016-05-20
- Revision:
- 0:4ed9b2004dd0
File content as of revision 0:4ed9b2004dd0:
#include "mbed.h" #define PI 3.141592 DigitalOut leds[8] = { PA_11, PB_12, PB_2, PB_1, PB_15, PB_14, PB_13, PC_4 }; I2C i2c(I2C_SDA, I2C_SCL); Serial FEP02(PC_6, PA_12); Serial pc(USBTX, USBRX); const int addr[4] = { 0x10, 0x23, 0x56, 0x76 }; int i,dig,i2cVAL,error_val=0; //double rad, prePwmDuty[4], PwmDuty[4]; int main() { char data[5] = { 0 },MDFL[2],MDFR[2],MDRL[2],MDRR[2]; int i,dig,i2cVAL,error=0; double rad, prePwmDuty[4], PwmDuty[4]; i2c.frequency(300000); // I2Cの通信速度設定 FEP02.baud(19200);// シリアルのボーレートを19200に設定 while(1) { if(FEP02.getc() == 255) { for(i = 0; i < 5; i++) { data[i] = FEP02.getc(); error_val = 0; } } else { error_val++; } dig = data[0] + data[1] * 128;// 受信データから元の角度に変換 rad = (dig / 180.0) * PI; // radianに変換 if(error > 10) { dig = 360; pc.printf("error\r\n"); } if(dig >= 360) { prePwmDuty[0] = 0; prePwmDuty[1] = 0; prePwmDuty[2] = 0; prePwmDuty[3] = 0; } else { // 各モータへの出力を算出 prePwmDuty[0] = 1.41421356 * sin(rad - ((5 / 4) * PI)); prePwmDuty[1] = 1.41421356 * sin(rad - (PI / 4)); prePwmDuty[2] = prePwmDuty[0]; prePwmDuty[3] = prePwmDuty[1]; } for(i = 0; i < 4; i++) { // 値を-1.0~1.0の範囲だからその範囲に収める if(prePwmDuty[i] < -1.0) { prePwmDuty[i] = -1.0; } else if(prePwmDuty[i] > 1.0) { prePwmDuty[i] = 1.0; } PwmDuty[i] = (fabs(prePwmDuty[i] + 1.0)) / 2; } PwmDuty[2] = 1 - PwmDuty[2]; PwmDuty[3] = 1 - PwmDuty[3]; MDFR[0] = PwmDuty[0]*255; MDRR[0] = PwmDuty[1]*255; MDRL[0] = PwmDuty[2]*255; MDFL[0] = PwmDuty[3]*255; i2cVAL += i2c.write(addr[0], MDFR, 2, false); i2cVAL += i2c.write(addr[1], MDRR, 2, false); i2cVAL += i2c.write(addr[2], MDRL, 2, false); i2cVAL += i2c.write(addr[3], MDFL, 2, false); if(i2cVAL) { leds[2] = 1; } else { leds[2] = 0; } printf("%d,%d,%d,%d,%d\r\n", dig, error_val, MDFR[0], MDRL[0], data[4]); } }