Download Bahan DisiNI
2. Masukkan Licence nya License Key
3. Jika Ingin menambahkan library external arduino ada di folder
4. setelah selesai tutup aplikasi, Kemudian Buka dan install Update Proteus 8.5 SP0 DEMO to PRO
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
POPULAR POSTS
Training
Contact Form
Categories
- alkes 1
- Android 4
- Arduino 35
- Basic & Doc 12
- centrifuge 1
- ESP32 8
- Internet of Things (IoT) 23
- LCD TFT SPI 2
- MATLAB 6
- Metode kendali 1
- Modul Charger 1
- Nextion 4
- NodeMcu 8
- oled 1
- Pattern Recognition 2
- Pemrograman 2
- Perbaikan 1
- PID 2
- PLC HMI VTSCADA ARDUINO 3
- PRIVACY POLICY 1
- Proteus 11
- Python 1
- raspberry 5
- Teknik Elektromedik 2
- Thingsboard 1
- Video 5
- Wemos 4