割り込みを使ったPWMのLチカをやりましたが,機能として備わっているPWMもやってみることにしました。
でもがっかりしました。簡単過ぎるのです。
analogWrite(PIN番号,DUTY)
これだけで,できてしまうのです。ただ,analogWriteでは,周波数とかの細かい設定はできないようです。
DUTYは最高が0~255まで,指定できるようです。PICだと,設定値をビット演算して,レジスターに書き
込むのでちょっと面倒です。周波数とかの細かい設定をするには,やはりレジスタをいじるようです。
昨日作った割り込みのPWMと備え付け機能のPWMを使い,LEDをだんだん明るくして,だんだん暗くする
というスケッチを書いて動かしてみました。
include<avr/io.h>
#include <avr/interrupt.h>
int k=0;
int BLUE_LED_PIN = 11; // PWM出力させるピン番号を指定
int RED_LED_PIN = 13; //11は備え付け,13は割り込みj
int DUTY = 0;
void setup() {
pinMode(RED_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
TCCR1A = 0;
TCCR1B = 0;
TCCR1B = bit(WGM12) | bit(CS11) | bit(CS10); // CTCモードで分周率64
TIMSK1 = bit(OCIE1A); // 割り込みをタイマー1に設定
//TCCR1B |= (1 << WGM12) | (1 << CS12); //CTCmode //prescaler to 256
OCR1A = 6-1;
//TIMSK1 |= (1 << OCIE1A);
}
ISR (TIMER1_COMPA_vect) {
if(k<255){
k=k+1;
}
else{
k=0;
}
if(k==0){
digitalWrite(RED_LED_PIN, HIGH);
}
if(k==DUTY){
digitalWrite(RED_LED_PIN, LOW);
}
}
void loop() {
while(DUTY<255){//だんだん明るくする
analogWrite(BLUE_LED_PIN, DUTY);
DUTY=DUTY+1;
delay(25);
}
delay(500);
while(DUTY>1){//だんだん暗くする
analogWrite(BLUE_LED_PIN, DUTY);
DUTY=DUTY-1;
delay(25);
}
delay(500);
}
ほぼ同じような動作をしますが,割り込みを使った方は,あるタイミングでちらつきます。どのタイミングで
ちらつくのか分かりませんが,多分,カウント等余分な動作をしているからかなと推測します。
赤のLEDが割り込みでの点滅で,青のLEDが備え付け機能を使った点滅です。