このところ,Arduinoをいじってます。PICに比べると遙かにわかりやすいです。ただ,PICに比べると,細か
な設定等が難しいのが欠点であるといえば欠点ですが。
今回は,ArduinoにもPWMの機能が備わっていますが,この機能を使わずに割り込みで,PWMを簡易的に実現してみました。PWMを実現するには,単純に,端子をLOWとHIGHTに切り替えることができればいいので,通常は,
端子をHIGHT
delay(50)
端子をLOW
みたいにすれば,たやすく実現できます。ただ,このdelay(50)がちょっと気に入らないので,使わないで
実現できないかと考えた訳です。構想としては,TIMER割り込みの回数を数えて,
0回目の割り込み→→端子をHIGHT
n回目の割り込み→→端子をLOW
規定の回数の割り込みで,また,0から数えるLOW
組み込みのPWMでも,レジスターレベルでカウントして,考え方としては,上記のものと同じ考えでやってる
ようです。
arduinoで,やってみました。LEDがだんだん明るくなると次は次第に暗くなるというスケッチを描いてみまし
た。
#include<avr/io.h>
#include <avr/interrupt.h>
int k=0;
int n=0;
void setup() {
pinMode(13, 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 = 11-1;
//TIMSK1 |= (1 << OCIE1A);
}
ISR (TIMER1_COMPA_vect) {
if(k<100){
k=k+1;
}
else{
k=0;
digitalWrite( 13, HIGH);
}
if(k==n){
digitalWrite( 13, LOW);
}
}
void loop() {
while(n<100){//だんだん明るくする
n=n+1;
delay(25);
}
while(n>1){//だんだん暗くする
n=n-1;
delay(25);
}
}
動作している様子です。時々,ちらつきがあります。LEDで動かしていますが,もしかして,これで,モー
ターを制御するとばたついたりするかもしれません。