どうも高周波数のPWMで動かすにはパワーMOSFET系のトランジスタじゃないとダメらしい。
パワーMOSFET系のトランジスタはNchのを2種類(しかも1つはチップトランジスタ)しか持ってないので、フルブリッジは作れない。作れないことはないけど、他に部品(ゲートドライバIC)が必要。→秋月のキット参照の事
「確か先日、モータドライバを2種類(TA8428K, TB6643KQ)買っておいたのがあったなぁ…」とデータシートを確認したら、TB6643KQがMOSFET系だったので、急遽差し替えて試してみたら無事に動いた。
回路図は次のようになっています。

スケッチをGitHub.comに登録してみました。
https://github.com/physicam/tb6643kq_pwm30khz
スケッチは次のようになっています。
#define PIN_SW1 2 // Speed Up #define PIN_SW2 3 // Speed Down #define PIN_IN1 9 // Output Pin for IN1 #define PIN_IN2 10 // Output Pin for IN2 #define MAX_VALUE 256 #define LIMIT_VALUE (MAX_VALUE-1) #define DELTA_SPEED (MAX_VALUE/8) int prev_sw1 = HIGH; int prev_sw2 = HIGH; int value_speed = 0; void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.println("TB6643KQ PWM 30kHz"); pinMode(PIN_SW1, INPUT); // Speed Up pinMode(PIN_SW2, INPUT); // Speed Down pinMode(PIN_IN1, OUTPUT); // Output Pin for IN1 pinMode(PIN_IN2, OUTPUT); // Output Pin for IN2 // PWM 30kHz TCCR1A = 0b00000001; TCCR1B = 0b00000001; analogWrite(PIN_IN1, value_speed); analogWrite(PIN_IN2, value_speed); } void loop() { // put your main code here, to run repeatedly: int curr_sw1, curr_sw2; curr_sw1 = digitalRead(PIN_SW1); curr_sw2 = digitalRead(PIN_SW2); if (curr_sw1 != prev_sw1) { if (curr_sw1 == LOW) { // これが押された判定 Serial.println("sw1"); if (value_speed == -LIMIT_VALUE) { value_speed = -MAX_VALUE; } value_speed += DELTA_SPEED; if (value_speed > LIMIT_VALUE) { value_speed = LIMIT_VALUE; } updateSpeed(); } prev_sw1 = curr_sw1; delay(10); } if (curr_sw2 != prev_sw2) { if (curr_sw2 == LOW) { // これが押された判定 Serial.println("sw2"); if (value_speed == LIMIT_VALUE) { value_speed = MAX_VALUE; } value_speed -= DELTA_SPEED; if (value_speed < -LIMIT_VALUE) { value_speed = -LIMIT_VALUE; } updateSpeed(); } prev_sw2 = curr_sw2; delay(10); } } void updateSpeed() { if (value_speed > 0) { Serial.print("("); Serial.print(value_speed); Serial.println(", 0)"); analogWrite(PIN_IN2, 0); analogWrite(PIN_IN1, value_speed); } else if (value_speed < 0) { Serial.print("(0, "); Serial.print(value_speed); Serial.println(")"); analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, -value_speed); } else { Serial.println("(0, 0)"); analogWrite(PIN_IN1, 0); analogWrite(PIN_IN2, 0); } }