Pulse Width Modulation(パルス幅変調)制御
モータードライバ: TA8428K # | Name | Arg | Func |
---|
1 | IN1 | i1 | 制御用入力端子 |
---|
2 | IN2 | i2 |
---|
3 | OUTA | o1 | 〜1.5A |
---|
4 | GND | gnd | GND |
---|
5 | OUTA~ | o2 | |
---|
6 | ---- | -- | |
---|
7 | Vcc | vcc | VCC〜30V |
---|
Mode | IN1 | IN2 | OUTA | OUTA~ |
---|
制動 | H | H | L | L |
---|
正転 | H | L | H | L |
---|
逆転 | L | H | L | H |
---|
停止 | L | L | Z | Z |
---|
ハード 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| | ;pin ctrl.gnd = driver.gnd = 0V
;pin ctrl.vcc = 5V
;pin driver.vcc = 12V
;C[10 uF](driver.gnd, driver.vcc)
;C[ 0.1uF](driver.gnd, driver.vcc)
;Arduino ctrl
;TA8428K driver
;driver.i1 = ctrl.D3
;driver.i2 = ctrl.D11
;pin driver.o1;
;pin driver.o2;
|
ソフト 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| | void setup() {
Serial.begin(9600);
pinMode( 3, OUTPUT);
pinMode(11, OUTPUT);
}
int c1 = 3;
int c2 = 11;
int t = 100;
int d = 50;
int command = 0;
void loop() {
if (Serial.available() > 0) {
command = Serial.read();
}
digitalWrite(c1, LOW )
digitalWrite(c2, HIGH)
delay(d);
digitalWrite(c1, LOW)
digitalWrite(c2, LOW)
delay(t-d);
}
|
ディーゼル 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
| int iAna0 = 0;
int pPwm1 = 3;
int pPwm2 = 11;
int base = 0;
#define avelg 2
#define avesz (1<<avelg)
int avebf[avesz];
int avelc=0;
int ave=0;
int Ave(int value) {
ave -= avebf[avelc]; avebf[avelc] = value >> avelg;
ave += avebf[avelc];
avelc++;
if (avelc == avesz) avelc = 0;
return ave;
}
void setPwvWidth0311(int r) {
TCCR2B &= B11111000;
switch(r) {
case 1: TCCR2B |= B00000001;
case 8: TCCR2B |= B00000010;
case 32: TCCR2B |= B00000011;
default :
case 64: TCCR2B |= B00000100;
case 128: TCCR2B |= B00000101;
case 256: TCCR2B |= B00000110;
case 1024: TCCR2B |= B00000111;
}
}
void setup() {
Serial.begin(9600);
setPwvWidth0311(128);
pinMode(pPwm1, OUTPUT);
pinMode(pPwm2, OUTPUT);
pinMode( 8, OUTPUT);
pinMode( 9, INPUT);
pinMode(10, OUTPUT);
analogWrite(pPwm1, 0 );
analogWrite(pPwm2, 0 );
digitalWrite( 8, LOW);
digitalWrite(10, HIGH);
base = analogRead(iAna0)+10;
Serial.print("base == ");
Serial.println(base);
for(int i = 0; i<avesz; i++) {
avebf[i] = 0;
}
}
void loop() {
int sw = digitalRead(9);
int value = analogRead(iAna0);
int ave = Ave(value);
int acc = 0;
if (sw == LOW) {
acc = (1024-ave)/4;
}
else {
acc = (ave - base)/2;
if (acc < 5) acc = 0;
if (acc >254) acc = 254;
}
if (1) {
Serial.print(value);
Serial.print("\t");
Serial.print(ave);
Serial.print("\t");
Serial.println(acc);
}
analogWrite(pPwm1, 0 );
analogWrite(pPwm2, acc);
delay(100);
}
|
|