If you want to use BLDC with FUTABA without going backward, use it

Dependencies:   mbed Servo Pulse1

Committer:
kyucheol
Date:
Fri Dec 27 09:16:54 2019 +0000
Revision:
4:c9fda60b0332
Parent:
3:c47e538f3aec
Can use if you want BLDC motor without Backward

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kyucheol 0:b806d9855f21 1 #include "mbed.h"
kyucheol 0:b806d9855f21 2 #include "Servo.h"
kyucheol 0:b806d9855f21 3 #include "Map.h"
kyucheol 2:4e3761881124 4 #include "Pulse1.h"
kyucheol 0:b806d9855f21 5
kyucheol 4:c9fda60b0332 6 // 후진 불가능한 BLDC 사용
kyucheol 4:c9fda60b0332 7
kyucheol 0:b806d9855f21 8
kyucheol 0:b806d9855f21 9 PwmOut led_left(LED1); //확인용 LED1
kyucheol 0:b806d9855f21 10 PwmOut led_right(LED2); //확인용 LED2
kyucheol 0:b806d9855f21 11
kyucheol 4:c9fda60b0332 12 Servo bldc_left(PB_8); // 왼쪽 BLDC D12
kyucheol 4:c9fda60b0332 13 Servo bldc_right(PB_9); // 오른쪽 BLDC PC_7
kyucheol 0:b806d9855f21 14
kyucheol 2:4e3761881124 15 PulseInOut Channel1(A0); //채널1, futaba기준 좌우방향(오른쪽 조이스틱)
kyucheol 2:4e3761881124 16 PulseInOut Channel2(A1); //채널2, futaba기준 상하방향(오른쪽 조이스틱)
kyucheol 2:4e3761881124 17 PulseInOut Channel3(A2); //채널3, futaba기준 상하방향(왼쪽 조이스틱)
kyucheol 0:b806d9855f21 18
kyucheol 0:b806d9855f21 19 int main() {
kyucheol 0:b806d9855f21 20 bldc_left.write(0); // BLDC 초기 설정
kyucheol 0:b806d9855f21 21 bldc_right.write(0);
kyucheol 0:b806d9855f21 22
kyucheol 4:c9fda60b0332 23 led_left = 1; // 확인을 위한 LED
kyucheol 4:c9fda60b0332 24 led_right=1; // 확인을 위한 LED
kyucheol 0:b806d9855f21 25 wait(0.5);
kyucheol 0:b806d9855f21 26
kyucheol 0:b806d9855f21 27 bldc_left.write(1);
kyucheol 0:b806d9855f21 28 bldc_right.write(1);
kyucheol 0:b806d9855f21 29
kyucheol 4:c9fda60b0332 30 led_left =0; // 확인을 위한 LED
kyucheol 4:c9fda60b0332 31 led_right=0; // 확인을 위한 LED
kyucheol 0:b806d9855f21 32 wait(2);
kyucheol 0:b806d9855f21 33
kyucheol 4:c9fda60b0332 34 bldc_left.write(0); // BLDC 초기 설정
kyucheol 4:c9fda60b0332 35 bldc_right.write(0); // BLDC 초기 설정
kyucheol 0:b806d9855f21 36 wait(2);
kyucheol 0:b806d9855f21 37
kyucheol 2:4e3761881124 38 float raw1,raw2,raw3;
kyucheol 2:4e3761881124 39 float mod1,mod2,mod3,mod4,mod5;
kyucheol 0:b806d9855f21 40 printf("\nBLDC Setup & end\n");
kyucheol 0:b806d9855f21 41
kyucheol 0:b806d9855f21 42 while (1) {
kyucheol 0:b806d9855f21 43
kyucheol 2:4e3761881124 44
kyucheol 2:4e3761881124 45 raw1 = Channel1.read_high_us(30000);
kyucheol 2:4e3761881124 46 raw2 = Channel2.read_high_us(30000);
kyucheol 2:4e3761881124 47 raw3 = Channel3.read_high_us(30000);
kyucheol 0:b806d9855f21 48
kyucheol 0:b806d9855f21 49
kyucheol 4:c9fda60b0332 50 //printf("raw1=%.0f mV\t", raw1);
kyucheol 4:c9fda60b0332 51 mod1 = map(raw2, 1450, 1000, 0, 60); // 후진 //PWM 150을 변환
kyucheol 4:c9fda60b0332 52 mod2 = map(raw2, 1550, 2000, 0, 90); // 전진 //PWM 150을 변환
kyucheol 0:b806d9855f21 53
kyucheol 0:b806d9855f21 54
kyucheol 0:b806d9855f21 55
kyucheol 4:c9fda60b0332 56 //printf("raw2=%.0f mV\t", raw2);
kyucheol 4:c9fda60b0332 57 mod3 = map(raw1, 1450, 1000, 0, 60); // 좌회전 //PWM 150을 변환
kyucheol 4:c9fda60b0332 58 mod4 = map(raw1, 1550, 2000, 0, 60); // 우회전 //PWM 150을 변환
kyucheol 2:4e3761881124 59
kyucheol 4:c9fda60b0332 60 //printf("raw3=%.0f mV\t", raw3);
kyucheol 2:4e3761881124 61 mod5 = map(raw3, 920, 2080, 0, 100);
kyucheol 2:4e3761881124 62
kyucheol 2:4e3761881124 63 printf("mod1=%.0f mV\t", mod1);
kyucheol 2:4e3761881124 64 printf("mod2=%.0f mV\t", mod2);
kyucheol 2:4e3761881124 65 printf("mod3=%.0f mV\t", mod3);
kyucheol 2:4e3761881124 66 printf("mod4=%.0f mV\t", mod4);
kyucheol 2:4e3761881124 67 printf("mod5=%.0f mV\t", mod5);
kyucheol 0:b806d9855f21 68
kyucheol 0:b806d9855f21 69 mod1 = mod1/100;
kyucheol 0:b806d9855f21 70 mod2 = mod2/100;
kyucheol 2:4e3761881124 71 mod3 = mod3/100;
kyucheol 2:4e3761881124 72 mod4 = mod4/100;
kyucheol 2:4e3761881124 73 mod5 = mod5/100;
kyucheol 2:4e3761881124 74
kyucheol 2:4e3761881124 75 printf("measure1 = %f mV\t", mod1);
kyucheol 0:b806d9855f21 76 printf("measure2 = %f mV\t", mod2);
kyucheol 4:c9fda60b0332 77 printf("measure3 = %f mV\t", mod3);
kyucheol 4:c9fda60b0332 78 printf("measure4 = %f mV\t", mod4);
kyucheol 2:4e3761881124 79 printf("measure5 = %f mV\n", mod5);
kyucheol 2:4e3761881124 80
kyucheol 2:4e3761881124 81
kyucheol 4:c9fda60b0332 82 if(mod3 > 0.01) { // 2
kyucheol 2:4e3761881124 83 mod4 = 0;
kyucheol 2:4e3761881124 84 }
kyucheol 2:4e3761881124 85
kyucheol 4:c9fda60b0332 86 if(mod4 > 0.01) { // 2
kyucheol 2:4e3761881124 87 mod3 = 0;
kyucheol 2:4e3761881124 88 }
kyucheol 2:4e3761881124 89
kyucheol 2:4e3761881124 90
kyucheol 3:c47e538f3aec 91 float bldc_l, bldc_r; // bldc 왼쪽 오른쪽 선언
kyucheol 4:c9fda60b0332 92 bldc_l = mod2 - mod3 + mod4;
kyucheol 4:c9fda60b0332 93 bldc_r = mod2 + mod3 - mod4;
kyucheol 2:4e3761881124 94
kyucheol 3:c47e538f3aec 95 if(bldc_l >= 0.6) { // PWM 150을 변환
kyucheol 3:c47e538f3aec 96 bldc_l = 0.6;
kyucheol 3:c47e538f3aec 97 }
kyucheol 4:c9fda60b0332 98 if(bldc_l <= 0.03) { // PWM 20을 변환
kyucheol 3:c47e538f3aec 99 bldc_l = 0;
kyucheol 3:c47e538f3aec 100 }
kyucheol 3:c47e538f3aec 101
kyucheol 3:c47e538f3aec 102 if(bldc_r >= 0.6) { // PWM 150을 변환
kyucheol 3:c47e538f3aec 103 bldc_r = 0.6;
kyucheol 3:c47e538f3aec 104 }
kyucheol 4:c9fda60b0332 105 if(bldc_r <= 0.03) { // PWM 20을 변환
kyucheol 3:c47e538f3aec 106 bldc_r = 0;
kyucheol 3:c47e538f3aec 107 }
kyucheol 0:b806d9855f21 108
kyucheol 3:c47e538f3aec 109 bldc_left.write(bldc_l);
kyucheol 3:c47e538f3aec 110 bldc_right.write(bldc_r);
kyucheol 0:b806d9855f21 111
kyucheol 0:b806d9855f21 112
kyucheol 3:c47e538f3aec 113 led_left.write(bldc_l);
kyucheol 3:c47e538f3aec 114 led_right.write(bldc_r);
kyucheol 0:b806d9855f21 115 }
kyucheol 2:4e3761881124 116 }
kyucheol 2:4e3761881124 117