SPIを介してarduino UNOによってプログラムされたAttiny13 AVRを使用しています。
attiny13 のコアと、boards.txt ファイルの内容を次のように見つけました。
#attiny13.name=Attiny13 @ 128 KHz (internal watchdog oscillator)
#attiny13.upload.using=arduino:arduinoisp
# attiny13.upload.protocol=avrispv2
# attiny2313at1.upload.using=pololu
#attiny13.upload.maximum_size=1024
#attiny13.upload.speed=250 # important for not losing connection to a slow processor
#attiny13.bootloader.low_fuses=0x7B
#attiny13.bootloader.high_fuses=0xFF
#attiny13.bootloader.unlock_bits=0x3F
#attiny13.bootloader.lock_bits=0x3F
#attiny13.build.mcu=attiny13
#attiny13.build.f_cpu=128000
#attiny13.build.core=core13
########################
attiny13e.name=Attiny 13A standalone 9.6Mhz
attiny13e.upload.using=arduino:arduinoisp
attiny13e.upload.maximum_size=1024
attiny13e.upload.speed=19200
attiny13e.maximum_data_size=64
attiny13e.bootloader.low_fuses=0x7A
attiny13e.bootloader.high_fuses=0xFF
attiny13e.bootloader.path=empty
attiny13e.bootloader.file=empty
attiny13e.bootloader.unlock_bits=0xFF
attiny13e.bootloader.lock_bits=0xFF
attiny13e.build.mcu=attiny13
attiny13e.upload.tool=avrdude
attiny13e.build.f_cpu=9600000L
attiny13e.build.core=core13
attiny13 をプログラミングするとき、ターゲット ボードとして「Attiny 13A スタンドアロン 9.6Mhz」を選択します。
したがって、9.6Mhz で動作することを期待しています。
TCCR0Bレジスタを次のように設定して、「プリスケーリングなし」を取得します
TCCR0B |= _BV(CS00);
TCCR0B &= ~_BV(CS01);
TCCR0B &= ~_BV(CS02);
また、TCCR0A レジスタを変更して、PWM モードを「Fast PWM」に設定します。
TCCR0A |= _BV(WGM00);
TCCR0A |= _BV(WGM01);
TCCR0A &= ~_BV(WGM02);
これらの設定で、9.6Mhz/256 = 37.5 Khz の PWM 周波数が得られるはずです。ただし、PWM の出力を駆動用の MOSFET と LED ストリップに接続すると、MOSFET からブーンという音が聞こえます。
37.5Khz は可聴周波数ではないため、時計が 9.6Mhz で動作していないと考えるようになりました。
そこで、クロック周波数のトピックについて別の簡単な検索を行ったところ、次の Web ページが見つかりました。
https://www.avrprogrammers.com/howto/sysclk-prescaler
間違っていなければ、このページには、私のクロック周波数はデフォルトで 8 分周されていると書かれています。
除数を取得できないようにするには、すべてのビットをリセットする必要があります。
そうして、すべての CLKPS ビットをリセットしました。
CLKPR = (1<<CLKPCE);
CLKPR = (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
したがって、理論的には、除数 1 で 9.6Mhz のクロック周波数が得られるはずです。
前述の設定をすべて使用すると、ブーンという音が聞こえなくなりました。
しかし、今回は別の問題が発生しました。
明るさを制御するためにポテンショメータを使用しています。クロック除数を「1」に設定すると、ポテンショメータの動作が変わりました。ポテンショメータを回してもアナログ入力はすぐに値を読み取らないので、最小輝度を得るためにもう少し回す必要があり、ポテンショメータの反対側に到達する前に最大輝度に達します。だから、ADCに何か問題があると思います。
アナログからデジタルへのコンバーターのタイトルの下に、次の情報が見つかりました。
デフォルトでは、逐次比較回路で最大の分解能を得るには、50 kHz ~ 200 kHz の入力クロック周波数が必要です。10 ビットより低い分解能が必要な場合は、ADC への入力クロック周波数を 200 kHz より高くして、より高いサンプル レートを得ることができます。
したがって、私のクロック周波数は 9.6Mhz で、ADCSRA レジスタのプリスケーラを 9.6Mhz/20Khz= 48 と 9.6Mhz/50Khz = 192 の間に設定する必要があります。ADPS2、ADPS1、および ADPS0 の 3 つのビットすべてを設定する必要がある分周係数 128 を選択しました。
ADCSRA != 1<< ADPS2;
ADCSRA != 1<< ADPS1;
ADCSRA != 1<< ADPS0;
これにより、3 つのビットすべてが設定され、ADC の周波数が 50Khz ~ 200Khz に維持されます。
ただし、ポテンショメータからはまだ同じ動作が得られます。
どこが間違っていますか?