PWMサンプル
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#analog
#norelated
#contents
* PWMサンプル [#z3543dfc]
PWM(パルス幅変調)というAVRに内蔵されている機能を使って、L...
要は、細かいON/OFFを繰り返して、そのON時間を調整すること...
** 回路図 [#ne97aa60]
#ref(PWMTest.png,left,nowrap,PWMサンプル)
基本の回路から増えているのは、PB3から出ている、抵抗とLED...
8bitタイマ0を使ってPWMの出力をする場合には、OC0AかOC0Bの...
なので、8bitタイマ2を使ってOC2AからPWM出力するようにし、...
上の回路図には、ちゃんと書かれてないけど、データシートに...
後で直しておくか……。~
あと、今回追加した抵抗を使用せず、LEDのみを繋げてしまうと...
ちゃんと抵抗はつけるべきですね……。~
実際の動作はこのムービーのような感じ。~
#u2b(V3PKjTetWa8,w=480,h=385)
** ソースコード [#seb357a6]
#include <avr/io.h>
#include <util/delay.h>
void delay_ms( int time )
{
// 指定ms分ループ
while( time-- ){
_delay_ms( 1 );
}
}
int main( void )
{
uint8_t duty = 0; // Duty比 duty/256
int8_t dir = 1; // 増減量
DDRB = 0x08; // PB3を出力に設定
PORTB = 0x00; // ポートBをLowに初期化
OCR2A = duty; // Duty比初期化
TCCR2A = 0b10000011; // 8bit高速PWM動作 比較A出力選択で...
TCCR2B = 0b00000001; // タイマ/カウンタ2入力クロック前...
while(1){
// 0〜255〜0で、512msを1周期とした明滅を繰り返す
delay_ms(1);
if( 0x00 == duty ) dir = 1; // 正方向に増やす(明るく...
if( 0xFF == duty ) dir = -1; // 負方向に増やす(暗くする)
duty += dir;
OCR2A = duty; // Duty比更新
}
return 0;
}
*** 基本動作 [#pb12880e]
今回使用するのは、高速PWM動作という、タイマ/カウンタの機...
0〜255までを繰り返すのこぎり波に、閾値を与えてやって、閾...
この辺りは、図がないと、なかなかわかりにくい。~
#ref(Timing.png,left,nowrap,タイミング)
ソースでは、まず、タイマ/カウンタ比較Aレジスタ(OCR2A)を初...
この値が閾値となり、図の、のこぎり波にかかっている、赤の...
次に、タイマ/カウンタ2制御レジスタAとBを設定し、0〜255ま...
最初の閾値は0なので、のこぎり波の値は常に閾値以上となり、...
クロック自体は前置分周なしとし、のこぎり波1周期にかかる時...
図の1〜6のそれぞれが、while一周分を意味しており、while内...
なので、while分一周でのこぎり波を4つほど生成した後、閾値...
これをどんどん繰り返していくと、1→2→3→4→5→6というように、...
中間の状態では、0.25ms程度の一つののこぎり波の中で、High...
閾値が最大までいったら、今度は閾値を減らしていき、6→5→4→3...
この結果、閾値を0〜255〜0と増減させ、1段階につき1ms程度の...
終了行:
#analog
#norelated
#contents
* PWMサンプル [#z3543dfc]
PWM(パルス幅変調)というAVRに内蔵されている機能を使って、L...
要は、細かいON/OFFを繰り返して、そのON時間を調整すること...
** 回路図 [#ne97aa60]
#ref(PWMTest.png,left,nowrap,PWMサンプル)
基本の回路から増えているのは、PB3から出ている、抵抗とLED...
8bitタイマ0を使ってPWMの出力をする場合には、OC0AかOC0Bの...
なので、8bitタイマ2を使ってOC2AからPWM出力するようにし、...
上の回路図には、ちゃんと書かれてないけど、データシートに...
後で直しておくか……。~
あと、今回追加した抵抗を使用せず、LEDのみを繋げてしまうと...
ちゃんと抵抗はつけるべきですね……。~
実際の動作はこのムービーのような感じ。~
#u2b(V3PKjTetWa8,w=480,h=385)
** ソースコード [#seb357a6]
#include <avr/io.h>
#include <util/delay.h>
void delay_ms( int time )
{
// 指定ms分ループ
while( time-- ){
_delay_ms( 1 );
}
}
int main( void )
{
uint8_t duty = 0; // Duty比 duty/256
int8_t dir = 1; // 増減量
DDRB = 0x08; // PB3を出力に設定
PORTB = 0x00; // ポートBをLowに初期化
OCR2A = duty; // Duty比初期化
TCCR2A = 0b10000011; // 8bit高速PWM動作 比較A出力選択で...
TCCR2B = 0b00000001; // タイマ/カウンタ2入力クロック前...
while(1){
// 0〜255〜0で、512msを1周期とした明滅を繰り返す
delay_ms(1);
if( 0x00 == duty ) dir = 1; // 正方向に増やす(明るく...
if( 0xFF == duty ) dir = -1; // 負方向に増やす(暗くする)
duty += dir;
OCR2A = duty; // Duty比更新
}
return 0;
}
*** 基本動作 [#pb12880e]
今回使用するのは、高速PWM動作という、タイマ/カウンタの機...
0〜255までを繰り返すのこぎり波に、閾値を与えてやって、閾...
この辺りは、図がないと、なかなかわかりにくい。~
#ref(Timing.png,left,nowrap,タイミング)
ソースでは、まず、タイマ/カウンタ比較Aレジスタ(OCR2A)を初...
この値が閾値となり、図の、のこぎり波にかかっている、赤の...
次に、タイマ/カウンタ2制御レジスタAとBを設定し、0〜255ま...
最初の閾値は0なので、のこぎり波の値は常に閾値以上となり、...
クロック自体は前置分周なしとし、のこぎり波1周期にかかる時...
図の1〜6のそれぞれが、while一周分を意味しており、while内...
なので、while分一周でのこぎり波を4つほど生成した後、閾値...
これをどんどん繰り返していくと、1→2→3→4→5→6というように、...
中間の状態では、0.25ms程度の一つののこぎり波の中で、High...
閾値が最大までいったら、今度は閾値を減らしていき、6→5→4→3...
この結果、閾値を0〜255〜0と増減させ、1段階につき1ms程度の...
ページ名: