chottoshitahanashi’s diary

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

サーボ計算

https://akizukidenshi.com/download/ds/towerpro/SG90_a.pdf
周期20ミリ秒、そのうち0度は0.5ミリ秒HIGH、180度は2.4ミリ秒HIGH。
0.1ミリ秒毎に刻むとして19刻み。50ppmで1刻みにするとして400ppm+19*50=163500ppmがmax。ちょうどいいくらい。
PWMで刻むには周波数が低すぎるんでdelayMicroseconds()使っちゃうかなー。負けたような気がするけど。


もう少し真面目に計算。動作クロック1.0MHz (8MHzをデフォルトFUSE設定で8分周=1MHz)。
周期20ミリ秒=50Hzなので1MHzをn倍して50Hzになるnを求めると20000、前置分周256でカウンタ77でリセットするとすると256*78≒20000で10^6/(256*78)=50.08Hz。カウンタ1で0.256ミリ秒。カウンタが2でサーボの角度はほぼ0度。カウンタ9でほぼ180度。分解能が全然足りない。


やっぱり前置分周なしでカウンタ99でリセットするとすると1*10^6/100=10kHz(0.1ミリ秒)。CTC動作させて割り込みかけて5カウント~24カウントでHIGHからLOWにする。サーボが安定するまでそれを200カウント周期で繰り返し。TC0はdelay()で使ってるのでTC1をCTC割り込み用に使う。

OCR1A=5; // 比較一致用レジスタ。今回の設定ではタイマー1がこの値になれば割り込み。5~24の値でサーボ0~180度
// OCR1B = 0bxxxxxxxx; // 比較一致用レジスタ。今回使わない。
OCR1C = 100 - 1; // 比較一致用レジスタ。今回の設定ではタイマー1がこの値になればリセット。
TCCR1= 0b10000001; // CTC1 PWM1A COM1A1 COM1A0 CS13 CS12 CS11 CS10
GTCCR = 0b00000000; // TSM PWM1B COM1B1 COM1B0 FOC1B FOC1A PSR1 PSR0
TIMSK = 0b1000010; // - OCIE1A OCIE1B OCIE0A OCIE0B TOIE1 TOIE0 -


CTC1: OCR1Cとの比較一致でタイマ1クリア
PWM1A: PWMピン端子出力
COM1A1 COM1A0: これもピン出力PWM関係
CS13 CS12 CS11 CS10: 0001で前置分周なし


TSM: 今回用途にはあまり重要でない、0で良い
PWM1B: PWMを使わないので0
COM1B1 COM1B0: 出力ピン動作。0で良い
FOC1B FOC1A: 強制マッチ。0で良い
PSR1 PSR0: ビット1をセットするとタイマ1, 0をリセットする。0で良い


OCIE1A OCIE1B: タイマ/カウンタ1比較A割り込み許可。どちらかを1にして割り込み許可する
OCIE0A OCIE0B: タイマ0は使ってないので0でよい
TOIE1 TOIE0: : タイマ/カウンタ1溢れ割り込み許可。TOIE0のみdelay()用に1にする



以降は駄文。


PWM使えるか(追記:分解能低くて使えない)。12.2.2. タイマ/カウンタ1 PWM動作よむこと
OC1A(PB1)あるいはOC1B(PB4)端子を使う。xはAorB
COM1x1 COM1x0=10: TCNT1=0でHIGH、OC1x比較一致でLOW
OCR1C=200-1;

TCCR1 = 0bxxxxxxxx; // CTC1 PWM1A COM1A1 COM1A0 CS13 CS12 CS11 CS10
CTC1=1 : Clear Timer/Counter on Compare Match
PWM1A=1(xとしてAを使うなら)
COM1A1 COM1A0: 上記参照
CS13 CS12 CS11 CS10 = 0001: 分周なし <--追記:ここまちがい

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

OCR1A, OCR1Bは比較マッチレジスタ, 5~24の値(サーボ0度~180度)

TIMSK = 0bxxxxxxxx; // – OCIE1A OCIE1B OCIE0A OCIE0B TOIE1 TOIE0 –
OCIE1A=0: OCR1Aマッチによる割り込み許可。PWM使うので
OCIE1B=0
TOIE1=0: Timer/Counter1 Overflow Interrupt Enable


とここまで調べてPWM用にOC1x使ったら対になる反転出力端子がGPIOとして使えない気がしてきた。
これはテストが必要だな。