chottoshitahanashi’s diary

基本的に間違ったことばかり書いてるブログ。検索ひっかかるな

PWMレジスタ設定

一つ前エントリに合うようレジスタ設定を考える。

OC1A(PB1)あるいはOC1B(PB4)端子を使う。xはAorB
COM1x1 COM1x0=10: タイマリセットでHIGH、OCR1AあるいはOCR1B(xによる)との比較一致でLOW

  • OCR1A, OCR1Bは比較マッチレジスタ, 4~18の値(サーボ角度0度~180度コントロール)。どちらかを使う
  • OCR1C=156-1;
  • TCCR1 = 0b1???1000; // CTC1 PWM1A COM1A1 COM1A0 CS13 CS12 CS11 CS10

CTC1=1: OCR1Cとの比較一致でタイマ1クリア
PWM1A=?(xとしてAを使うなら1)
COM1A1 COM1A0: 上記参照、xとしてAを使うなら10、そうでなければ00
CS13 CS12 CS11 CS10=1000: 128分周

  • GTCCR = 0b0???0000; // TSM PWM1B COM1B1 COM1B0 FOC1B FOC1A PSR1 PSR0

TSM = 0 // あまり重要でない
PWM1B=?(xとしてBを使うなら)
COM1B1 COM1B0: 上記参照、xとしてBを使うなら10、そうでなければ00
PSR0 = 0: 1にするとタイマーリセットされる
FOC1B FOC1A = 00: 強制コンペアマッチ、1をセットするとマッチ状態になる。今回使わない。
PSR1 PSR0 = 00: 1をセットすると分周がリセットされるらしい。今回使わない

  • TIMSK = 0b00000010; // – OCIE1A OCIE1B OCIE0A OCIE0B TOIE1 TOIE0 –

OCIE1A, OCIE1B=00: OCR1A, OCR1Bマッチによる割り込み許可。割り込みでなくPWM使うので0
OCIE0A, OCIE0B=00: OCR0A, OCR0Bマッチによる割り込み許可。タイマ0は関係ないし、delay()でも使ってないので0
TOIE1=0: タイマ1オーバーフローによる割り込み許可。割り込みでなくPWM使うので0
TOIE0=1: delay()を使いたいので1


こーどはこんなの。長くなったので結果は次のエントリで。

# define INV_PWM_PIN 0
# define PWM_PIN 1

void setup()
{
  pinMode(PWM_PIN, OUTPUT);
  pinMode(INV_PWM_PIN, OUTPUT);

  // 端子とレジスタ設定。OC1A(PB1)端子を使う。データシートでOC1Xと書かれていた場合のx=A。
  // PB1と反転出力PB0の動作を確認する。

  TCCR1 = 0b11101000; // CTC1 PWM1A COM1A1 COM1A0 CS13 CS12 CS11 CS10
  // CTC1=1: OCR1Cとの比較一致でタイマ1クリア
  // PWM1A=1: OC1A(PB1)端子を使うので1
  // COM1A1 COM1A0=10: PWMのモード。タイマリセットでHIGH、OCR1Aとの比較一致でLOWという設定
  // CS13 CS12 CS11 CS10=1000: 128分周

  GTCCR = 0b00000000; // TSM PWM1B COM1B1 COM1B0 FOC1B FOC1A PSR1 PSR0
  // TSM = 0: あまり重要でない
  // PWM1B: xとしてBを使わないので0
  // COM1B1 COM1B0=00: PWMのモード。OC1B(PB4)端子を使わないので00
  // PSR0=0: 1にするとタイマーリセットされる。関係ない
  // FOC1B FOC1A=00: 強制コンペアマッチ、1をセットするとマッチ状態になる。関係ない。
  // PSR1 PSR0=00: 1をセットすると分周がリセットされるらしい。関係ない

  TIMSK = 0b00000010; // – OCIE1A OCIE1B OCIE0A OCIE0B TOIE1 TOIE0 –
  // OCIE1A, OCIE1B=00: OCR1A, OCR1Bマッチによる割り込み許可。割り込みでなくPWM使うので0
  // OCIE0A, OCIE0B=00: OCR0A, OCR0Bマッチによる割り込み許可。タイマ0は関係ないし、delay()でも使ってないので0
  // TOIE1=0: タイマ1オーバーフローによる割り込み許可。割り込みでなくPWM使うので0
  // TOIE0=1: delay()を使いたいので1

  OCR1C=156-1;
  // OCR1Cは比較マッチレジスタ, 156カウントでタイマ1クリア

  // OCR1A, OCR1Bは比較マッチレジスタ, 4~18の値(サーボ角度0度~180度コントロール)。今回OCR1Aを使う
  OCR1A= 8;

}

void loop()
{
  for(int i = 4; i <= 18; ++i)
  {
    OCR1A= i;
    delay(1000);
    digitalWrite(INV_PWM_PIN, !digitalRead(INV_PWM_PIN));
  }
}