参考:
makezine.com
levitator れヴァテイタ
まず周波数40 kHz、デューティ50%の相補パルスを作る。参考記事は、Nano、タイマー1 (16ビットタイマー)を使っているが、ここでは、素のATmega328P、内蔵8 MHzクロック、タイマー0 (8ビットタイマー)を使うことにする。
80 kHzの頻度で割り込みを発生させ、そのたびに出力をトグルして周波数40 kHz、デューティ50%の相補パルスを作る。出力端子はどこでもよいがPD5、PD6を使った。
#include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t complePulse = (1 << PD6); ISR(TIMER0_COMPA_vect){ PORTD = complePulse; complePulse = ~complePulse; // ポートDの全端子をトグルする。 //complePulse ^= (1 << PD6 | 1 << PD5); // PD6、PD5だけをトグルする。 } int main(){ DDRD |= (1 << PD6 | 1 << PD5); TCCR0A = 1 << WGM01; // CTCモード TCCR0B = 1 << CS00; // 1分周 OCR0A = 99; // コンペア値A TIMSK0 = 1 << OCIE0A; // コンペアマッチA割り込みを有効化 sei(); while(1); return 0; }