Dalam posting ini kita akan menghasilkan sinyal gelombang gigi gergaji dan segitiga. Seperti yang Anda lihat di posting ini, dengan arduino kami telah menghasilkan sinyal gelombang sinus . Semua detail tentang PWM dan pengendaliannya akan Anda temukan di artikel sebelumnya.
Sekarang kita hanya akan membahas metode untuk membangkitkan kedua sinyal tersebut.
Contoh pertama:
Sinyal gigi gergaji pada 100Hz.
Sinyal PWM kami memiliki 31372Hz jadi, periode untuk frekuensi ini adalah T1=31,8us. Untuk 100Hz periodenya adalah T2=10ms jadi, T2/T1 =314 pulsa dari sinyal PWM di setiap siganl gigi gergaji pada 100Hz seperti pada gambar di bawah (adalah 31,8us bukan 318us).
float x=0;
int y=0;
void setup() {
Serial.begin(9600);
}
// the loop fungsi berjalan berulang-ulang selamanya
void loop() {
y=x*250; // hitung duty cycle (250 bukan 255 karena akan membantu mematikan //transistor)
delay(100);
//karena duty cycle maksimum adalah 250 berarti nilai maksimum untuk x adalah 1
// untuk sinyal 100Hz kami memiliki peningkatan 1/314 = 0,0031 langkah
x=x+0.0031;// memperbesar sudut
Serial.println(y);// pada monitor serial akan muncul siklus tugas antara 0 dan 90 //derajat
}Hasil Akan ditampilkan pada Serial Monitor
Dari serialprint Anda harus mengambil nilai dari 0 hingga 250 tidak lebih besar dan memasukkannya ke dalam array. Dengan fungsi interupsi, program selanjutnya bergerak dalam array dan meningkatkan siklus kerja untuk setiap pulsa. Programnya adalah:
int i=0;// posisi di vektor mypwm
int m; // mengambil nilai dari vektor
int mypwm[]={0,1,2,3,3,4,5,6,6,7,8,9,10,11,12,13,14,15,16,17,17,18,19,20,20,21,22,23,24,25,26,27,27,28,29,30,31,31,32,
33,34,34,35,36,37,37,38,39,40,41,41,42,43,44,44,45,46,47,48,48,49,50,51,51,52,53,54,55,55,56,57,58,58,59,60,61,61,
62,63,64,65,65,66,67,68,68,69,70,71,72,72,73,74,75,75,76,77,78,79,79,80,81,82,82,83,84,85,86,86,87,88,89,89,90,91,
92,93,93,94,95,96,96,97,98,99,99,100,101,102,103,103,104,105,106,106,107,108,109,110,111,112,113,113,114,115,116,
117,117,118,119,120,120,121,122,123,124,124,125,126,127,127,128,129,130,130,131,132,133,134,135,136,137,137,138,
139,140,141,141,142,143,144,144,145,146,147,148,148,149,150,151,151,152,153,154,154,155,156,157,158,159,160,161,
161,162,163,164,165,165,166,167,168,168,169,170,171,172,172,173,174,175,175,176,177,178,179,179,180,181,182,183,
184,185,185,186,187,188,189,189,190,191,192,192,193,194,195,196,196,197,198,199,199,200,201,202,203,203,204,205,206,
206,207,208,209,210,210,211,212,213,213,214,215,216,216,217,218,219,220,220,221,222,223,223,224,225,226,227,227,228,
229,230,230,231,232,233,234,234,235,236,237,238,239,240,241,242,243,244,244,245,246,247,247,248,249};
// vektor mypwm berisi nilai siklus tugas
void setup() {Serial.begin(9600);
pinMode(5, OUTPUT);
cli();// stop interrupts
TCCR0A=0;
TCCR0B=0;
TCNT0=0;
TCCR0A=0b10100001;// |= (1 << WGM00);//phase correct pwm mode
TCCR0B=0b00000001;// |= (1<< CS00);// //no prescalingTCCR1A=0;
TCCR1B=0;
TCNT1=0;
OCR1A=510;// di sini kami telah menyinkronkan kedua timer (0 dan 1)
//0b izinkan saya menulis bit dalam biner
TCCR1B=0b00001001;// |=(1 << WGM12);
//TCCR1B |= (1 << CS10);//0b00001010;// fara prescaler
TIMSK1 |=(1 << OCIE1A);sei();
}ISR(TIMER1_COMPA_vect){
if(i>(312)){//adalah n-1 karena vektor berindeks nol
i=0; // kami hanya memiliki 313 elemen dalam array karena dengan cara ini kami //memiliki tepat 100.00Hz osiloskop
}
m=mypwm[i];// variabel m mengambil nilai dari vektor
i=i+1; // meningkatkan posisi dalam vektor
OCR0B=m;// pin 5 pada pwm dengan siklus tugas dari vektor
}
void loop() {}
float x=0;
int y=0;
double OK=false;
void setup() {
Serial.begin(9600);
}
// fungsi loop berjalan berulang-ulang selamanya
void loop() {
y=x*250; // hitung duty cycle (250 bukan 255 karena akan membantu mematikan //transistor)
delay(100);
//because the maximum duty cycle is 250 means that maximum value for x is 1
// for a 100Hz signal we have 1/314=0.0031 increasing step
if(x<0.5 &&OK==false){
x=x+0.0031;// increase the angle on the half of the signal
}
if(x>0.5){//middle of the signal
OK=true;
}
if(OK==true){
x=x-0.0031;// decrease the angle on the other half of the signal
}
Serial.println(y);// pada monitor serial akan muncul siklus tugas antara 0 dan 90 //derajat
}
float x=0;
int y=0;
double OK=false;
void setup() {
Serial.begin(9600);
}
// the loop function runs over and over again forever
void loop() {
y=x*250; // calculate duty cycle(250 not 255 because will help to turn off transistors)
delay(100);
//because the maximum duty cycle is 250 means that maximum value for x is 1
// for a 100Hz signal we have 1/314=0.0031 increasing step
if(x<0.5 &&OK==false){
x=x+0.0031;// increase the angle on the half of the signal
}
if(x>0.5){//middle of the signal
OK=true;
}
if(OK==true){
x=x-0.0031;// decrease the angle on the other half of the signal
}
Serial.println(y);// on the serial monitor will appear duty cycles between 0 and 90 deg
}The program for the triangle waves is:
int i=0;// position in mypwm vector
int m; // takes values from vector
int mypwm[]={0,1,2,3,3,4,5,6,6,7,8,9,10,11,12,13,14,15,16,17,17,18,19,20,20,21,22,23,24,25,26,27,27,28,29,30,31,31,32,
33,34,34,35,36,37,37,38,39,40,41,41,42,43,44,44,45,46,47,48,48,49,50,51,51,52,53,54,55,55,56,57,58,58,59,60,61,61,
62,63,64,65,65,66,67,68,68,69,70,71,72,72,73,74,75,75,76,77,78,79,79,80,81,82,82,83,84,85,86,86,87,88,89,89,90,91,
92,93,93,94,95,96,96,97,98,99,99,100,101,102,103,103,104,105,106,106,107,108,109,110,111,112,113,113,114,115,116,
117,117,118,119,120,120,121,122,123,124,124,124,124,123,122,121,120,120,119,118,117,117,116,115,114,113,113,112,111,
110,110,109,108,107,106,106,105,104,103,103,102,101,100,99,99,98,97,96,96,95,94,93,93,92,91,90,89,89,88,87,86,86,85,
84,83,82,82,81,80,79,79,78,77,76,75,75,74,73,72,72,71,70,69,68,68,67,66,65,65,64,63,62,61,61,60,59,58,58,57,56,55,55,
54,53,52,51,51,50,49,48,48,47,46,45,44,44,43,42,41,41,40,39,38,37,37,36,35,34,34,33,32,31,31,30,29,28,27,27,26,25,24,
24,23,22,21,20,20,19,18,17,17,16,15,14,13,13,12,11,10,10,9,8,7,6,6,5,4,3,3,2,1,0};
// mypwm vector contains duty cycle values
void setup() {Serial.begin(9600);
pinMode(5, OUTPUT);
cli();// stop interrupts
TCCR0A=0;
TCCR0B=0;
TCNT0=0;
TCCR0A=0b10100001;// |= (1 << WGM00);//phase correct pwm mode
TCCR0B=0b00000001;// |= (1<< CS00);// //no prescalingTCCR1A=0;
TCCR1B=0;
TCNT1=0;
OCR1A=510;// here we have sincronized both timers (0 and 1)
//0b allow me to write bits in binary
TCCR1B=0b00001001;// |=(1 << WGM12);
//TCCR1B |= (1 << CS10);//0b00001010;// fara prescaler
TIMSK1 |=(1 << OCIE1A);sei();
}ISR(TIMER1_COMPA_vect){
if(i>(312)){// is n-1 because the vector is zero indexed
i=0; // we have only 313 elements in the array because in this way we have
// exactly 100.00Hz oscilloscope
}
m=mypwm[i];// the variable m takes values from vector
i=i+1; // increase the position in vector
OCR0B=m;// pin 5 on pwm with duty cycle from vector
}
void loop() {}
Hasil Akan ditampilkan pada PIN 5
0 Comments