PWMを実験

  • 投稿日:
  • 更新日:2009/03/19
  • by
  • カテゴリ:

ATtiny2313の実験回路を作ったので、ちょいと回路を変更してPWM出力をしてみました。

変更はきわめて簡単で、実験回路のPB2/OC0A(14番ピン)をD2から外し、RCAコネクタの信号線(内側)に入れます。 RCAコネクタのもう片方はGNDに接続します。

本体からの入力が1ビット使えなくなってデータが不正確になりますが、この際気にしないことにしましょう。

音質を気にするならローパスフィルタを設けるべきですが、とりあえずこれだけでも音は出ます。 ただ、出力電圧が高いので本当は抵抗を入れたほうがいいでしょうね。

とりあえず8bitカウンタを使ったPWMなのですが、この場合は以下のいずれかになるようです。

  • 周波数一定、デューティ比を変化できる...音質が変化
  • デューティ比一定(50:50)、周波数を変化できる...音程が変化

周波数とデューティ比の両方を可変にするには、16bitカウンタを使う必要があるようです。

なお、デューティ比50:50の出力は、まるでPSGそのものです。 ファミコンのあの独特の音も出せそうですね。

プログラムはこんな感じです(AVR Studioのアセンブラ使用)。

.include  "tn2313def.inc"

.def	regB		= r16
.def	regD		= r17
.def	Temp		= r18
	
.org  0
	rjmp	RESET
	rjmp	0
	in	regB, PINB	; input from PC (bit4, 3, 1, 0)
	in	regD, PIND	; input from PC (bit7, 6, 5)
	andi	regB, 0x1f
	andi	regD, 0x70
	lsl	regD
	or	regB, regD	; regB = input
	out	OCR0A, regB
	reti
RESET:
	;; port setup
	ldi	Temp, 0x1b ; 00011011
	out	PORTB, Temp
	ldi	Temp, 0x74 ; 01110100
	out	PORTD, Temp
	ldi	Temp, (1 << PB2)
	out	DDRB, Temp
	ldi	Temp, 0x00
	out	DDRD, Temp
	;; PWM setup (change here to make duty or frequency controllable)
	ldi	Temp, 0b01000011	; OC1A enable, 8bit PWM
	out	TCCR0A, Temp
	ldi	Temp, 0b00001100	; I/O clk/256, OCR0A=frequency control
	out	TCCR0B, Temp
	;; interrupt setup
	ldi	Temp, (1 << ISC11)
	out	MCUCR, Temp
	ldi	Temp, (1 << INT1)
	out	GIMSK, Temp
	sei
LOOP:
	rjmp	LOOP

ご参考まで。


こちらもよく読まれています